From c77899c6a758a1f039abf95bdcce73c20b83790b Mon Sep 17 00:00:00 2001 From: Radek Vokál Date: Feb 28 2005 11:48:52 +0000 Subject: - correct patch version --- diff --git a/netplug-1.2.9-execshield.patch b/netplug-1.2.9-execshield.patch new file mode 100644 index 0000000..c2cde02 --- /dev/null +++ b/netplug-1.2.9-execshield.patch @@ -0,0 +1,145 @@ +--- net-tools-1.60/netplug-1.2.9/main.c.execshield2 2004-05-15 04:57:33.000000000 +0200 ++++ net-tools-1.60/netplug-1.2.9/main.c 2005-02-28 12:26:32.157391408 +0100 +@@ -166,6 +166,23 @@ + + /* 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; +@@ -329,17 +335,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; +--- net-tools-1.60/netplug-1.2.9/if_info.c.execshield2 2004-04-25 05:55:15.000000000 +0200 ++++ net-tools-1.60/netplug-1.2.9/if_info.c 2005-02-28 12:26:32.155391712 +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.execshield2 2004-04-25 05:55:15.000000000 +0200 ++++ net-tools-1.60/netplug-1.2.9/netplug.h 2005-02-28 12:26:32.154391864 +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);