int add_to_ipset(const char *setname, const struct all_addr *ipaddr, int flags, int remove) { struct pfr_addr addr; struct pfioc_table io; struct pfr_table table; int n = 0, rc = 0; if ( dev == -1 ) { my_syslog(LOG_ERR, _("warning: no opened pf devices %s"), pf_device); return -1; } bzero(&table, sizeof(struct pfr_table)); table.pfrt_flags |= PFR_TFLAG_PERSIST; if ( strlen(setname) >= PF_TABLE_NAME_SIZE ) { my_syslog(LOG_ERR, _("error: cannot use table name %s"), setname); errno = ENAMETOOLONG; return -1; } if ( strlcpy(table.pfrt_name, setname, sizeof(table.pfrt_name)) >= sizeof(table.pfrt_name)) { my_syslog(LOG_ERR, _("error: cannot strlcpy table name %s"), setname); return -1; } if ((rc = pfr_add_tables(&table, 1, &n, 0))) { my_syslog(LOG_WARNING, _("warning: pfr_add_tables: %s(%d)"), pfr_strerror(errno),rc); return -1; } table.pfrt_flags &= ~PFR_TFLAG_PERSIST; if (n) my_syslog(LOG_INFO, _("info: table created")); fill_addr(ipaddr,flags,&addr); bzero(&io, sizeof(io)); io.pfrio_flags = 0; io.pfrio_table = table; io.pfrio_buffer = &addr; io.pfrio_esize = sizeof(addr); io.pfrio_size = 1; if (ioctl(dev, ( remove ? DIOCRDELADDRS : DIOCRADDADDRS ), &io)) { my_syslog(LOG_WARNING, _("warning: DIOCR%sADDRS: %s"), ( remove ? "DEL" : "ADD" ), pfr_strerror(errno)); return -1; } my_syslog(LOG_INFO, _("%d addresses %s"), io.pfrio_nadd, ( remove ? "removed" : "added" )); return io.pfrio_nadd; }
int add_to_ipset(const char *setname, const struct all_addr *ipaddr, int flags, int remove) { struct pfr_addr addr; struct pfioc_table io; struct pfr_table table; if (dev == -1) { my_syslog(LOG_ERR, _("warning: no opened pf devices %s"), pf_device); return -1; } bzero(&table, sizeof(struct pfr_table)); table.pfrt_flags |= PFR_TFLAG_PERSIST; if (strlen(setname) >= PF_TABLE_NAME_SIZE) { my_syslog(LOG_ERR, _("error: cannot use table name %s"), setname); errno = ENAMETOOLONG; return -1; } if (strlcpy(table.pfrt_name, setname, sizeof(table.pfrt_name)) >= sizeof(table.pfrt_name)) { my_syslog(LOG_ERR, _("error: cannot strlcpy table name %s"), setname); return -1; } bzero(&io, sizeof io); io.pfrio_flags = 0; io.pfrio_buffer = &table; io.pfrio_esize = sizeof(table); io.pfrio_size = 1; if (ioctl(dev, DIOCRADDTABLES, &io)) { my_syslog(LOG_WARNING, _("IPset: error:%s"), pfr_strerror(errno)); return -1; } table.pfrt_flags &= ~PFR_TFLAG_PERSIST; if (io.pfrio_nadd) my_syslog(LOG_INFO, _("info: table created")); bzero(&addr, sizeof(addr)); #ifdef HAVE_IPV6 if (flags & F_IPV6) { addr.pfra_af = AF_INET6; addr.pfra_net = 0x80; memcpy(&(addr.pfra_ip6addr), &(ipaddr->addr), sizeof(struct in6_addr)); } else #endif { addr.pfra_af = AF_INET; addr.pfra_net = 0x20; addr.pfra_ip4addr.s_addr = ipaddr->addr.addr4.s_addr; } bzero(&io, sizeof(io)); io.pfrio_flags = 0; io.pfrio_table = table; io.pfrio_buffer = &addr; io.pfrio_esize = sizeof(addr); io.pfrio_size = 1; if (ioctl(dev, ( remove ? DIOCRDELADDRS : DIOCRADDADDRS ), &io)) { my_syslog(LOG_WARNING, _("warning: DIOCR%sADDRS: %s"), ( remove ? "DEL" : "ADD" ), pfr_strerror(errno)); return -1; } my_syslog(LOG_INFO, _("%d addresses %s"), io.pfrio_nadd, ( remove ? "removed" : "added" )); return io.pfrio_nadd; }