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

Reply via email to