diff options
Diffstat (limited to 'networking/ifupdown.c')
-rw-r--r-- | networking/ifupdown.c | 88 |
1 files changed, 55 insertions, 33 deletions
diff --git a/networking/ifupdown.c b/networking/ifupdown.c index f572b48..c1dc1d3 100644 --- a/networking/ifupdown.c +++ b/networking/ifupdown.c @@ -133,7 +133,7 @@ static int count_netmask_bits(char *dotted_quad) } #endif -static void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t str_length) +static void addstr(char **buf, size_t *len, size_t *pos, const char *str, size_t str_length) { if (*pos + str_length >= *len) { char *newbuf; @@ -150,7 +150,7 @@ static void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t str_l (*buf)[*pos] = '\0'; } -static int strncmpz(char *l, char *r, size_t llen) +static int strncmpz(const char *l, const char *r, size_t llen) { int i = strncmp(l, r, llen); @@ -161,7 +161,7 @@ static int strncmpz(char *l, char *r, size_t llen) } } -static char *get_var(char *id, size_t idlen, struct interface_defn_t *ifd) +static char *get_var(const char *id, size_t idlen, struct interface_defn_t *ifd) { int i; @@ -188,7 +188,7 @@ static char *get_var(char *id, size_t idlen, struct interface_defn_t *ifd) return NULL; } -static char *parse(char *command, struct interface_defn_t *ifd) +static char *parse(const char *command, struct interface_defn_t *ifd) { char *result = NULL; @@ -294,7 +294,7 @@ static char *parse(char *command, struct interface_defn_t *ifd) } /* execute() returns 1 for success and 0 for failure */ -static int execute(char *command, struct interface_defn_t *ifd, execfn *exec) +static int execute(const char *command, struct interface_defn_t *ifd, execfn *exec) { char *out; int ret; @@ -449,43 +449,65 @@ static int static_down(struct interface_defn_t *ifd, execfn *exec) return ((result == 2) ? 2 : 0); } -static int dhcp_up(struct interface_defn_t *ifd, execfn *exec) +#ifndef CONFIG_APP_UDHCPC +struct dhcp_client_t { - if (execute("udhcpc -R -n -p /var/run/udhcpc.%iface%.pid -i %iface% " - "[[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", ifd, exec)) - return 1; - - /* 2006-09-30: The following are deprecated, and should eventually be - * removed. For non-busybox (i.e., other than udhcpc) clients, use - * 'iface foo inet manual' in /etc/network/interfaces, and supply - * start/stop commands explicitly via up/down. */ + const char *name; + const char *startcmd; + const char *stopcmd; +}; - if (execute("pump -i %iface% [[-h %hostname%]] [[-l %leasehours%]]", - ifd, exec)) return 1; - if (execute("dhclient -pf /var/run/dhclient.%iface%.pid %iface%", - ifd, exec)) return 1; - if (execute("dhcpcd [[-h %hostname%]] [[-i %vendor%]] [[-I %clientid%]] " - "[[-l %leasetime%]] %iface%", ifd, exec)) return 1; +static const struct dhcp_client_t ext_dhcp_clients[] = { + { "udhcpc", + "udhcpc -R -n -p /var/run/udhcpc.%iface%.pid -i %iface% [[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", + "kill -TERM `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", + }, + { "pump", + "pump -i %iface% [[-h %hostname%]] [[-l %leasehours%]]", + "pump -i %iface% -k", + }, + { "dhclient", + "dhclient -pf /var/run/dhclient.%iface%.pid %iface%", + "kill -9 `cat /var/run/dhclient.%iface%.pid` 2>/dev/null", + }, + { "dhcpcd", + "dhcpcd [[-h %hostname%]] [[-i %vendor%]] [[-I %clientid%]] [[-l %leasetime%]] %iface%", + "dhcpcd -k %iface%", + }, +}; +#endif +static int dhcp_up(struct interface_defn_t *ifd, execfn *exec) +{ +#ifdef CONFIG_APP_UDHCPC + return execute("udhcpc -R -n -p /var/run/udhcpc.%iface%.pid " + "-i %iface% [[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", + ifd, exec); +#else + int i, nclients = sizeof(ext_dhcp_clients) / sizeof(ext_dhcp_clients[0]); + for (i = 0; i < nclients; i++) { + if (exists_execable(ext_dhcp_clients[i].name)) + return execute(ext_dhcp_clients[i].startcmd, ifd, exec); + } + bb_error_msg("no dhcp clients found"); return 0; +#endif } static int dhcp_down(struct interface_defn_t *ifd, execfn *exec) { - if (execute("kill -TERM `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", - ifd, exec)) return 1; - - /* 2006-09-30: The following are deprecated, and should eventually be - * removed. For non-busybox (i.e., other than udhcpc) clients, use - * 'iface foo inet manual' in /etc/network/interfaces, and supply - * start/stop commands explicitly via up/down. */ - - if (execute("pump -i %iface% -k", ifd, exec)) return 1; - if (execute("kill -9 `cat /var/run/dhclient.%iface%.pid` 2>/dev/null", - ifd, exec)) return 1; - if (execute("dhcpcd -k %iface%", ifd, exec)) return 1; - +#ifdef CONFIG_APP_UDHCPC + return execute("kill -TERM " + "`cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", ifd, exec); +#else + int i, nclients = sizeof(ext_dhcp_clients) / sizeof(ext_dhcp_clients[0]); + for (i = 0; i < nclients; i++) { + if (exists_execable(ext_dhcp_clients[i].name)) + return execute(ext_dhcp_clients[i].stopcmd, ifd, exec); + } + bb_error_msg("no dhcp clients found, using static interface shutdown"); return static_down(ifd, exec); +#endif } static int manual_up_down(struct interface_defn_t *ifd, execfn *exec) |