diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-19 11:10:02 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-19 11:10:02 +0000 |
| commit | 1b16bdaebf7d0e543e048dfec9f34f06e983336c (patch) | |
| tree | f2a121c80e2b34822a6bc5e44c5e17c42423d44b /networking/interface.c | |
| parent | 91e149a3736ddc357950252c02d758515074447f (diff) | |
| download | busybox-w32-1b16bdaebf7d0e543e048dfec9f34f06e983336c.tar.gz busybox-w32-1b16bdaebf7d0e543e048dfec9f34f06e983336c.tar.bz2 busybox-w32-1b16bdaebf7d0e543e048dfec9f34f06e983336c.zip | |
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
Diffstat (limited to 'networking/interface.c')
| -rw-r--r-- | networking/interface.c | 99 |
1 files changed, 54 insertions, 45 deletions
diff --git a/networking/interface.c b/networking/interface.c index 51e3d7487..f8721f409 100644 --- a/networking/interface.c +++ b/networking/interface.c | |||
| @@ -88,11 +88,9 @@ static const char *INET_sprint(struct sockaddr *sap, int numeric) | |||
| 88 | 88 | ||
| 89 | if (sap->sa_family == 0xFFFF || sap->sa_family == 0) | 89 | if (sap->sa_family == 0xFFFF || sap->sa_family == 0) |
| 90 | return "[NONE SET]"; | 90 | return "[NONE SET]"; |
| 91 | |||
| 92 | if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, | 91 | if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, |
| 93 | numeric, 0xffffff00) != 0) | 92 | numeric, 0xffffff00) != 0) |
| 94 | return NULL; | 93 | return NULL; |
| 95 | |||
| 96 | return buff; | 94 | return buff; |
| 97 | } | 95 | } |
| 98 | 96 | ||
| @@ -221,10 +219,13 @@ static const struct aftype inet6_aftype = { | |||
| 221 | /* Display an UNSPEC address. */ | 219 | /* Display an UNSPEC address. */ |
| 222 | static char *UNSPEC_print(unsigned char *ptr) | 220 | static char *UNSPEC_print(unsigned char *ptr) |
| 223 | { | 221 | { |
| 224 | static char buff[sizeof(struct sockaddr) * 3 + 1]; | 222 | static char *buff; |
| 223 | |||
| 225 | char *pos; | 224 | char *pos; |
| 226 | unsigned int i; | 225 | unsigned int i; |
| 227 | 226 | ||
| 227 | if (!buff); | ||
| 228 | buff = xmalloc(sizeof(struct sockaddr) * 3 + 1); | ||
| 228 | pos = buff; | 229 | pos = buff; |
| 229 | for (i = 0; i < sizeof(struct sockaddr); i++) { | 230 | for (i = 0; i < sizeof(struct sockaddr); i++) { |
| 230 | /* careful -- not every libc's sprintf returns # bytes written */ | 231 | /* careful -- not every libc's sprintf returns # bytes written */ |
| @@ -341,7 +342,7 @@ struct interface { | |||
| 341 | }; | 342 | }; |
| 342 | 343 | ||
| 343 | 344 | ||
| 344 | int interface_opt_a; /* show all interfaces */ | 345 | smallint interface_opt_a; /* show all interfaces */ |
| 345 | 346 | ||
| 346 | static struct interface *int_list, *int_last; | 347 | static struct interface *int_list, *int_last; |
| 347 | 348 | ||
| @@ -522,7 +523,7 @@ static int if_readconf(void) | |||
| 522 | ifc.ifc_buf = xrealloc(ifc.ifc_buf, ifc.ifc_len); | 523 | ifc.ifc_buf = xrealloc(ifc.ifc_buf, ifc.ifc_len); |
| 523 | 524 | ||
| 524 | if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { | 525 | if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { |
| 525 | perror("SIOCGIFCONF"); | 526 | bb_perror_msg("SIOCGIFCONF"); |
| 526 | goto out; | 527 | goto out; |
| 527 | } | 528 | } |
| 528 | if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) { | 529 | if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) { |
| @@ -548,7 +549,8 @@ static int if_readconf(void) | |||
| 548 | 549 | ||
| 549 | static int if_readlist_proc(char *target) | 550 | static int if_readlist_proc(char *target) |
| 550 | { | 551 | { |
| 551 | static int proc_read; | 552 | static smallint proc_read; |
| 553 | |||
| 552 | FILE *fh; | 554 | FILE *fh; |
| 553 | char buf[512]; | 555 | char buf[512]; |
| 554 | struct interface *ife; | 556 | struct interface *ife; |
| @@ -581,7 +583,7 @@ static int if_readlist_proc(char *target) | |||
| 581 | break; | 583 | break; |
| 582 | } | 584 | } |
| 583 | if (ferror(fh)) { | 585 | if (ferror(fh)) { |
| 584 | perror(_PATH_PROCNET_DEV); | 586 | bb_perror_msg(_PATH_PROCNET_DEV); |
| 585 | err = -1; | 587 | err = -1; |
| 586 | proc_read = 0; | 588 | proc_read = 0; |
| 587 | } | 589 | } |
| @@ -598,22 +600,6 @@ static int if_readlist(void) | |||
| 598 | return err; | 600 | return err; |
| 599 | } | 601 | } |
| 600 | 602 | ||
| 601 | static int for_all_interfaces(int (*doit) (struct interface *, void *), | ||
| 602 | void *cookie) | ||
| 603 | { | ||
| 604 | struct interface *ife; | ||
| 605 | |||
| 606 | if (!int_list && (if_readlist() < 0)) | ||
| 607 | return -1; | ||
| 608 | for (ife = int_list; ife; ife = ife->next) { | ||
| 609 | int err = doit(ife, cookie); | ||
| 610 | |||
| 611 | if (err) | ||
| 612 | return err; | ||
| 613 | } | ||
| 614 | return 0; | ||
| 615 | } | ||
| 616 | |||
| 617 | /* Fetch the interface configuration from the kernel. */ | 603 | /* Fetch the interface configuration from the kernel. */ |
| 618 | static int if_fetch(struct interface *ife) | 604 | static int if_fetch(struct interface *ife) |
| 619 | { | 605 | { |
| @@ -732,9 +718,10 @@ static const struct hwtype loop_hwtype = { | |||
| 732 | /* Display an Ethernet address in readable format. */ | 718 | /* Display an Ethernet address in readable format. */ |
| 733 | static char *pr_ether(unsigned char *ptr) | 719 | static char *pr_ether(unsigned char *ptr) |
| 734 | { | 720 | { |
| 735 | static char buff[64]; | 721 | static char *buff; |
| 736 | 722 | ||
| 737 | snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X", | 723 | free(buff); |
| 724 | buff = xasprintf("%02X:%02X:%02X:%02X:%02X:%02X", | ||
| 738 | (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), | 725 | (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), |
| 739 | (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) | 726 | (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) |
| 740 | ); | 727 | ); |
| @@ -743,7 +730,7 @@ static char *pr_ether(unsigned char *ptr) | |||
| 743 | 730 | ||
| 744 | static int in_ether(const char *bufp, struct sockaddr *sap); | 731 | static int in_ether(const char *bufp, struct sockaddr *sap); |
| 745 | 732 | ||
| 746 | static struct hwtype ether_hwtype = { | 733 | static const struct hwtype ether_hwtype = { |
| 747 | .name = "ether", | 734 | .name = "ether", |
| 748 | .title = "Ethernet", | 735 | .title = "Ethernet", |
| 749 | .type = ARPHRD_ETHER, | 736 | .type = ARPHRD_ETHER, |
| @@ -1040,29 +1027,28 @@ static void ife_print(struct interface *ptr) | |||
| 1040 | (struct sockaddr *) &sap.sin6_addr); | 1027 | (struct sockaddr *) &sap.sin6_addr); |
| 1041 | sap.sin6_family = AF_INET6; | 1028 | sap.sin6_family = AF_INET6; |
| 1042 | printf(" inet6 addr: %s/%d", | 1029 | printf(" inet6 addr: %s/%d", |
| 1043 | inet6_aftype.sprint((struct sockaddr *) &sap, 1), | 1030 | INET6_sprint((struct sockaddr *) &sap, 1), |
| 1044 | plen); | 1031 | plen); |
| 1045 | printf(" Scope:"); | 1032 | printf(" Scope:"); |
| 1046 | switch (scope & IPV6_ADDR_SCOPE_MASK) { | 1033 | switch (scope & IPV6_ADDR_SCOPE_MASK) { |
| 1047 | case 0: | 1034 | case 0: |
| 1048 | printf("Global"); | 1035 | puts("Global"); |
| 1049 | break; | 1036 | break; |
| 1050 | case IPV6_ADDR_LINKLOCAL: | 1037 | case IPV6_ADDR_LINKLOCAL: |
| 1051 | printf("Link"); | 1038 | puts("Link"); |
| 1052 | break; | 1039 | break; |
| 1053 | case IPV6_ADDR_SITELOCAL: | 1040 | case IPV6_ADDR_SITELOCAL: |
| 1054 | printf("Site"); | 1041 | puts("Site"); |
| 1055 | break; | 1042 | break; |
| 1056 | case IPV6_ADDR_COMPATv4: | 1043 | case IPV6_ADDR_COMPATv4: |
| 1057 | printf("Compat"); | 1044 | puts("Compat"); |
| 1058 | break; | 1045 | break; |
| 1059 | case IPV6_ADDR_LOOPBACK: | 1046 | case IPV6_ADDR_LOOPBACK: |
| 1060 | printf("Host"); | 1047 | puts("Host"); |
| 1061 | break; | 1048 | break; |
| 1062 | default: | 1049 | default: |
| 1063 | printf("Unknown"); | 1050 | puts("Unknown"); |
| 1064 | } | 1051 | } |
| 1065 | puts(""); | ||
| 1066 | } | 1052 | } |
| 1067 | } | 1053 | } |
| 1068 | fclose(f); | 1054 | fclose(f); |
| @@ -1144,14 +1130,13 @@ static void ife_print(struct interface *ptr) | |||
| 1144 | } | 1130 | } |
| 1145 | 1131 | ||
| 1146 | 1132 | ||
| 1147 | static int do_if_print(struct interface *ife, void *cookie) | 1133 | static int do_if_print(struct interface *ife) /*, int *opt_a)*/ |
| 1148 | { | 1134 | { |
| 1149 | int *opt_a = (int *) cookie; | ||
| 1150 | int res; | 1135 | int res; |
| 1151 | 1136 | ||
| 1152 | res = do_if_fetch(ife); | 1137 | res = do_if_fetch(ife); |
| 1153 | if (res >= 0) { | 1138 | if (res >= 0) { |
| 1154 | if ((ife->flags & IFF_UP) || *opt_a) | 1139 | if ((ife->flags & IFF_UP) || interface_opt_a) |
| 1155 | ife_print(ife); | 1140 | ife_print(ife); |
| 1156 | } | 1141 | } |
| 1157 | return res; | 1142 | return res; |
| @@ -1167,21 +1152,45 @@ static struct interface *lookup_interface(char *name) | |||
| 1167 | return ife; | 1152 | return ife; |
| 1168 | } | 1153 | } |
| 1169 | 1154 | ||
| 1155 | #ifdef UNUSED | ||
| 1156 | static int for_all_interfaces(int (*doit) (struct interface *, void *), | ||
| 1157 | void *cookie) | ||
| 1158 | { | ||
| 1159 | struct interface *ife; | ||
| 1160 | |||
| 1161 | if (!int_list && (if_readlist() < 0)) | ||
| 1162 | return -1; | ||
| 1163 | for (ife = int_list; ife; ife = ife->next) { | ||
| 1164 | int err = doit(ife, cookie); | ||
| 1165 | |||
| 1166 | if (err) | ||
| 1167 | return err; | ||
| 1168 | } | ||
| 1169 | return 0; | ||
| 1170 | } | ||
| 1171 | #endif | ||
| 1172 | |||
| 1170 | /* for ipv4 add/del modes */ | 1173 | /* for ipv4 add/del modes */ |
| 1171 | static int if_print(char *ifname) | 1174 | static int if_print(char *ifname) |
| 1172 | { | 1175 | { |
| 1176 | struct interface *ife; | ||
| 1173 | int res; | 1177 | int res; |
| 1174 | 1178 | ||
| 1175 | if (!ifname) { | 1179 | if (!ifname) { |
| 1176 | res = for_all_interfaces(do_if_print, &interface_opt_a); | 1180 | /*res = for_all_interfaces(do_if_print, &interface_opt_a);*/ |
| 1177 | } else { | 1181 | if (!int_list && (if_readlist() < 0)) |
| 1178 | struct interface *ife; | 1182 | return -1; |
| 1179 | 1183 | for (ife = int_list; ife; ife = ife->next) { | |
| 1180 | ife = lookup_interface(ifname); | 1184 | int err = do_if_print(ife); /*, &interface_opt_a);*/ |
| 1181 | res = do_if_fetch(ife); | 1185 | if (err) |
| 1182 | if (res >= 0) | 1186 | return err; |
| 1183 | ife_print(ife); | 1187 | } |
| 1188 | return 0; | ||
| 1184 | } | 1189 | } |
| 1190 | ife = lookup_interface(ifname); | ||
| 1191 | res = do_if_fetch(ife); | ||
| 1192 | if (res >= 0) | ||
| 1193 | ife_print(ife); | ||
| 1185 | return res; | 1194 | return res; |
| 1186 | } | 1195 | } |
| 1187 | 1196 | ||
