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