On Tue, Aug 15 2017, Rob Pierce <r...@2keys.ca> wrote: > On Mon, Aug 14, 2017 at 11:26:46PM -0400, Jeremie Courreges-Anglas wrote: >> On Mon, Aug 14 2017, Rob Pierce <r...@2keys.ca> wrote: >> > ifstated currently tracks and maintains the index of each monitored >> > interface >> > and does not maintain interface names. This means we need to re-index on >> > interface departure and arrival. >> > >> > The following diff moves away from indexes to names. Indexes are still >> > required, >> > but easily obtained dynamically as needed. This helps simplify the next >> > diff >> > that will provide support for interface departure and arrival. >> > >> > Suggested by deraadt. >> > >> > No intended functional change. Regress tests pass. >> > >> > Ok? >> >> The idea looks sound to me, however I would keep the "interface" symbol >> in parse.y (your diff doesn't remove all "interface" references btw). >> >> The current code checks the existence of the interface at startup. If >> the interface doesn't exists, you get a syntax error. This could happen >> because of a missing interface (an interesting case), or because of >> a typo. Whether or not we're erroring out, it is nice to print >> a diagnostic message. >> >> I'm not sure this change was intended, so here's a tentative diff that >> that keeps the existing behavior. Regress tests pass. > > Yes, I see that now. That change was not intended. Thanks! > > Your diff looks good. > > Ok?
Please use four spaces, not three, for second level indents; see style(9). There's a check that should be fixed, please see below. With those items addressed, ok jca@ It feels a bit weird to reject unknown interface names at startup but to cope with departed/joining interfaces at runtime. But I guess we'll have to live with this. >> Index: ifstated.c >> =================================================================== >> RCS file: /d/cvs/src/usr.sbin/ifstated/ifstated.c,v >> retrieving revision 1.59 >> diff -u -p -r1.59 ifstated.c >> --- ifstated.c 14 Aug 2017 03:15:28 -0000 1.59 >> +++ ifstated.c 15 Aug 2017 03:04:47 -0000 >> @@ -61,8 +61,8 @@ void external_handler(int, short, void >> void external_exec(struct ifsd_external *, int); >> void check_external_status(struct ifsd_state *); >> void external_evtimer_setup(struct ifsd_state *, int); >> -void scan_ifstate(int, int, int); >> -int scan_ifstate_single(int, int, struct ifsd_state *); >> +void scan_ifstate(const char *, int, int); >> +int scan_ifstate_single(const char *, int, struct ifsd_state *); >> void fetch_ifstate(int); >> __dead void usage(void); >> void adjust_expressions(struct ifsd_expression_list *, int); >> @@ -233,6 +233,8 @@ rt_msg_handler(int fd, short event, void >> char msg[2048]; >> struct rt_msghdr *rtm = (struct rt_msghdr *)&msg; >> struct if_msghdr ifm; >> + char ifnamebuf[IFNAMSIZ]; >> + char *ifname; >> ssize_t len; >> >> if ((len = read(fd, msg, sizeof(msg))) == -1) { >> @@ -250,7 +252,10 @@ rt_msg_handler(int fd, short event, void >> switch (rtm->rtm_type) { >> case RTM_IFINFO: >> memcpy(&ifm, rtm, sizeof(ifm)); >> - scan_ifstate(ifm.ifm_index, ifm.ifm_data.ifi_link_state, 1); >> + ifname = if_indextoname(ifm.ifm_index, ifnamebuf); >> + /* ifname is NULL on interface departure */ >> + if (ifname != NULL) >> + scan_ifstate(ifname, ifm.ifm_data.ifi_link_state, 1); >> break; >> case RTM_DESYNC: >> fetch_ifstate(1); >> @@ -431,7 +436,7 @@ external_evtimer_setup(struct ifsd_state >> #define LINK_STATE_IS_DOWN(_s) (!LINK_STATE_IS_UP((_s))) >> >> int >> -scan_ifstate_single(int ifindex, int s, struct ifsd_state *state) >> +scan_ifstate_single(const char *ifname, int s, struct ifsd_state *state) >> { >> struct ifsd_ifstate *ifstate; >> struct ifsd_expression_list expressions; >> @@ -440,7 +445,7 @@ scan_ifstate_single(int ifindex, int s, >> TAILQ_INIT(&expressions); >> >> TAILQ_FOREACH(ifstate, &state->interface_states, entries) { >> - if (ifstate->ifindex == ifindex) { >> + if (strcmp(ifstate->ifname, ifname) == 0) { >> if (ifstate->prevstate != s && >> (ifstate->prevstate != -1 || !opt_inhibit)) { >> struct ifsd_expression *expression; >> @@ -472,15 +477,15 @@ scan_ifstate_single(int ifindex, int s, >> } >> >> void >> -scan_ifstate(int ifindex, int s, int do_eval) >> +scan_ifstate(const char *ifname, int s, int do_eval) >> { >> struct ifsd_state *state; >> int cur_eval = 0; >> >> - if (scan_ifstate_single(ifindex, s, &conf->initstate) && do_eval) >> + if (scan_ifstate_single(ifname, s, &conf->initstate) && do_eval) >> eval_state(&conf->initstate); >> TAILQ_FOREACH(state, &conf->states, entries) { >> - if (scan_ifstate_single(ifindex, s, state) && >> + if (scan_ifstate_single(ifname, s, state) && >> (do_eval && state == conf->curstate)) >> cur_eval = 1; >> } >> @@ -619,8 +624,8 @@ fetch_ifstate(int do_eval) >> for (ifa = ifap; ifa; ifa = ifa->ifa_next) { >> if (ifa->ifa_addr->sa_family == AF_LINK) { >> struct if_data *ifdata = ifa->ifa_data; >> - scan_ifstate(if_nametoindex(ifa->ifa_name), >> - ifdata->ifi_link_state, do_eval); >> + scan_ifstate(ifa->ifa_name, ifdata->ifi_link_state, >> + do_eval); >> } >> } >> >> Index: ifstated.h >> =================================================================== >> RCS file: /d/cvs/src/usr.sbin/ifstated/ifstated.h,v >> retrieving revision 1.18 >> diff -u -p -r1.18 ifstated.h >> --- ifstated.h 14 Aug 2017 03:15:28 -0000 1.18 >> +++ ifstated.h 15 Aug 2017 03:04:47 -0000 >> @@ -41,7 +41,7 @@ struct ifsd_ifstate { >> #define IFSD_LINKUP 2 >> int prevstate; >> u_int32_t refcount; >> - u_short ifindex; >> + char ifname[IFNAMSIZ]; >> }; >> >> struct ifsd_external { >> Index: parse.y >> =================================================================== >> RCS file: /d/cvs/src/usr.sbin/ifstated/parse.y,v >> retrieving revision 1.45 >> diff -u -p -r1.45 parse.y >> --- parse.y 23 Jul 2017 13:53:54 -0000 1.45 >> +++ parse.y 15 Aug 2017 03:23:00 -0000 >> @@ -85,7 +85,7 @@ struct ifsd_state *curstate; >> void link_states(struct ifsd_action *); >> void set_expression_depth(struct ifsd_expression *, >> int); >> void init_state(struct ifsd_state *); >> -struct ifsd_ifstate *new_ifstate(u_short, int); >> +struct ifsd_ifstate *new_ifstate(char *, int); >> struct ifsd_external *new_external(char *, u_int32_t); >> >> typedef struct { >> @@ -93,7 +93,6 @@ typedef struct { >> int64_t number; >> char *string; >> struct in_addr addr; >> - u_short interface; >> >> struct ifsd_expression *expression; >> struct ifsd_ifstate *ifstate; >> @@ -114,7 +113,7 @@ typedef struct { >> %token <v.string> STRING >> %token <v.number> NUMBER >> %type <v.string> string >> -%type <v.interface> interface >> +%type <v.string> interface >> %type <v.ifstate> if_test >> %type <v.external> ext_test >> %type <v.expression> expr term >> @@ -170,12 +169,12 @@ conf_main : INITSTATE STRING { >> ; >> >> interface : STRING { >> - if (($$ = if_nametoindex($1)) == 0) { >> + if (if_nametoindex($1) == 0) { >> yyerror("unknown interface %s", $1); >> free($1); >> YYERROR; >> } >> - free($1); >> + $$ = $1; >> } >> ; >> >> @@ -933,7 +932,7 @@ init_state(struct ifsd_state *state) >> } >> >> struct ifsd_ifstate * >> -new_ifstate(u_short ifindex, int s) >> +new_ifstate(char *ifname, int s) >> { >> struct ifsd_ifstate *ifstate = NULL; >> struct ifsd_state *state; >> @@ -944,12 +943,16 @@ new_ifstate(u_short ifindex, int s) >> state = &conf->initstate; >> >> TAILQ_FOREACH(ifstate, &state->interface_states, entries) >> - if (ifstate->ifindex == ifindex && ifstate->ifstate == s) >> + if (strcmp(ifstate->ifname, ifname) == 0 && >> + ifstate->ifstate == s) >> break; >> if (ifstate == NULL) { >> if ((ifstate = calloc(1, sizeof(*ifstate))) == NULL) >> err(1, NULL); >> - ifstate->ifindex = ifindex; >> + if (strlcpy(ifstate->ifname, ifname, >> + sizeof(ifstate->ifname)) == 0) >> + errx(1, "ifname strlcpy truncation"); The test doesn't look correct, rather: if (strlcpy(ifstate->ifname, ifname, sizeof(ifstate->ifname)) >= sizeof(ifstate->ifname)) errx(1, "ifname strlcpy truncation"); >> + free(ifname); >> ifstate->ifstate = s; >> TAILQ_INIT(&ifstate->expressions); >> TAILQ_INSERT_TAIL(&state->interface_states, ifstate, entries); >> >> -- >> jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE > -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE