[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[COMMITTED 1/3] poked: change the API of internal error formatting func
From: |
Mohammad-Reza Nabipoor |
Subject: |
[COMMITTED 1/3] poked: change the API of internal error formatting func |
Date: |
Sat, 24 Feb 2024 09:10:09 +0100 |
2024-02-23 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
* poked/usock.c (errorf): Remove.
(usock_errorf): Adapt `errorf' to accept `struct usock *'
to make the buffer usage implicit. Add more comments.
(usock_handle_srv): Replace `errorf' with `usock_errorf'.
(usock_handle_notif): Likewise.
(usock_serve): Likewise.
---
Both to master and maint/poke-4.
ChangeLog | 9 +++++
poked/usock.c | 97 +++++++++++++++++++++++++++------------------------
2 files changed, 60 insertions(+), 46 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 5010d1a4..513baf38 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2024-02-23 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
+
+ * poked/usock.c (errorf): Remove.
+ (usock_errorf): Adapt `errorf' to accept `struct usock *'
+ to make the buffer usage implicit. Add more comments.
+ (usock_handle_srv): Replace `errorf' with `usock_errorf'.
+ (usock_handle_notif): Likewise.
+ (usock_serve): Likewise.
+
2024-02-23 Jose E. Marchesi <jemarch@gnu.org>
* bootstrap.conf (libpoke_modules): Add c-vasprintf and
diff --git a/poked/usock.c b/poked/usock.c
index 822a5382..c2a62a6b 100644
--- a/poked/usock.c
+++ b/poked/usock.c
@@ -128,45 +128,6 @@ write_n_bytes (int fd, unsigned char *data, size_t *len,
size_t cap)
return ret;
}
-//---
-
-static void
-errorf (int errnum, char *buf, size_t bufsz, const char *fmt, ...)
-{
- int n;
- va_list ap;
-
- assert (buf);
- assert (bufsz);
-
- va_start (ap, fmt);
- n = vsnprintf (buf, bufsz, fmt, ap);
- va_end (ap);
-
- assert (n > 0);
- /* Worst case in release build. */
- if (n < 0)
- {
- buf[0] = '\0';
- n = 0;
- }
-
- bufsz -= n;
- buf += n;
-
- if (bufsz < 3)
- return;
- buf[0] = ':';
- buf[1] = ' ';
- buf[2] = '\0';
- bufsz -= 2;
- buf += 2;
-
- strerror_r (errnum, buf, bufsz);
-}
-
-//---
-
// CHKME proper use
#define USOCK_DIR_UNK 0
#define USOCK_DIR_IN 1
@@ -383,6 +344,52 @@ struct usock
char errbuf[USOCK_ERRBUF_SIZE];
};
+/* Format an error message in internal error buffer `usock->errbuf'.
+
+ First put printf-like formatted message in the buffer, and then
+ append an error message describing provided error number `errnum'. */
+
+static void
+usock_errorf (struct usock *usock, int errnum, const char *fmt, ...)
+{
+ int n;
+ va_list ap;
+ char *buf;
+ size_t bufsz;
+
+ assert (usock);
+ assert (fmt);
+
+ buf = usock->errbuf;
+ bufsz = USOCK_ERRBUF_SIZE;
+
+ va_start (ap, fmt);
+ n = vsnprintf (buf, bufsz, fmt, ap);
+ va_end (ap);
+
+ if (n < 0)
+ {
+ buf[0] = buf[1] = buf[2] = '?';
+ buf[3] = '\0';
+ n = 3;
+ }
+
+ /* Available space is `bufsz' bytes from `buf'. */
+ bufsz -= n;
+ buf += n;
+
+ /* Append ": " string and narrow the buffer. */
+ if (bufsz < 3)
+ return;
+ buf[0] = ':';
+ buf[1] = ' ';
+ buf[2] = '\0';
+ bufsz -= 2;
+ buf += 2;
+
+ strerror_r (errnum, buf, bufsz);
+}
+
#define USOCK_HANDLE_SRV_OK 0
#define USOCK_HANDLE_SRV_NOK -1
@@ -405,8 +412,7 @@ usock_handle_srv (struct usock *u, struct pollfd *pfds)
break;
if (errno == EINTR)
continue;
- errorf (errno, u->errbuf, USOCK_ERRBUF_SIZE, "[%s] accept() failed",
- __func__);
+ usock_errorf (u, errno, "[%s] accept() failed", __func__);
return USOCK_HANDLE_SRV_NOK;
}
if (u->nclients == USOCK_CLIENTS_MAX)
@@ -417,8 +423,8 @@ usock_handle_srv (struct usock *u, struct pollfd *pfds)
}
if (fcntl (fd, F_SETFL, O_NONBLOCK) == -1)
{
- errorf (errno, u->errbuf, USOCK_ERRBUF_SIZE,
- "[%s] fcntl(%d, O_NONBLOCK) failed", __func__, fd);
+ usock_errorf (u, errno, "[%s] fcntl(%d, O_NONBLOCK) failed",
+ __func__, fd);
return USOCK_HANDLE_SRV_NOK;
}
c = &u->clients[u->nclients];
@@ -460,8 +466,7 @@ usock_handle_notif (struct usock *u, struct pollfd *pfds)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)
break;
- errorf (errno, u->errbuf, USOCK_ERRBUF_SIZE,
- "read(pipefd[0]) failed");
+ usock_errorf (u, errno, "read(pipefd[0]) failed");
return USOCK_HANDLE_NOTIF_NOK;
}
}
@@ -610,7 +615,7 @@ usock_serve (struct usock *u)
{
if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
continue;
- errorf (errno, u->errbuf, USOCK_ERRBUF_SIZE, "poll() failed");
+ usock_errorf (u, errno, "poll() failed");
ret = USOCK_SERVE_NOK;
break;
}
--
2.43.2
- [COMMITTED 1/3] poked: change the API of internal error formatting func,
Mohammad-Reza Nabipoor <=