linux.c: Mark `get_default_gw' as static.
[yaid] / linux.c
diff --git a/linux.c b/linux.c
index 15db30b..b0db5f1 100644 (file)
--- a/linux.c
+++ b/linux.c
 
 /*----- Static variables --------------------------------------------------*/
 
+static FILE *natfp;
+
+/*----- Address-type operations -------------------------------------------*/
+
 struct addrops_sys {
   const char *procfile;
   int (*parseaddr)(char **, union addr *);
@@ -74,7 +78,7 @@ ADDRTYPES(DEFOPSYS)
 
 /*----- Main code ---------------------------------------------------------*/
 
-int get_default_gw(int af, union addr *a)
+static int get_default_gw(int af, union addr *a)
 {
   int fd;
   char buf[32768];
@@ -238,27 +242,17 @@ void identify(struct query *q)
   }
 
   if (ferror(fp)) {
-    logmsg(q, LOG_ERR, "failed to read connection table: %s",
-          strerror(errno));
+    logmsg(q, LOG_ERR, "failed to read connection table `%s': %s",
+          q->ao->sys->procfile, strerror(errno));
     goto err_unk;
   }
 
-  if (q->ao->af == AF_INET) {
-    fclose(fp);
-    if ((fp = fopen("/proc/net/ip_conntrack", "r")) == 0) {
-      if (errno == ENOENT)
-       goto err_nouser;
-      else {
-       logmsg(q, LOG_ERR,
-              "failed to open `/proc/net/ip_conntrack' for reading: %s",
-              strerror(errno));
-       goto err_unk;
-      }
-    }
+  if (natfp && q->ao->af == AF_INET) {
+    rewind(natfp);
 
     for (;;) {
       DRESET(&d);
-      if (dstr_putline(&d, fp) == EOF) break;
+      if (dstr_putline(&d, natfp) == EOF) break;
       pp = d.buf;
       NEXTFIELD; if (!*p) break;
       if (strcmp(p, "tcp") != 0) continue;
@@ -319,17 +313,16 @@ void identify(struct query *q)
       goto done;
     }
 
-    if (ferror(fp)) {
+    if (ferror(natfp)) {
       logmsg(q, LOG_ERR, "failed to read `/proc/net/ip_conntrack': %s",
             strerror(errno));
       goto err_unk;
     }
-    logmsg(q, LOG_ERR, "connection not found");
   }
 
 #undef NEXTFIELD
 
-err_nouser:
+  logmsg(q, LOG_NOTICE, "connection not found");
   q->resp = R_ERROR;
   q->u.error = E_NOUSER;
   goto done;
@@ -341,4 +334,13 @@ done:
   if (fp) fclose(fp);
 }
 
+void init_sys(void)
+{
+  if ((natfp = fopen("/proc/net/ip_conntrack", "r")) == 0 &&
+      errno != ENOENT) {
+    die(1, "failed to open `/proc/net/ip_conntrack' for reading: %s",
+       strerror(errno));
+  }
+}
+
 /*----- That's all, folks -------------------------------------------------*/