poke-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]