X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/yaid/blobdiff_plain/3b1bed1dc06df72338b0ff180169525681c114d0..b093b41dbcc935a6adc424643809663c565d6e51:/linux.c diff --git a/linux.c b/linux.c index 15db30b..4954cf9 100644 --- a/linux.c +++ b/linux.c @@ -30,6 +30,10 @@ /*----- Static variables --------------------------------------------------*/ +static FILE *natfp; + +/*----- Address-type operations -------------------------------------------*/ + struct addrops_sys { const char *procfile; int (*parseaddr)(char **, union addr *); @@ -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 -------------------------------------------------*/