aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Golaszewski <bartekgola@gmail.com>2013-07-25 04:39:04 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2013-07-25 04:39:04 +0200
commitc19be75d57ff42dee54b53e21b3eb4723b8cf243 (patch)
tree7fc65e75d2c91ee1021e327aaa4e1ba0e81ccb15
parentb855460adcda8dfb18ac36755f128ce32088ae87 (diff)
downloadbusybox-w32-c19be75d57ff42dee54b53e21b3eb4723b8cf243.tar.gz
busybox-w32-c19be75d57ff42dee54b53e21b3eb4723b8cf243.tar.bz2
busybox-w32-c19be75d57ff42dee54b53e21b3eb4723b8cf243.zip
networking: code shrink
function old new delta in_ether - 124 +124 hexchar2int 42 - -42 ifconfig_main 1237 1106 -131 ether_input 141 - -141 ------------------------------------------------------------------------------ (add/remove: 2/2 grow/shrink: 0/1 up/down: 124/-314) Total: -190 bytes Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--TODO2
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/in_ether.c58
-rw-r--r--networking/ifconfig.c43
-rw-r--r--networking/interface.c55
5 files changed, 60 insertions, 99 deletions
diff --git a/TODO b/TODO
index b66a1c1cb..8d0850cd7 100644
--- a/TODO
+++ b/TODO
@@ -229,8 +229,6 @@ Minor stuff:
229 See grep -r strtod 229 See grep -r strtod
230 Alot of duplication that wants cleanup. 230 Alot of duplication that wants cleanup.
231--- 231---
232 in_ether duplicated in network/{interface,ifconfig}.c
233---
234 unify progress_meter. wget, flash_eraseall, pipe_progress, fbsplash, setfiles. 232 unify progress_meter. wget, flash_eraseall, pipe_progress, fbsplash, setfiles.
235--- 233---
236 support start-stop-daemon -d <chdir-path> 234 support start-stop-daemon -d <chdir-path>
diff --git a/include/libbb.h b/include/libbb.h
index f22c1252b..83e9b5fb9 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1140,6 +1140,7 @@ struct hwtype {
1140}; 1140};
1141extern smallint interface_opt_a; 1141extern smallint interface_opt_a;
1142int display_interfaces(char *ifname) FAST_FUNC; 1142int display_interfaces(char *ifname) FAST_FUNC;
1143int in_ether(const char *bufp, struct sockaddr *sap) FAST_FUNC;
1143#if ENABLE_FEATURE_HWIB 1144#if ENABLE_FEATURE_HWIB
1144int in_ib(const char *bufp, struct sockaddr *sap) FAST_FUNC; 1145int in_ib(const char *bufp, struct sockaddr *sap) FAST_FUNC;
1145#else 1146#else
diff --git a/libbb/in_ether.c b/libbb/in_ether.c
new file mode 100644
index 000000000..dadadbafe
--- /dev/null
+++ b/libbb/in_ether.c
@@ -0,0 +1,58 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 */
5
6//kbuild:lib-$(CONFIG_IFCONFIG) += in_ether.o
7//kbuild:lib-$(CONFIG_IFENSLAVE) += in_ether.o
8
9#include "libbb.h"
10#include <net/if_arp.h>
11#include <net/ethernet.h>
12
13/* Convert Ethernet address from "XX[:]XX[:]XX[:]XX[:]XX[:]XX" to sockaddr.
14 * Return nonzero on error.
15 */
16int FAST_FUNC in_ether(const char *bufp, struct sockaddr *sap)
17{
18 char *ptr;
19 int i, j;
20 unsigned char val;
21 unsigned char c;
22
23 sap->sa_family = ARPHRD_ETHER;
24 ptr = (char *) sap->sa_data;
25
26 i = ETH_ALEN;
27 goto first;
28 do {
29 /* We might get a semicolon here */
30 if (*bufp == ':')
31 bufp++;
32 first:
33 j = val = 0;
34 do {
35 c = *bufp;
36 if (((unsigned char)(c - '0')) <= 9) {
37 c -= '0';
38 } else if ((unsigned char)((c|0x20) - 'a') <= 5) {
39 c = (unsigned char)((c|0x20) - 'a') + 10;
40 } else {
41 if (j && (c == ':' || c == '\0'))
42 /* One-digit byte: __:X:__ */
43 break;
44 return -1;
45 }
46 ++bufp;
47 val <<= 4;
48 val += c;
49 j ^= 1;
50 } while (j);
51
52 *ptr++ = val;
53
54 } while (--i);
55
56 /* Error if we aren't at end of string */
57 return *bufp;
58}
diff --git a/networking/ifconfig.c b/networking/ifconfig.c
index 782374b35..999305aff 100644
--- a/networking/ifconfig.c
+++ b/networking/ifconfig.c
@@ -265,49 +265,6 @@ static const struct options OptArray[] = {
265 { NULL, 0, ARG_HOSTNAME, (IFF_UP | IFF_RUNNING) } 265 { NULL, 0, ARG_HOSTNAME, (IFF_UP | IFF_RUNNING) }
266}; 266};
267 267
268#if ENABLE_FEATURE_IFCONFIG_HW
269/* Input an Ethernet address and convert to binary. */
270static int in_ether(const char *bufp, struct sockaddr *sap)
271{
272 char *ptr;
273 int i, j;
274 unsigned char val;
275 unsigned char c;
276
277 sap->sa_family = ARPHRD_ETHER;
278 ptr = (char *) sap->sa_data;
279
280 i = 0;
281 do {
282 j = val = 0;
283
284 /* We might get a semicolon here - not required. */
285 if (i && (*bufp == ':')) {
286 bufp++;
287 }
288
289 do {
290 c = *bufp;
291 if (((unsigned char)(c - '0')) <= 9) {
292 c -= '0';
293 } else if ((unsigned char)((c|0x20) - 'a') <= 5) {
294 c = (unsigned char)((c|0x20) - 'a') + 10;
295 } else if (j && (c == ':' || c == 0)) {
296 break;
297 } else {
298 return -1;
299 }
300 ++bufp;
301 val <<= 4;
302 val += c;
303 } while (++j < 2);
304 *ptr++ = val;
305 } while (++i < ETH_ALEN);
306
307 return *bufp; /* Error if we don't end at end of string. */
308}
309#endif
310
311int ifconfig_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 268int ifconfig_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
312int ifconfig_main(int argc UNUSED_PARAM, char **argv) 269int ifconfig_main(int argc UNUSED_PARAM, char **argv)
313{ 270{
diff --git a/networking/interface.c b/networking/interface.c
index 9ae8b3f03..3dc5b3640 100644
--- a/networking/interface.c
+++ b/networking/interface.c
@@ -722,68 +722,15 @@ static char* FAST_FUNC ether_print(unsigned char *ptr)
722 return buff; 722 return buff;
723} 723}
724 724
725static int FAST_FUNC ether_input(const char *bufp, struct sockaddr *sap);
726
727static const struct hwtype ether_hwtype = { 725static const struct hwtype ether_hwtype = {
728 .name = "ether", 726 .name = "ether",
729 .title = "Ethernet", 727 .title = "Ethernet",
730 .type = ARPHRD_ETHER, 728 .type = ARPHRD_ETHER,
731 .alen = ETH_ALEN, 729 .alen = ETH_ALEN,
732 .print = ether_print, 730 .print = ether_print,
733 .input = ether_input 731 .input = in_ether
734}; 732};
735 733
736static unsigned hexchar2int(char c)
737{
738 if (isdigit(c))
739 return c - '0';
740 c &= ~0x20; /* a -> A */
741 if ((unsigned)(c - 'A') <= 5)
742 return c - ('A' - 10);
743 return ~0U;
744}
745
746/* Input an Ethernet address and convert to binary. */
747static int FAST_FUNC ether_input(const char *bufp, struct sockaddr *sap)
748{
749 unsigned char *ptr;
750 char c;
751 int i;
752 unsigned val;
753
754 sap->sa_family = ether_hwtype.type;
755 ptr = (unsigned char*) sap->sa_data;
756
757 i = 0;
758 while ((*bufp != '\0') && (i < ETH_ALEN)) {
759 val = hexchar2int(*bufp++) * 0x10;
760 if (val > 0xff) {
761 errno = EINVAL;
762 return -1;
763 }
764 c = *bufp;
765 if (c == ':' || c == 0)
766 val >>= 4;
767 else {
768 val |= hexchar2int(c);
769 if (val > 0xff) {
770 errno = EINVAL;
771 return -1;
772 }
773 }
774 if (c != 0)
775 bufp++;
776 *ptr++ = (unsigned char) val;
777 i++;
778
779 /* We might get a semicolon here - not required. */
780 if (*bufp == ':') {
781 bufp++;
782 }
783 }
784 return 0;
785}
786
787static const struct hwtype ppp_hwtype = { 734static const struct hwtype ppp_hwtype = {
788 .name = "ppp", 735 .name = "ppp",
789 .title = "Point-to-Point Protocol", 736 .title = "Point-to-Point Protocol",