On Wed, Jan 27, 2016 at 07:53:27PM +0100, Martin Husemann wrote: > How about defining a RTA_ALL_MASK (or however we'd call it, defined as > 0x1ff) and write: > > for (i = 1; i & RTA_ALL_MASK; i <<= 1) { > > ?
Or without global header changes, just use ffs() ? Martin Index: ifwatchd.c =================================================================== RCS file: /cvsroot/src/usr.sbin/ifwatchd/ifwatchd.c,v retrieving revision 1.27 diff -u -p -r1.27 ifwatchd.c --- ifwatchd.c 27 Jan 2016 18:55:51 -0000 1.27 +++ ifwatchd.c 27 Jan 2016 19:31:10 -0000 @@ -65,7 +65,7 @@ enum event { ARRIVAL, DEPARTURE, UP, DOW /* local functions */ __dead static void usage(void); static void dispatch(void*, size_t); -static void check_addrs(char *cp, int addrs, enum event ev); +static void check_addrs(char *cp, unsigned int addrs, enum event ev); static void invoke_script(struct sockaddr *sa, struct sockaddr *dst, enum event ev, int ifindex, const char *ifname_hint); static void list_interfaces(const char *ifnames); static void check_announce(struct if_announcemsghdr *ifan); @@ -287,32 +287,44 @@ work: } static void -check_addrs(char *cp, int addrs, enum event ev) +check_addrs(char *cp, unsigned int addrs, enum event ev) { struct sockaddr *sa, *ifa = NULL, *brd = NULL; char ifname_buf[IFNAMSIZ]; const char *ifname; int ifndx = 0; - unsigned i; + unsigned int i; if (addrs == 0) return; - for (i = 1; i; i <<= 1) { - if ((i & addrs) == 0) - continue; + + for (;;) { + i = ffs(addrs); + if (i == 0) + break; + addrs &= ~i; + sa = (struct sockaddr *)cp; - if (i == RTA_IFP) { + switch (i) { + case RTA_IFP: + { struct sockaddr_dl * li = (struct sockaddr_dl*)sa; ifndx = li->sdl_index; if (!find_interface(ifndx)) { if (verbose) - printf("ignoring change on interface #%d\n", ifndx); + printf("ignoring change on " + "interface #%d\n", ifndx); return; } - } else if (i == RTA_IFA) + break; + } + case RTA_IFA: ifa = sa; - else if (i == RTA_BRD) + break; + case RTA_BRD: brd = sa; + break; + } RT_ADVANCE(cp, sa); } if (ifa != NULL) {