diff -up netplug-1.2.9.1/if_info.c.execshield netplug-1.2.9.1/if_info.c --- netplug-1.2.9.1/if_info.c.execshield 2008-12-23 00:36:23.000000000 +0100 +++ netplug-1.2.9.1/if_info.c 2009-09-09 10:02:12.000000000 +0200 @@ -95,15 +95,16 @@ flags_str(char *buf, unsigned int fl) 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 @@ ifsm_flagchange(struct if_info *info, un } /* 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", diff -up netplug-1.2.9.1/main.c.execshield netplug-1.2.9.1/main.c --- netplug-1.2.9.1/main.c.execshield 2008-12-23 00:36:23.000000000 +0100 +++ netplug-1.2.9.1/main.c 2009-09-09 10:02:12.000000000 +0200 @@ -161,11 +161,28 @@ child_handler(int sig, siginfo_t *info, 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 @@ poll_interfaces(void) 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 @@ main(int argc, char *argv[]) { 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; diff -up netplug-1.2.9.1/Makefile.execshield netplug-1.2.9.1/Makefile --- netplug-1.2.9.1/Makefile.execshield 2008-12-23 00:41:38.000000000 +0100 +++ netplug-1.2.9.1/Makefile 2009-09-09 10:02:12.000000000 +0200 @@ -4,15 +4,15 @@ DESTDIR ?= prefix ?= bindir ?= $(prefix)/sbin -etcdir ?= $(prefix)/etc/netplug +etcdir ?= $(prefix)/etc/netplug.d initdir ?= $(prefix)/etc/rc.d/init.d scriptdir ?= $(prefix)/etc/netplug.d mandir ?= $(prefix)/usr/share/man 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 $@ $^ @@ -30,10 +30,12 @@ install: install $(install_opts) -m 755 scripts/rc.netplugd $(DESTDIR)/$(initdir)/netplugd install $(install_opts) -m 444 man/man8/netplugd.8 $(DESTDIR)/$(mandir)/man8 -hg_root := $(shell hg root) +#hg_root := $(shell hg root) +hg_root := $(shell) tar_root := netplug-$(version) tar_file := $(hg_root)/$(tar_root).tar.bz2 -files := $(shell hg manifest) +#files := $(shell hg manifest) +files := $(shell) tarball: $(tar_file) diff -up netplug-1.2.9.1/man/man8/netplugd.8.execshield netplug-1.2.9.1/man/man8/netplugd.8 --- netplug-1.2.9.1/man/man8/netplugd.8.execshield 2008-12-23 00:36:23.000000000 +0100 +++ netplug-1.2.9.1/man/man8/netplugd.8 2009-09-09 10:07:33.000000000 +0200 @@ -134,7 +134,7 @@ to run in the foreground, this option is .\" .Sh FILES .Bl -tag -width Ds -.It Pa /etc/netplug/netplugd.conf +.It Pa /etc/netplug.d/netplugd.conf Default config file to read, if none is specified on the command line. The config file format is one pattern per line, with white space, empty lines, and comments starting with a diff -up netplug-1.2.9.1/netplug.h.execshield netplug-1.2.9.1/netplug.h --- netplug-1.2.9.1/netplug.h.execshield 2008-12-23 00:36:23.000000000 +0100 +++ netplug-1.2.9.1/netplug.h 2009-09-09 10:02:12.000000000 +0200 @@ -83,7 +83,7 @@ struct if_info *if_info_update_interface 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);