{
int result = 0;
if (execable("/sbin/udhcpc")) {
+ /* SIGUSR2 forces udhcpc to release the current lease and go inactive,
+ * and SIGTERM causes udhcpc to exit. Signals are queued and processed
+ * sequentially so we don't need to sleep */
result = execute("kill -USR2 `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", ifd, exec);
- result += execute("kill -9 `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", ifd, exec);
+ result += execute("kill -TERM `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", ifd, exec);
} else if (execable("/sbin/pump")) {
result = execute("pump -i %iface% -k", ifd, exec);
} else if (execable("/sbin/dhclient")) {
return(NULL);
}
-static struct interfaces_file_t *read_interfaces(char *filename)
+static struct interfaces_file_t *read_interfaces(const char *filename)
{
#ifdef CONFIG_FEATURE_IFUPDOWN_MAPPING
struct mapping_defn_t *currmap = NULL;
FILE *state_fp = NULL;
llist_t *state_list = NULL;
llist_t *target_list = NULL;
- char *interfaces = "/etc/network/interfaces";
+ const char *interfaces = "/etc/network/interfaces";
const char *statefile = "/var/run/ifstate";
#ifdef CONFIG_FEATURE_IFUPDOWN_MAPPING
{
switch (i) {
case 'i': /* interfaces */
- interfaces = bb_xstrdup(optarg);
+ interfaces = optarg;
break;
case 'v': /* verbose */
verbose = 1;