void bridge_rules(const char *ifname, int d) { char *inbuf = NULL, *inb; struct ifbrlconf ifc; struct ifbrlreq *ifrp; int len = 8192, i; while (1) { ifc.ifbrl_len = len; inb = realloc(inbuf, len); if (inb == NULL) err(1, "malloc"); ifc.ifbrl_buf = inbuf = inb; strlcpy(ifc.ifbrl_name, name, sizeof(ifc.ifbrl_name)); strlcpy(ifc.ifbrl_ifsname, ifname, sizeof(ifc.ifbrl_ifsname)); if (ioctl(s, SIOCBRDGGRL, &ifc) < 0) err(1, "ioctl(SIOCBRDGGRL)"); if (ifc.ifbrl_len + sizeof(*ifrp) < len) break; len *= 2; } ifrp = ifc.ifbrl_req; for (i = 0; i < ifc.ifbrl_len; i += sizeof(*ifrp)) { ifrp = (struct ifbrlreq *)((caddr_t)ifc.ifbrl_req + i); bridge_showrule(ifrp); } }
int bridge_rules(int s, char *brdg, char *ifname, char *delim, FILE *output) { char *inbuf = NULL, *inb; struct ifbrlconf ifc; struct ifbrlreq *ifrp, ifreq; u_int i, len = 8192; while (1) { ifc.ifbrl_len = len; inb = realloc(inbuf, len); if (inb == NULL) { free(inbuf); printf("%% bridge_rules: malloc: %s\n", strerror(errno)); return(0); } ifc.ifbrl_buf = inbuf = inb; strlcpy(ifc.ifbrl_name, brdg, sizeof(ifc.ifbrl_name)); strlcpy(ifc.ifbrl_ifsname, ifname, sizeof(ifc.ifbrl_ifsname)); errno = 0; if (ioctl(s, SIOCBRDGGRL, &ifc) < 0) { if (errno != ESRCH) /* invalid interface name spec'd */ printf("%% bridge_rules: SIOCBRDGGRL: %s\n", strerror(errno)); free(inbuf); return(0); } if (ifc.ifbrl_len + sizeof(ifreq) < len) break; len *= 2; } for (i = 0; i < ifc.ifbrl_len; i += sizeof(ifreq)) { ifrp = (struct ifbrlreq *)((caddr_t)ifc.ifbrl_req + i); bridge_showrule(ifrp, delim, output); } free(inbuf); return (0); }