about summary refs log tree commit homepage
path: root/http_put.c
diff options
context:
space:
mode:
Diffstat (limited to 'http_put.c')
-rw-r--r--http_put.c48
1 files changed, 16 insertions, 32 deletions
diff --git a/http_put.c b/http_put.c
index f53a579..a27d389 100644
--- a/http_put.c
+++ b/http_put.c
@@ -440,42 +440,25 @@ static unsigned last_data_recv(int fd)
 
 MOG_NOINLINE static void read_err_dbg(struct mog_fd *mfd, ssize_t r)
 {
+        static const char no_ip[] = "(unconnected)";
+        int save_errno = errno;
         union mog_sockaddr any;
-        char addrbuf[MOG_NI_MAXHOST];
-        char portbuf[MOG_NI_MAXSERV];
+        struct mog_ni ni;
         const char *addr;
-        static const char no_ip[] = "unconnected";
         const char *path = "(unknown)";
         long long bytes = -1;
         const char *errfmt;
-        unsigned last;
+        socklen_t len = (socklen_t)sizeof(any);
+        unsigned last = last_data_recv(mfd->fd);
+        int rc = getpeername(mfd->fd, mog_sockaddr_sa(&any), &len);
 
-        PRESERVE_ERRNO(last = last_data_recv(mfd->fd));
-
-        portbuf[0] = 0;
-        PRESERVE_ERRNO(do {
-                socklen_t len = (socklen_t)sizeof(any);
-                socklen_t addrlen = (socklen_t)sizeof(addrbuf);
-                socklen_t portlen = (socklen_t)(sizeof(portbuf));
-                int rc = getpeername(mfd->fd, mog_sockaddr_sa(&any), &len);
-
-                if (rc == 0) {
-                        rc = getnameinfo(mog_sockaddr_sa(&any), len,
-                                         addrbuf, addrlen,
-                                         portbuf + 1, portlen - 1,
-                                         NI_NUMERICHOST|NI_NUMERICSERV);
-                        if (rc == 0) {
-                                addr = addrbuf;
-                                portbuf[0] = ':';
-                        } else {
-                                addr = gai_strerror(rc);
-                        }
-                } else {
-                        syslog(LOG_ERR, "getpeername() failed for fd=%d: %m",
-                               mfd->fd);
-                        addr = no_ip;
-                }
-        } while (0));
+        if (rc == 0) {
+                rc = mog_nameinfo(&any, len, &ni);
+                addr = rc == 0 ? ni.ni_host : gai_strerror(rc);
+        } else {
+                syslog(LOG_ERR, "getpeername() failed for fd=%d: %m", mfd->fd);
+                addr = no_ip;
+        }
 
         if (mfd->as.http.forward) {
                 path = mfd->as.http.forward->as.file.path;
@@ -485,11 +468,12 @@ MOG_NOINLINE static void read_err_dbg(struct mog_fd *mfd, ssize_t r)
 #define PFX "PUT %s failed from %s%s after %lld bytes: "
         errfmt = (r == 0) ? PFX"premature EOF" : PFX"%m";
 #undef PFX
-        syslog(LOG_ERR, errfmt, path, addr, portbuf, bytes);
+        errno = save_errno;
+        syslog(LOG_ERR, errfmt, path, addr, ni.ni_serv, bytes);
 
         if (last != (unsigned)-1)
                 syslog(LOG_ERR, "last_data_recv=%ums from %s%s for PUT %s",
-                       last, addr, portbuf, path);
+                       last, addr, ni.ni_serv, path);
 }
 
 static enum mog_next identity_put_in_progress(struct mog_fd *mfd)