noip.c (unix_socket_status): Return whether anyone's listening.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 9 Jun 2018 14:54:35 +0000 (15:54 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 9 Jun 2018 14:58:23 +0000 (15:58 +0100)
Add a new `LISTEN' flag which says whether anyone's listening on the
socket.  Maybe the listener has gone away and we can only see the
leftover connections.

noip.c

diff --git a/noip.c b/noip.c
index fea6f74..45ed9a5 100644 (file)
--- a/noip.c
+++ b/noip.c
@@ -63,6 +63,7 @@
 #define UNUSED 0u                      /* No sign of anyone using it */
 #define STALE 1u                       /* Socket exists, but is abandoned */
 #define USED 16u                       /* Socket is in active use */
+#define LISTEN 2u                      /* Socket has an active listener */
 
 enum { DENY, ALLOW };                  /* ACL verdicts */
 
@@ -680,6 +681,7 @@ static int unix_socket_status(struct sockaddr_un *sun, int quickp)
   FILE *fp = 0;
   size_t len, n;
   int rc;
+  unsigned long f;
   char buf[256];
 
   /* If we can't find the socket node, then it's definitely not in use.  If
@@ -710,6 +712,8 @@ static int unix_socket_status(struct sockaddr_un *sun, int quickp)
     if (n >= len + 2 && buf[n - len - 2] == ' ' && buf[n - 1] == '\n' &&
        memcmp(buf + n - len - 1, sun->sun_path, len) == 0) {
       rc |= USED;
+      if (sscanf(buf, "%*s %*x %*x %lx", &f) < 0 || (f&0x00010000))
+       rc |= LISTEN;
     }
   }
   if (ferror(fp))