diff -pruN busybox-1.1.3/networking/Config.in busybox-1.1.3_ifconfig/networking/Config.in --- busybox-1.1.3/networking/Config.in 2006-03-22 22:16:19.000000000 +0100 +++ busybox-1.1.3_ifconfig/networking/Config.in 2006-07-20 11:05:52.000000000 +0200 @@ -195,7 +195,8 @@ config CONFIG_FEATURE_IFCONFIG_BROADCAST depends on CONFIG_IFCONFIG help Setting this will make ifconfig attempt to find the broadcast - automatically if the value '+' is used. + automatically if ip and netmask are passed, uncommon + syntax + are still supported. config CONFIG_IFUPDOWN bool "ifupdown" diff -pruN busybox-1.1.3/networking/ifconfig.c busybox-1.1.3_ifconfig/networking/ifconfig.c --- busybox-1.1.3/networking/ifconfig.c 2006-03-22 22:16:19.000000000 +0100 +++ busybox-1.1.3_ifconfig/networking/ifconfig.c 2006-07-20 11:25:02.000000000 +0200 @@ -280,6 +280,9 @@ extern int display_interfaces(char *ifna * Our main function. */ +#define is_BROADCAST_able() ((did_flags & (A_NETMASK|A_HOSTNAME|A_BROADCAST)) == (A_NETMASK|A_HOSTNAME)) +#define is_BROADCAST_plus() ((host[0] == '+') && !host[1] && (mask & A_BROADCAST)) + int ifconfig_main(int argc, char **argv) { struct ifreq ifr; @@ -303,7 +306,7 @@ int ifconfig_main(int argc, char **argv) unsigned char mask; unsigned char did_flags; #endif - char *p; + char *p, stop = 0; char host[128]; goterr = 0; @@ -343,8 +346,16 @@ int ifconfig_main(int argc, char **argv) safe_strncpy(ifr.ifr_name, *argv, IFNAMSIZ); /* Process the remaining arguments. */ - while (*++argv != (char *) NULL) { - p = *argv; + while (!stop) { + if((p = *++argv)) { + ; + } else + if(is_BROADCAST_able()) { + p = "broadcast"; + stop = 1; + } else + break; + mask = N_MASK; if (*p == '-') { /* If the arg starts with '-'... */ ++p; /* advance past it and */ @@ -375,7 +386,9 @@ int ifconfig_main(int argc, char **argv) bb_show_usage(); } if (*++argv == NULL) { - if (mask & A_ARG_REQ) { + if(stop) { + goto BROADCAST; + } else if (mask & A_ARG_REQ) { bb_show_usage(); } else { --argv; @@ -383,7 +396,7 @@ int ifconfig_main(int argc, char **argv) } } else { /* got an arg so process it */ HOSTNAME: - did_flags |= (mask & (A_NETMASK|A_HOSTNAME)); + did_flags |= (mask & (A_NETMASK|A_HOSTNAME|A_BROADCAST)); if (mask & A_CAST_HOST_COPY) { #ifdef CONFIG_FEATURE_IFCONFIG_HW if (mask & A_CAST_RESOLVE) { @@ -392,7 +405,6 @@ int ifconfig_main(int argc, char **argv) char *prefix; int prefix_len = 0; #endif - safe_strncpy(host, *argv, (sizeof host)); #ifdef CONFIG_FEATURE_IPV6 if ((prefix = strchr(host, '/'))) { @@ -405,18 +417,19 @@ int ifconfig_main(int argc, char **argv) *prefix = 0; } #endif - + BROADCAST: sai.sin_family = AF_INET; sai.sin_port = 0; - if (!strcmp(host, bb_INET_default)) { - /* Default is special, meaning 0.0.0.0. */ - sai.sin_addr.s_addr = INADDR_ANY; #ifdef CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS - } else if (((host[0] == '+') && !host[1]) && (mask & A_BROADCAST) && - (did_flags & (A_NETMASK|A_HOSTNAME)) == (A_NETMASK|A_HOSTNAME)) { + if (stop || (is_BROADCAST_plus() && is_BROADCAST_able())){ /* + is special, meaning broadcast is derived. */ + did_flags |= A_BROADCAST; sai.sin_addr.s_addr = (~sai_netmask) | (sai_hostname & sai_netmask); + } else #endif + if (!strcmp(host, bb_INET_default)) { + /* Default is special, meaning 0.0.0.0. */ + sai.sin_addr.s_addr = INADDR_ANY; #ifdef CONFIG_FEATURE_IPV6 } else if (inet_pton(AF_INET6, host, &sai6.sin6_addr) > 0) { int sockfd6;