--- net-tools-1.60/netplug-1.2.9/if_info.c.execshield 2005-01-08 06:57:08.000000000 +0100 +++ net-tools-1.60/netplug-1.2.9/if_info.c 2005-02-28 14:43:05.596799288 +0100 @@ -95,15 +95,16 @@ return buf; } -void -for_each_iface(int (*func)(struct if_info *)) +struct if_info * +for_each_iface(int (*func)(struct if_info *, long), long param) { for(int i = 0; i < INFOHASHSZ; i++) { for(struct if_info *info = if_info[i]; info != NULL; info = info->next) { - if ((*func)(info)) - return; + if ((*func)(info, param)) + return info; } } + return NULL; } /* Reevaluate the state machine based on the current state and flag settings */ @@ -285,22 +286,20 @@ } /* handle a script termination and update the state accordingly */ +int find_pid(struct if_info *i, long param) { + if (i->worker == param) { + return 1; + } + return 0; +} + void ifsm_scriptdone(pid_t pid, int exitstatus) { int exitok = WIFEXITED(exitstatus) && WEXITSTATUS(exitstatus) == 0; struct if_info *info; assert(WIFEXITED(exitstatus) || WIFSIGNALED(exitstatus)); - int find_pid(struct if_info *i) { - if (i->worker == pid) { - info = i; - return 1; - } - return 0; - } - - info = NULL; - for_each_iface(find_pid); + info = for_each_iface(find_pid, pid); if (info == NULL) { do_log(LOG_INFO, "Unexpected child %d exited with status %d", --- net-tools-1.60/netplug-1.2.9/netplug.h.execshield 2005-01-08 06:57:09.000000000 +0100 +++ net-tools-1.60/netplug-1.2.9/netplug.h 2005-02-28 14:43:05.597799136 +0100 @@ -83,7 +83,7 @@ struct rtattr *attrs[]); int if_info_save_interface(struct nlmsghdr *hdr, void *arg); void parse_rtattrs(struct rtattr *tb[], int max, struct rtattr *rta, int len); -void for_each_iface(int (*func)(struct if_info *)); +struct if_info *for_each_iface(int (*func)(struct if_info *, long), long param); void ifsm_flagpoll(struct if_info *info); void ifsm_flagchange(struct if_info *info, unsigned int newflags); --- net-tools-1.60/netplug-1.2.9/Makefile.execshield 2005-02-28 14:43:05.000000000 +0100 +++ net-tools-1.60/netplug-1.2.9/Makefile 2005-02-28 14:47:42.123760800 +0100 @@ -9,8 +9,8 @@ install_opts := -CFLAGS += -Wall -Werror -std=gnu99 -DNP_ETC_DIR='"$(etcdir)"' \ - -DNP_SCRIPT_DIR='"$(scriptdir)"' -ggdb3 -O3 -DNP_VERSION='"$(version)"' +CFLAGS += -std=gnu99 -DNP_ETC_DIR='"$(etcdir)"' \ + -DNP_SCRIPT_DIR='"$(scriptdir)"' -DNP_VERSION='"$(version)"' netplugd: config.o netlink.o lib.o if_info.o main.o $(CC) $(LDFLAGS) -o $@ $^ --- net-tools-1.60/netplug-1.2.9/main.c.execshield 2005-01-08 06:57:09.000000000 +0100 +++ net-tools-1.60/netplug-1.2.9/main.c 2005-02-28 14:43:05.599798832 +0100 @@ -161,11 +161,28 @@ ce.pid = info->si_pid; ret = waitpid(info->si_pid, &ce.status, 0); if (ret == info->si_pid) - write(child_handler_pipe[1], &ce, sizeof(ce)); + (void)write(child_handler_pipe[1], &ce, sizeof(ce)); } /* Poll the existing interface state, so we can catch any state changes for which we may not have neen a netlink message. */ +static int pollflags(struct if_info *info, long param) { + struct ifreq ifr; + + if (!if_match(info->name)) + return 0; + + memcpy(ifr.ifr_name, info->name, sizeof(ifr.ifr_name)); + if (ioctl(param, SIOCGIFFLAGS, &ifr) < 0) + do_log(LOG_ERR, "%s: can't get flags: %m", info->name); + else { + ifsm_flagchange(info, ifr.ifr_flags); + ifsm_flagpoll(info); + } + + return 0; +} + static void poll_interfaces(void) { @@ -180,24 +197,13 @@ close_on_exec(sockfd); } - int pollflags(struct if_info *info) { - struct ifreq ifr; - - if (!if_match(info->name)) - return 0; - - memcpy(ifr.ifr_name, info->name, sizeof(ifr.ifr_name)); - if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) - do_log(LOG_ERR, "%s: can't get flags: %m", info->name); - else { - ifsm_flagchange(info, ifr.ifr_flags); - ifsm_flagpoll(info); - } - - return 0; - } + for_each_iface(pollflags, sockfd); +} - for_each_iface(pollflags); +static int poll_flags(struct if_info *i, long param) { + if (if_match(i->name)) + ifsm_flagpoll(i); + return 0; } int debug = 0; @@ -331,17 +337,11 @@ { child_handler_pipe[0], POLLIN, 0 }, }; - { - /* Run over each of the interfaces we know and care about, and - make sure the state machine has done the appropriate thing - for their current state. */ - int poll_flags(struct if_info *i) { - if (if_match(i->name)) - ifsm_flagpoll(i); - return 0; - } - for_each_iface(poll_flags); - } + /* Run over each of the interfaces we know and care about, and + make sure the state machine has done the appropriate thing + for their current state. */ + for_each_iface(poll_flags, 0); + for(;;) { int ret;