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:
parent
91e149a373
commit
1b16bdaebf
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user