aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h2
-rw-r--r--networking/ifconfig.c8
-rw-r--r--networking/interface.c37
3 files changed, 20 insertions, 27 deletions
diff --git a/include/libbb.h b/include/libbb.h
index f1ab1ca6f..fa878433e 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1367,7 +1367,7 @@ struct hwtype {
int FAST_FUNC (*activate)(int fd);
int suppress_null_addr;
};
-extern smallint interface_opt_a;
+#define IFNAME_SHOW_DOWNED_TOO ((char*)(intptr_t)1)
int display_interfaces(char *ifname) FAST_FUNC;
int in_ether(const char *bufp, struct sockaddr *sap) FAST_FUNC;
#if ENABLE_FEATURE_HWIB
diff --git a/networking/ifconfig.c b/networking/ifconfig.c
index 61d91788a..5c47abc16 100644
--- a/networking/ifconfig.c
+++ b/networking/ifconfig.c
@@ -338,6 +338,7 @@ int ifconfig_main(int argc UNUSED_PARAM, char **argv)
char *p;
/*char host[128];*/
const char *host = NULL; /* make gcc happy */
+ IF_FEATURE_IFCONFIG_STATUS(char *show_all_param;)
did_flags = 0;
#if ENABLE_FEATURE_IFCONFIG_BROADCAST_PLUS
@@ -349,15 +350,16 @@ int ifconfig_main(int argc UNUSED_PARAM, char **argv)
++argv;
#if ENABLE_FEATURE_IFCONFIG_STATUS
- if (argv[0] && (argv[0][0] == '-' && argv[0][1] == 'a' && !argv[0][2])) {
- interface_opt_a = 1;
+ show_all_param = NULL;
+ if (argv[0] && argv[0][0] == '-' && argv[0][1] == 'a' && !argv[0][2]) {
++argv;
+ show_all_param = IFNAME_SHOW_DOWNED_TOO;
}
#endif
if (!argv[0] || !argv[1]) { /* one or no args */
#if ENABLE_FEATURE_IFCONFIG_STATUS
- return display_interfaces(argv[0] /* can be NULL */);
+ return display_interfaces(argv[0] ? argv[0] : show_all_param);
#else
bb_error_msg_and_die("no support for status display");
#endif
diff --git a/networking/interface.c b/networking/interface.c
index 0bbef9879..ff99c2981 100644
--- a/networking/interface.c
+++ b/networking/interface.c
@@ -342,8 +342,6 @@ struct interface {
};
-smallint interface_opt_a; /* show all interfaces */
-
static struct interface *int_list, *int_last;
@@ -1086,13 +1084,13 @@ static void ife_print(struct interface *ptr)
bb_putchar('\n');
}
-static int do_if_print(struct interface *ife) /*, int *opt_a)*/
+static int do_if_print(struct interface *ife, int show_downed_too)
{
int res;
res = do_if_fetch(ife);
if (res >= 0) {
- if ((ife->flags & IFF_UP) || interface_opt_a)
+ if ((ife->flags & IFF_UP) || show_downed_too)
ife_print(ife);
}
return res;
@@ -1128,40 +1126,33 @@ static int for_all_interfaces(int (*doit) (struct interface *, void *),
}
#endif
-/* for ipv4 add/del modes */
-static int if_print(char *ifname)
+int FAST_FUNC display_interfaces(char *ifname)
{
struct interface *ife;
int res;
- if (!ifname) {
+ if (!ifname || ifname == IFNAME_SHOW_DOWNED_TOO) {
/*res = for_all_interfaces(do_if_print, &interface_opt_a);*/
if (!int_list) {
- int err = if_readlist();
- if (err < 0)
- return err;
+ res = if_readlist();
+ if (res < 0)
+ goto ret;
}
for (ife = int_list; ife; ife = ife->next) {
- int err = do_if_print(ife); /*, &interface_opt_a);*/
- if (err)
- return err;
+ BUILD_BUG_ON((int)(intptr_t)IFNAME_SHOW_DOWNED_TOO != 1);
+ res = do_if_print(ife, (int)(intptr_t)ifname);
+ if (res < 0)
+ goto ret;
}
return 0;
}
+
ife = lookup_interface(ifname);
res = do_if_fetch(ife);
if (res >= 0)
ife_print(ife);
- return res;
-}
-
-int FAST_FUNC display_interfaces(char *ifname)
-{
- int status;
-
- status = if_print(ifname);
-
- return (status < 0); /* status < 0 == 1 -- error */
+ ret:
+ return (res < 0); /* status < 0 == 1 -- error */
}
#if ENABLE_FEATURE_HWIB