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
This commit is contained in:
Denis Vlasenko 2007-06-19 11:10:02 +00:00
parent 91e149a373
commit 1b16bdaebf
4 changed files with 62 additions and 52 deletions

View File

@ -12,14 +12,15 @@
/* hostfirst!=0 If we expect this to be a hostname, /* hostfirst!=0 If we expect this to be a hostname,
try hostname database first 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 "*", /* numeric: & 0x8000: "default" instead of "*",
* & 0x4000: host instead of net, * & 0x4000: host instead of net,
* & 0x0fff: don't resolve * & 0x0fff: don't resolve
*/ */
extern int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
int numeric, unsigned int netmask); 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);

View File

@ -699,7 +699,7 @@ struct hwtype {
int (*activate) (int fd); int (*activate) (int fd);
int suppress_null_addr; int suppress_null_addr;
}; };
extern int interface_opt_a; extern smallint interface_opt_a;
int display_interfaces(char *ifname); int display_interfaces(char *ifname);
const struct aftype *get_aftype(const char *name); const struct aftype *get_aftype(const char *name);
const struct hwtype *get_hwtype(const char *name); const struct hwtype *get_hwtype(const char *name);

View File

@ -98,7 +98,7 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
/* Grmpf. -FvK */ /* Grmpf. -FvK */
if (s_in->sin_family != AF_INET) { if (s_in->sin_family != AF_INET) {
#ifdef DEBUG #ifdef DEBUG
bb_error_msg("rresolve: unsupport address family %d !", bb_error_msg("rresolve: unsupported address family %d!",
s_in->sin_family); s_in->sin_family);
#endif #endif
errno = EAFNOSUPPORT; errno = EAFNOSUPPORT;

View File

@ -88,11 +88,9 @@ static const char *INET_sprint(struct sockaddr *sap, int numeric)
if (sap->sa_family == 0xFFFF || sap->sa_family == 0) if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
return "[NONE SET]"; return "[NONE SET]";
if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap,
numeric, 0xffffff00) != 0) numeric, 0xffffff00) != 0)
return NULL; return NULL;
return buff; return buff;
} }
@ -221,10 +219,13 @@ static const struct aftype inet6_aftype = {
/* Display an UNSPEC address. */ /* Display an UNSPEC address. */
static char *UNSPEC_print(unsigned char *ptr) static char *UNSPEC_print(unsigned char *ptr)
{ {
static char buff[sizeof(struct sockaddr) * 3 + 1]; static char *buff;
char *pos; char *pos;
unsigned int i; unsigned int i;
if (!buff);
buff = xmalloc(sizeof(struct sockaddr) * 3 + 1);
pos = buff; pos = buff;
for (i = 0; i < sizeof(struct sockaddr); i++) { for (i = 0; i < sizeof(struct sockaddr); i++) {
/* careful -- not every libc's sprintf returns # bytes written */ /* 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; 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); ifc.ifc_buf = xrealloc(ifc.ifc_buf, ifc.ifc_len);
if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
perror("SIOCGIFCONF"); bb_perror_msg("SIOCGIFCONF");
goto out; goto out;
} }
if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) { 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 if_readlist_proc(char *target)
{ {
static int proc_read; static smallint proc_read;
FILE *fh; FILE *fh;
char buf[512]; char buf[512];
struct interface *ife; struct interface *ife;
@ -581,7 +583,7 @@ static int if_readlist_proc(char *target)
break; break;
} }
if (ferror(fh)) { if (ferror(fh)) {
perror(_PATH_PROCNET_DEV); bb_perror_msg(_PATH_PROCNET_DEV);
err = -1; err = -1;
proc_read = 0; proc_read = 0;
} }
@ -598,22 +600,6 @@ static int if_readlist(void)
return err; 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. */ /* Fetch the interface configuration from the kernel. */
static int if_fetch(struct interface *ife) static int if_fetch(struct interface *ife)
{ {
@ -732,9 +718,10 @@ static const struct hwtype loop_hwtype = {
/* Display an Ethernet address in readable format. */ /* Display an Ethernet address in readable format. */
static char *pr_ether(unsigned char *ptr) 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[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
(ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 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 int in_ether(const char *bufp, struct sockaddr *sap);
static struct hwtype ether_hwtype = { static const struct hwtype ether_hwtype = {
.name = "ether", .name = "ether",
.title = "Ethernet", .title = "Ethernet",
.type = ARPHRD_ETHER, .type = ARPHRD_ETHER,
@ -1040,29 +1027,28 @@ static void ife_print(struct interface *ptr)
(struct sockaddr *) &sap.sin6_addr); (struct sockaddr *) &sap.sin6_addr);
sap.sin6_family = AF_INET6; sap.sin6_family = AF_INET6;
printf(" inet6 addr: %s/%d", printf(" inet6 addr: %s/%d",
inet6_aftype.sprint((struct sockaddr *) &sap, 1), INET6_sprint((struct sockaddr *) &sap, 1),
plen); plen);
printf(" Scope:"); printf(" Scope:");
switch (scope & IPV6_ADDR_SCOPE_MASK) { switch (scope & IPV6_ADDR_SCOPE_MASK) {
case 0: case 0:
printf("Global"); puts("Global");
break; break;
case IPV6_ADDR_LINKLOCAL: case IPV6_ADDR_LINKLOCAL:
printf("Link"); puts("Link");
break; break;
case IPV6_ADDR_SITELOCAL: case IPV6_ADDR_SITELOCAL:
printf("Site"); puts("Site");
break; break;
case IPV6_ADDR_COMPATv4: case IPV6_ADDR_COMPATv4:
printf("Compat"); puts("Compat");
break; break;
case IPV6_ADDR_LOOPBACK: case IPV6_ADDR_LOOPBACK:
printf("Host"); puts("Host");
break; break;
default: default:
printf("Unknown"); puts("Unknown");
} }
puts("");
} }
} }
fclose(f); 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; int res;
res = do_if_fetch(ife); res = do_if_fetch(ife);
if (res >= 0) { if (res >= 0) {
if ((ife->flags & IFF_UP) || *opt_a) if ((ife->flags & IFF_UP) || interface_opt_a)
ife_print(ife); ife_print(ife);
} }
return res; return res;
@ -1167,21 +1152,45 @@ static struct interface *lookup_interface(char *name)
return ife; 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 */ /* for ipv4 add/del modes */
static int if_print(char *ifname) static int if_print(char *ifname)
{ {
struct interface *ife;
int res; int res;
if (!ifname) { if (!ifname) {
res = for_all_interfaces(do_if_print, &interface_opt_a); /*res = for_all_interfaces(do_if_print, &interface_opt_a);*/
} else { if (!int_list && (if_readlist() < 0))
struct interface *ife; return -1;
for (ife = int_list; ife; ife = ife->next) {
ife = lookup_interface(ifname); int err = do_if_print(ife); /*, &interface_opt_a);*/
res = do_if_fetch(ife); if (err)
if (res >= 0) return err;
ife_print(ife); }
return 0;
} }
ife = lookup_interface(ifname);
res = do_if_fetch(ife);
if (res >= 0)
ife_print(ife);
return res; return res;
} }