chiark / gitweb /
noip.c (unix_socket_status): Return whether anyone's listening.
[preload-hacks] / noip.c
diff --git a/noip.c b/noip.c
index fea6f742adaac68c2299016c9857b3b31e1c0630..45ed9a5f40e94823da87aa82c93c426ed7432c2c 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))