From 1b16bdaebf7d0e543e048dfec9f34f06e983336c Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 19 Jun 2007 11:10:02 +0000 Subject: [PATCH] networking/interface.c: reduce bss usage function old new delta .rodata 158918 158950 +32 display_interfaces 133 153 +20 UNSPEC_print 56 68 +12 pr_ether 59 65 +6 static.proc_read 4 1 -3 interface_opt_a 4 1 -3 in_ether 139 136 -3 ifconfig_main 1296 1293 -3 if_readlist_proc 686 680 -6 ife_print 1350 1338 -12 do_if_print 46 - -46 static.buff 369 264 -105 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 4/7 up/down: 70/-181) Total: -111 bytes # size busybox_old busybox_unstripped text data bss dec hex filename 751073 3080 14800 768953 bbbb9 busybox_old 751073 3048 14688 768809 bbb29 busybox_unstripped --- include/inet_common.h | 11 ++--- include/libbb.h | 2 +- libbb/inet_common.c | 2 +- networking/interface.c | 99 +++++++++++++++++++++++------------------- 4 files changed, 62 insertions(+), 52 deletions(-) diff --git a/include/inet_common.h b/include/inet_common.h index bda621198..fa48fdffa 100644 --- a/include/inet_common.h +++ b/include/inet_common.h @@ -12,14 +12,15 @@ /* hostfirst!=0 If we expect this to be a hostname, try hostname database first */ -extern int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst); +int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst); /* numeric: & 0x8000: "default" instead of "*", * & 0x4000: host instead of net, * & 0x0fff: don't resolve */ -extern int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, - int numeric, unsigned int netmask); +int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, + int numeric, unsigned int netmask); -extern int INET6_resolve(const char *name, struct sockaddr_in6 *sin6); -extern int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6, int numeric); + +int INET6_resolve(const char *name, struct sockaddr_in6 *sin6); +int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6, int numeric); diff --git a/include/libbb.h b/include/libbb.h index 3c9f9fe81..999caae0c 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -699,7 +699,7 @@ struct hwtype { int (*activate) (int fd); int suppress_null_addr; }; -extern int interface_opt_a; +extern smallint interface_opt_a; int display_interfaces(char *ifname); const struct aftype *get_aftype(const char *name); const struct hwtype *get_hwtype(const char *name); diff --git a/libbb/inet_common.c b/libbb/inet_common.c index 0ef91dc4b..44b44a4cc 100644 --- a/libbb/inet_common.c +++ b/libbb/inet_common.c @@ -98,7 +98,7 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, /* Grmpf. -FvK */ if (s_in->sin_family != AF_INET) { #ifdef DEBUG - bb_error_msg("rresolve: unsupport address family %d !", + bb_error_msg("rresolve: unsupported address family %d!", s_in->sin_family); #endif errno = EAFNOSUPPORT; diff --git a/networking/interface.c b/networking/interface.c index 51e3d7487..f8721f409 100644 --- a/networking/interface.c +++ b/networking/interface.c @@ -88,11 +88,9 @@ static const char *INET_sprint(struct sockaddr *sap, int numeric) if (sap->sa_family == 0xFFFF || sap->sa_family == 0) return "[NONE SET]"; - if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, numeric, 0xffffff00) != 0) return NULL; - return buff; } @@ -221,10 +219,13 @@ static const struct aftype inet6_aftype = { /* Display an UNSPEC address. */ static char *UNSPEC_print(unsigned char *ptr) { - static char buff[sizeof(struct sockaddr) * 3 + 1]; + static char *buff; + char *pos; unsigned int i; + if (!buff); + buff = xmalloc(sizeof(struct sockaddr) * 3 + 1); pos = buff; for (i = 0; i < sizeof(struct sockaddr); i++) { /* careful -- not every libc's sprintf returns # bytes written */ @@ -341,7 +342,7 @@ struct interface { }; -int interface_opt_a; /* show all interfaces */ +smallint interface_opt_a; /* show all interfaces */ static struct interface *int_list, *int_last; @@ -522,7 +523,7 @@ static int if_readconf(void) ifc.ifc_buf = xrealloc(ifc.ifc_buf, ifc.ifc_len); if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { - perror("SIOCGIFCONF"); + bb_perror_msg("SIOCGIFCONF"); goto out; } if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) { @@ -548,7 +549,8 @@ static int if_readconf(void) static int if_readlist_proc(char *target) { - static int proc_read; + static smallint proc_read; + FILE *fh; char buf[512]; struct interface *ife; @@ -581,7 +583,7 @@ static int if_readlist_proc(char *target) break; } if (ferror(fh)) { - perror(_PATH_PROCNET_DEV); + bb_perror_msg(_PATH_PROCNET_DEV); err = -1; proc_read = 0; } @@ -598,22 +600,6 @@ static int if_readlist(void) return err; } -static int for_all_interfaces(int (*doit) (struct interface *, void *), - void *cookie) -{ - struct interface *ife; - - if (!int_list && (if_readlist() < 0)) - return -1; - for (ife = int_list; ife; ife = ife->next) { - int err = doit(ife, cookie); - - if (err) - return err; - } - return 0; -} - /* Fetch the interface configuration from the kernel. */ static int if_fetch(struct interface *ife) { @@ -732,9 +718,10 @@ static const struct hwtype loop_hwtype = { /* Display an Ethernet address in readable format. */ static char *pr_ether(unsigned char *ptr) { - static char buff[64]; + static char *buff; - snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X", + free(buff); + buff = xasprintf("%02X:%02X:%02X:%02X:%02X:%02X", (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) ); @@ -743,7 +730,7 @@ static char *pr_ether(unsigned char *ptr) static int in_ether(const char *bufp, struct sockaddr *sap); -static struct hwtype ether_hwtype = { +static const struct hwtype ether_hwtype = { .name = "ether", .title = "Ethernet", .type = ARPHRD_ETHER, @@ -1040,29 +1027,28 @@ static void ife_print(struct interface *ptr) (struct sockaddr *) &sap.sin6_addr); sap.sin6_family = AF_INET6; printf(" inet6 addr: %s/%d", - inet6_aftype.sprint((struct sockaddr *) &sap, 1), + INET6_sprint((struct sockaddr *) &sap, 1), plen); printf(" Scope:"); switch (scope & IPV6_ADDR_SCOPE_MASK) { case 0: - printf("Global"); + puts("Global"); break; case IPV6_ADDR_LINKLOCAL: - printf("Link"); + puts("Link"); break; case IPV6_ADDR_SITELOCAL: - printf("Site"); + puts("Site"); break; case IPV6_ADDR_COMPATv4: - printf("Compat"); + puts("Compat"); break; case IPV6_ADDR_LOOPBACK: - printf("Host"); + puts("Host"); break; default: - printf("Unknown"); + puts("Unknown"); } - puts(""); } } fclose(f); @@ -1144,14 +1130,13 @@ static void ife_print(struct interface *ptr) } -static int do_if_print(struct interface *ife, void *cookie) +static int do_if_print(struct interface *ife) /*, int *opt_a)*/ { - int *opt_a = (int *) cookie; int res; res = do_if_fetch(ife); if (res >= 0) { - if ((ife->flags & IFF_UP) || *opt_a) + if ((ife->flags & IFF_UP) || interface_opt_a) ife_print(ife); } return res; @@ -1167,21 +1152,45 @@ static struct interface *lookup_interface(char *name) return ife; } +#ifdef UNUSED +static int for_all_interfaces(int (*doit) (struct interface *, void *), + void *cookie) +{ + struct interface *ife; + + if (!int_list && (if_readlist() < 0)) + return -1; + for (ife = int_list; ife; ife = ife->next) { + int err = doit(ife, cookie); + + if (err) + return err; + } + return 0; +} +#endif + /* for ipv4 add/del modes */ static int if_print(char *ifname) { + struct interface *ife; int res; if (!ifname) { - res = for_all_interfaces(do_if_print, &interface_opt_a); - } else { - struct interface *ife; - - ife = lookup_interface(ifname); - res = do_if_fetch(ife); - if (res >= 0) - ife_print(ife); + /*res = for_all_interfaces(do_if_print, &interface_opt_a);*/ + if (!int_list && (if_readlist() < 0)) + return -1; + for (ife = int_list; ife; ife = ife->next) { + int err = do_if_print(ife); /*, &interface_opt_a);*/ + if (err) + return err; + } + return 0; } + ife = lookup_interface(ifname); + res = do_if_fetch(ife); + if (res >= 0) + ife_print(ife); return res; } -- 2.25.1