networking/interface.c: reduce bss usage
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 19 Jun 2007 11:10:02 +0000 (11:10 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 19 Jun 2007 11:10:02 +0000 (11:10 -0000)
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
include/libbb.h
libbb/inet_common.c
networking/interface.c

index bda621198f08225c79f576c910e683b352e0927a..fa48fdffa9e6461ba1951ac1cdb00f5fe8ca932a 100644 (file)
 /* 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);
index 3c9f9fe81b96ccf057117538e33884ed9320adbc..999caae0c4797dfb4f00c1fd4d1577949d56b4a0 100644 (file)
@@ -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);
index 0ef91dc4b53e06894afe33f62c1af77c22387533..44b44a4ccbe0a3515d0ccdf27ae0bf5341d7c517 100644 (file)
@@ -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;
index 51e3d7487e2eda1266d5f3e7831de89639a37ae2..f8721f409e4bd6103370829dd195d04d3c4c41b2 100644 (file)
@@ -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;
 }