diff options
Diffstat (limited to 'usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c')
-rw-r--r-- | usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c index 0e40bcfb843e..f0f9e0f0e149 100644 --- a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c +++ b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c @@ -1298,10 +1298,27 @@ pfs_refresh(void) } static int +pft_add_tstats(const struct pfr_tstats *t, void *arg) +{ + struct pft_entry *e; + int *index = arg; + + e = malloc(sizeof(struct pft_entry)); + if (e == NULL) + return (ENOMEM); + + e->index = (*index) + 1; + (*index)++; + memcpy(&e->pft, t, sizeof(struct pfr_tstats)); + TAILQ_INSERT_TAIL(&pft_table, e, link); + + return (0); +} + +static int pft_refresh(void) { - struct pfioc_table io; - struct pfr_tstats *t = NULL; + struct pfr_table filter; struct pft_entry *e; int i, numtbls = 1; @@ -1314,45 +1331,18 @@ pft_refresh(void) free(e); } - bzero(&io, sizeof(io)); - io.pfrio_esize = sizeof(struct pfr_tstats); - - for (;;) { - t = reallocf(t, numtbls * sizeof(struct pfr_tstats)); - if (t == NULL) { - syslog(LOG_ERR, "pft_refresh(): reallocf() numtbls=%d: %s", - numtbls, strerror(errno)); - goto err2; - } - io.pfrio_size = numtbls; - io.pfrio_buffer = t; + bzero(&filter, sizeof(filter)); - if (ioctl(pfctl_fd(pfh), DIOCRGETTSTATS, &io)) { - syslog(LOG_ERR, "pft_refresh(): ioctl(): %s", - strerror(errno)); - goto err2; - } - - if (numtbls >= io.pfrio_size) - break; - - numtbls = io.pfrio_size; - } - - for (i = 0; i < numtbls; i++) { - e = malloc(sizeof(struct pft_entry)); - if (e == NULL) - goto err1; - e->index = i + 1; - memcpy(&e->pft, t+i, sizeof(struct pfr_tstats)); - TAILQ_INSERT_TAIL(&pft_table, e, link); + if (pfctl_get_tstats(pfh, &filter, pft_add_tstats, &i)) { + syslog(LOG_ERR, "pft_refresh(): pfctl_get_tstats(): %s", + strerror(errno)); + goto err1; } pft_table_age = time(NULL); pft_table_count = numtbls; pf_tick = this_tick; - free(t); return (0); err1: while (!TAILQ_EMPTY(&pft_table)) { @@ -1360,8 +1350,6 @@ err1: TAILQ_REMOVE(&pft_table, e, link); free(e); } -err2: - free(t); return(-1); } |