On Fri, May 27, 2011 at 11:11:37AM +0200, Michal Mazurek wrote: > Add listening on interface groups for dhcpd, from gilles@' smtpd.
the dhcpd bit is interesting. > Add static to is_if_in_group in smtpd and relayd. i normally don't use static functions in relayd. > Fix whitespaces in is_if_in_group in smtpd and relayd. > please also don't send diffs as simple as whitespace/knf to the lists; this is done by hackers occasionally when we are bored or need to keep up our commit rate... > I didn't write a diff for dhcpd's manpage. > you should write a new diff for dhcpd only that also includes the manpage bits. reyk > > Index: dhcpd/dispatch.c > =================================================================== > RCS file: /cvs/src/usr.sbin/dhcpd/dispatch.c,v > retrieving revision 1.28 > diff -u -r1.28 dispatch.c > --- dhcpd/dispatch.c 19 Nov 2010 08:00:56 -0000 1.28 > +++ dhcpd/dispatch.c 27 May 2011 09:06:32 -0000 > @@ -40,6 +40,7 @@ > > #include "dhcpd.h" > #include "sync.h" > +#include <err.h> > #include <ifaddrs.h> > #include <sys/ioctl.h> > #include <poll.h> > @@ -57,6 +58,7 @@ > > static int interface_status(struct interface_info *ifinfo); > int get_rdomain(char *); > +static int is_if_in_group(const char *, const char *); > > /* Use getifaddrs() to get a list of all the attached interfaces. > For each interface that's of type INET and not the loopback interface, > @@ -104,7 +106,8 @@ > > /* See if we've seen an interface that matches this one. */ > for (tmp = interfaces; tmp; tmp = tmp->next) > - if (!strcmp(tmp->name, ifa->ifa_name)) > + if (!strcmp(ifa->ifa_name, tmp->name) > + || is_if_in_group(ifa->ifa_name, tmp->name)) > break; > > /* If we are looking for specific interfaces, ignore others. */ > @@ -639,4 +642,48 @@ > > close(s); > return rv; > +} > + > +static int > +is_if_in_group(const char *ifname, const char *groupname) > +{ > + unsigned int len; > + struct ifgroupreq ifgr; > + struct ifg_req *ifg; > + int s; > + int ret = 0; > + > + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) > + err(1, "socket"); > + > + memset(&ifgr, 0, sizeof(ifgr)); > + strlcpy(ifgr.ifgr_name, ifname, IFNAMSIZ); > + if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) { > + if (errno == EINVAL || errno == ENOTTY) > + goto end; > + err(1, "SIOCGIFGROUP"); > + } > + > + len = ifgr.ifgr_len; > + ifgr.ifgr_groups = > + (struct ifg_req *)calloc(len / sizeof(struct ifg_req), > + sizeof(struct ifg_req)); > + if (ifgr.ifgr_groups == NULL) > + err(1, "getifgroups"); > + if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) > + err(1, "SIOCGIFGROUP"); > + > + ifg = ifgr.ifgr_groups; > + for (; ifg && len >= sizeof(struct ifg_req); ifg++) { > + len -= sizeof(struct ifg_req); > + if (strcmp(ifg->ifgrq_group, groupname) == 0) { > + ret = 1; > + break; > + } > + } > + free(ifgr.ifgr_groups); > + > +end: > + close(s); > + return (ret); > } > Index: relayd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/parse.y,v > retrieving revision 1.158 > diff -u -r1.158 parse.y > --- relayd/parse.y 26 May 2011 14:48:20 -0000 1.158 > +++ relayd/parse.y 27 May 2011 09:06:43 -0000 > @@ -122,7 +122,7 @@ > struct table *table_inherit(struct table *); > struct relay *relay_inherit(struct relay *, struct relay *); > int getservice(char *); > -int is_if_in_group(const char *, const char *); > +static int is_if_in_group(const char *, const char *); > > typedef struct { > union { > @@ -2570,7 +2570,7 @@ > nextaf: > for (p = ifap; p != NULL && cnt < max; p = p->ifa_next) { > if (p->ifa_addr->sa_family != af || > - (strcmp(s, p->ifa_name) != 0 && > + (strcmp(p->ifa_name, s) != 0 && > !is_if_in_group(p->ifa_name, s))) > continue; > if ((h = calloc(1, sizeof(*h))) == NULL) > @@ -2807,44 +2807,44 @@ > return (htons((u_short)llval)); > } > > -int > +static int > is_if_in_group(const char *ifname, const char *groupname) > { > - unsigned int len; > - struct ifgroupreq ifgr; > - struct ifg_req *ifg; > + unsigned int len; > + struct ifgroupreq ifgr; > + struct ifg_req *ifg; > int s; > int ret = 0; > > if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) > err(1, "socket"); > > - memset(&ifgr, 0, sizeof(ifgr)); > - strlcpy(ifgr.ifgr_name, ifname, IFNAMSIZ); > - if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) { > - if (errno == EINVAL || errno == ENOTTY) > + memset(&ifgr, 0, sizeof(ifgr)); > + strlcpy(ifgr.ifgr_name, ifname, IFNAMSIZ); > + if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) { > + if (errno == EINVAL || errno == ENOTTY) > goto end; > err(1, "SIOCGIFGROUP"); > - } > + } > > - len = ifgr.ifgr_len; > - ifgr.ifgr_groups = > - (struct ifg_req *)calloc(len / sizeof(struct ifg_req), > + len = ifgr.ifgr_len; > + ifgr.ifgr_groups = > + (struct ifg_req *)calloc(len / sizeof(struct ifg_req), > sizeof(struct ifg_req)); > - if (ifgr.ifgr_groups == NULL) > - err(1, "getifgroups"); > - if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) > - err(1, "SIOCGIFGROUP"); > - > - ifg = ifgr.ifgr_groups; > - for (; ifg && len >= sizeof(struct ifg_req); ifg++) { > - len -= sizeof(struct ifg_req); > + if (ifgr.ifgr_groups == NULL) > + err(1, "getifgroups"); > + if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) > + err(1, "SIOCGIFGROUP"); > + > + ifg = ifgr.ifgr_groups; > + for (; ifg && len >= sizeof(struct ifg_req); ifg++) { > + len -= sizeof(struct ifg_req); > if (strcmp(ifg->ifgrq_group, groupname) == 0) { > ret = 1; > break; > } > - } > - free(ifgr.ifgr_groups); > + } > + free(ifgr.ifgr_groups); > > end: > close(s); > Index: smtpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/smtpd/parse.y,v > retrieving revision 1.75 > diff -u -r1.75 parse.y > --- smtpd/parse.y 22 May 2011 21:03:14 -0000 1.75 > +++ smtpd/parse.y 27 May 2011 09:06:45 -0000 > @@ -101,7 +101,7 @@ > struct listenerlist *, int, in_port_t, u_int8_t); > void set_localaddrs(void); > int delaytonum(char *); > -int is_if_in_group(const char *, const char *); > +static int is_if_in_group(const char *, const char *); > > typedef struct { > union { > @@ -1963,44 +1963,44 @@ > return (-1); > } > > -int > +static int > is_if_in_group(const char *ifname, const char *groupname) > { > - unsigned int len; > - struct ifgroupreq ifgr; > - struct ifg_req *ifg; > + unsigned int len; > + struct ifgroupreq ifgr; > + struct ifg_req *ifg; > int s; > int ret = 0; > > if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) > err(1, "socket"); > > - memset(&ifgr, 0, sizeof(ifgr)); > - strlcpy(ifgr.ifgr_name, ifname, IFNAMSIZ); > - if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) { > - if (errno == EINVAL || errno == ENOTTY) > + memset(&ifgr, 0, sizeof(ifgr)); > + strlcpy(ifgr.ifgr_name, ifname, IFNAMSIZ); > + if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) { > + if (errno == EINVAL || errno == ENOTTY) > goto end; > err(1, "SIOCGIFGROUP"); > - } > + } > > - len = ifgr.ifgr_len; > - ifgr.ifgr_groups = > - (struct ifg_req *)calloc(len/sizeof(struct ifg_req), > + len = ifgr.ifgr_len; > + ifgr.ifgr_groups = > + (struct ifg_req *)calloc(len/sizeof(struct ifg_req), > sizeof(struct ifg_req)); > - if (ifgr.ifgr_groups == NULL) > - err(1, "getifgroups"); > - if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) > - err(1, "SIOCGIFGROUP"); > + if (ifgr.ifgr_groups == NULL) > + err(1, "getifgroups"); > + if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) > + err(1, "SIOCGIFGROUP"); > > - ifg = ifgr.ifgr_groups; > - for (; ifg && len >= sizeof(struct ifg_req); ifg++) { > - len -= sizeof(struct ifg_req); > + ifg = ifgr.ifgr_groups; > + for (; ifg && len >= sizeof(struct ifg_req); ifg++) { > + len -= sizeof(struct ifg_req); > if (strcmp(ifg->ifgrq_group, groupname) == 0) { > ret = 1; > break; > } > - } > - free(ifgr.ifgr_groups); > + } > + free(ifgr.ifgr_groups); > > end: > close(s); > > -- > Michal Mazurek