summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2007-06-19 11:10:02 +0000
committerDenis Vlasenko2007-06-19 11:10:02 +0000
commit1b16bdaebf7d0e543e048dfec9f34f06e983336c (patch)
treef2a121c80e2b34822a6bc5e44c5e17c42423d44b
parent91e149a3736ddc357950252c02d758515074447f (diff)
downloadbusybox-1b16bdaebf7d0e543e048dfec9f34f06e983336c.zip
busybox-1b16bdaebf7d0e543e048dfec9f34f06e983336c.tar.gz
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
-rw-r--r--include/inet_common.h11
-rw-r--r--include/libbb.h2
-rw-r--r--libbb/inet_common.c2
-rw-r--r--networking/interface.c99
4 files changed, 62 insertions, 52 deletions
diff --git a/include/inet_common.h b/include/inet_common.h
index bda6211..fa48fdf 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 3c9f9fe..999caae 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 0ef91dc..44b44a4 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 51e3d74..f8721f4 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;
}