mirror of
https://github.com/sheumann/hush.git
synced 2024-08-20 19:29:02 +00:00
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,
|
||||
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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user