From b9c20cecab7cd55fa40ca2f78fd71aed9d45c1c4 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Thu, 15 May 2014 23:27:51 +0200 Subject: [PATCH] miniupnpd/pf/pfpinhole.c: use label to store pinhole description --- miniupnpd/pf/pfpinhole.c | 18 +++++++++++++----- miniupnpd/pf/testpfpinhole.c | 12 ++++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/miniupnpd/pf/pfpinhole.c b/miniupnpd/pf/pfpinhole.c index 0b0bb85..aa5d953 100644 --- a/miniupnpd/pf/pfpinhole.c +++ b/miniupnpd/pf/pfpinhole.c @@ -1,4 +1,4 @@ -/* $Id: pfpinhole.c,v 1.19 2012/05/21 15:47:57 nanard Exp $ */ +/* $Id: pfpinhole.c,v 1.22 2014/05/15 21:23:43 nanard Exp $ */ /* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * (c) 2012 Thomas Bernard @@ -49,7 +49,8 @@ extern int dev; static int next_uid = 1; -#define PINEHOLE_LABEL_FORMAT "pinhole-%d ts-%u" +#define PINEHOLE_LABEL_FORMAT "pinhole-%d ts-%u: %s" +#define PINEHOLE_LABEL_FORMAT_SKIPDESC "pinhole-%d ts-%u: %*s" int add_pinhole(const char * ifname, const char * rem_host, unsigned short rem_port, @@ -108,7 +109,7 @@ int add_pinhole(const char * ifname, pcr.rule.keep_state = 1; uid = next_uid; snprintf(pcr.rule.label, PF_RULE_LABEL_SIZE, - PINEHOLE_LABEL_FORMAT, uid, timestamp); + PINEHOLE_LABEL_FORMAT, uid, timestamp, desc); if(queue) strlcpy(pcr.rule.qname, queue, PF_QNAME_SIZE); if(tag) @@ -224,7 +225,6 @@ get_pinhole_info(unsigned short uid, syslog(LOG_ERR, "pf device is not open"); return -1; } - if (desc) *desc = 0; /* XXX - use label for storing it? */ snprintf(label_start, sizeof(label_start), "pinhole-%hu", uid); memset(&pr, 0, sizeof(pr)); @@ -261,6 +261,14 @@ get_pinhole_info(unsigned short uid, *proto = pr.rule.proto; if(timestamp) sscanf(p, "ts-%u", timestamp); + if(desc) { + strsep(&p, " "); + if(p) { + strlcpy(desc, p, desclen); + } else { + desc[0] = '\0'; + } + } #ifdef PFRULE_INOUT_COUNTS if(packets) *packets = pr.rule.packets[0] + pr.rule.packets[1]; @@ -322,7 +330,7 @@ int clean_pinhole_list(unsigned int * next_timestamp) syslog(LOG_ERR, "ioctl(dev, DIOCGETRULE): %m"); return -1; } - if(sscanf(pr.rule.label, PINEHOLE_LABEL_FORMAT, &uid, &ts) != 2) { + if(sscanf(pr.rule.label, PINEHOLE_LABEL_FORMAT_SKIPDESC, &uid, &ts) != 2) { syslog(LOG_INFO, "rule with label '%s' is not a IGD pinhole", pr.rule.label); continue; } diff --git a/miniupnpd/pf/testpfpinhole.c b/miniupnpd/pf/testpfpinhole.c index ec754e2..bb0e0e6 100644 --- a/miniupnpd/pf/testpfpinhole.c +++ b/miniupnpd/pf/testpfpinhole.c @@ -1,4 +1,4 @@ -/* $Id: testpfpinhole.c,v 1.11 2014/02/28 16:49:15 nanard Exp $ */ +/* $Id: testpfpinhole.c,v 1.12 2014/05/15 21:23:43 nanard Exp $ */ /* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * (c) 2012-2014 Thomas Bernard @@ -32,11 +32,14 @@ static int print_pinhole(int uid) int proto; unsigned int timestamp; u_int64_t packets, bytes; + char desc[64]; r = get_pinhole_info((unsigned short)uid, rem_host, sizeof(rem_host), &rem_port, int_client, sizeof(int_client), &int_port, - &proto, ×tamp, + &proto, + desc, sizeof(desc), + ×tamp, &packets, &bytes); if(r < 0) { fprintf(stderr, "get_pinhole(%d) returned %d\n", uid, r); @@ -44,6 +47,7 @@ static int print_pinhole(int uid) printf("pinhole %d : [%s]:%hu => [%s]:%hu proto=%d ts=%u\n", uid, rem_host, rem_port, int_client, int_port, proto, timestamp); + printf(" desc='%s'\n", desc); printf(" packets=%llu bytes=%llu\n", packets, bytes); } return r; @@ -65,12 +69,12 @@ int main(int argc, char * *argv) return 1; } - uid = add_pinhole("ep0", "2001::1:2:3", 12345, "123::ff", 54321, IPPROTO_UDP, 424242); + uid = add_pinhole("ep0", "2001::1:2:3", 12345, "123::ff", 54321, IPPROTO_UDP, "description test 1", 424242); if(uid < 0) { fprintf(stderr, "add_pinhole() failed\n"); } printf("add_pinhole() returned %d\n", uid); - uid = add_pinhole("ep0", NULL, 0, "dead:beef::42:42", 8080, IPPROTO_UDP, 4321000); + uid = add_pinhole("ep0", NULL, 0, "dead:beef::42:42", 8080, IPPROTO_UDP, "description test 2", 4321000); if(uid < 0) { fprintf(stderr, "add_pinhole() failed\n"); }