networking: code shrink
authorBartosz Golaszewski <bartekgola@gmail.com>
Thu, 25 Jul 2013 02:39:04 +0000 (04:39 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 25 Jul 2013 02:39:04 +0000 (04:39 +0200)
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>
TODO
include/libbb.h
libbb/in_ether.c [new file with mode: 0644]
networking/ifconfig.c
networking/interface.c

diff --git a/TODO b/TODO
index b66a1c1..8d0850c 100644 (file)
--- a/TODO
+++ b/TODO
@@ -229,8 +229,6 @@ Minor stuff:
   See grep -r strtod
   Alot of duplication that wants cleanup.
 ---
-  in_ether duplicated in network/{interface,ifconfig}.c
----
   unify progress_meter. wget, flash_eraseall, pipe_progress, fbsplash, setfiles.
 ---
   support start-stop-daemon -d <chdir-path>
index f22c125..83e9b5f 100644 (file)
@@ -1140,6 +1140,7 @@ struct hwtype {
 };
 extern smallint interface_opt_a;
 int display_interfaces(char *ifname) FAST_FUNC;
+int in_ether(const char *bufp, struct sockaddr *sap) FAST_FUNC;
 #if ENABLE_FEATURE_HWIB
 int in_ib(const char *bufp, struct sockaddr *sap) FAST_FUNC;
 #else
diff --git a/libbb/in_ether.c b/libbb/in_ether.c
new file mode 100644 (file)
index 0000000..dadadba
--- /dev/null
@@ -0,0 +1,58 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Utility routines.
+ */
+
+//kbuild:lib-$(CONFIG_IFCONFIG) += in_ether.o
+//kbuild:lib-$(CONFIG_IFENSLAVE) += in_ether.o
+
+#include "libbb.h"
+#include <net/if_arp.h>
+#include <net/ethernet.h>
+
+/* Convert Ethernet address from "XX[:]XX[:]XX[:]XX[:]XX[:]XX" to sockaddr.
+ * Return nonzero on error.
+ */
+int FAST_FUNC in_ether(const char *bufp, struct sockaddr *sap)
+{
+       char *ptr;
+       int i, j;
+       unsigned char val;
+       unsigned char c;
+
+       sap->sa_family = ARPHRD_ETHER;
+       ptr = (char *) sap->sa_data;
+
+       i = ETH_ALEN;
+       goto first;
+       do {
+               /* We might get a semicolon here */
+               if (*bufp == ':')
+                       bufp++;
+ first:
+               j = val = 0;
+               do {
+                       c = *bufp;
+                       if (((unsigned char)(c - '0')) <= 9) {
+                               c -= '0';
+                       } else if ((unsigned char)((c|0x20) - 'a') <= 5) {
+                               c = (unsigned char)((c|0x20) - 'a') + 10;
+                       } else {
+                               if (j && (c == ':' || c == '\0'))
+                                       /* One-digit byte: __:X:__ */
+                                       break;
+                               return -1;
+                       }
+                       ++bufp;
+                       val <<= 4;
+                       val += c;
+                       j ^= 1;
+               } while (j);
+
+               *ptr++ = val;
+
+       } while (--i);
+
+       /* Error if we aren't at end of string */
+       return *bufp;
+}
index 782374b..999305a 100644 (file)
@@ -265,49 +265,6 @@ static const struct options OptArray[] = {
        { NULL,          0,             ARG_HOSTNAME,    (IFF_UP | IFF_RUNNING) }
 };
 
-#if ENABLE_FEATURE_IFCONFIG_HW
-/* Input an Ethernet address and convert to binary. */
-static int in_ether(const char *bufp, struct sockaddr *sap)
-{
-       char *ptr;
-       int i, j;
-       unsigned char val;
-       unsigned char c;
-
-       sap->sa_family = ARPHRD_ETHER;
-       ptr = (char *) sap->sa_data;
-
-       i = 0;
-       do {
-               j = val = 0;
-
-               /* We might get a semicolon here - not required. */
-               if (i && (*bufp == ':')) {
-                       bufp++;
-               }
-
-               do {
-                       c = *bufp;
-                       if (((unsigned char)(c - '0')) <= 9) {
-                               c -= '0';
-                       } else if ((unsigned char)((c|0x20) - 'a') <= 5) {
-                               c = (unsigned char)((c|0x20) - 'a') + 10;
-                       } else if (j && (c == ':' || c == 0)) {
-                               break;
-                       } else {
-                               return -1;
-                       }
-                       ++bufp;
-                       val <<= 4;
-                       val += c;
-               } while (++j < 2);
-               *ptr++ = val;
-       } while (++i < ETH_ALEN);
-
-       return *bufp; /* Error if we don't end at end of string. */
-}
-#endif
-
 int ifconfig_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int ifconfig_main(int argc UNUSED_PARAM, char **argv)
 {
index 9ae8b3f..3dc5b36 100644 (file)
@@ -722,68 +722,15 @@ static char* FAST_FUNC ether_print(unsigned char *ptr)
        return buff;
 }
 
-static int FAST_FUNC ether_input(const char *bufp, struct sockaddr *sap);
-
 static const struct hwtype ether_hwtype = {
        .name  = "ether",
        .title = "Ethernet",
        .type  = ARPHRD_ETHER,
        .alen  = ETH_ALEN,
        .print = ether_print,
-       .input = ether_input
+       .input = in_ether
 };
 
-static unsigned hexchar2int(char c)
-{
-       if (isdigit(c))
-               return c - '0';
-       c &= ~0x20; /* a -> A */
-       if ((unsigned)(c - 'A') <= 5)
-               return c - ('A' - 10);
-       return ~0U;
-}
-
-/* Input an Ethernet address and convert to binary. */
-static int FAST_FUNC ether_input(const char *bufp, struct sockaddr *sap)
-{
-       unsigned char *ptr;
-       char c;
-       int i;
-       unsigned val;
-
-       sap->sa_family = ether_hwtype.type;
-       ptr = (unsigned char*) sap->sa_data;
-
-       i = 0;
-       while ((*bufp != '\0') && (i < ETH_ALEN)) {
-               val = hexchar2int(*bufp++) * 0x10;
-               if (val > 0xff) {
-                       errno = EINVAL;
-                       return -1;
-               }
-               c = *bufp;
-               if (c == ':' || c == 0)
-                       val >>= 4;
-               else {
-                       val |= hexchar2int(c);
-                       if (val > 0xff) {
-                               errno = EINVAL;
-                               return -1;
-                       }
-               }
-               if (c != 0)
-                       bufp++;
-               *ptr++ = (unsigned char) val;
-               i++;
-
-               /* We might get a semicolon here - not required. */
-               if (*bufp == ':') {
-                       bufp++;
-               }
-       }
-       return 0;
-}
-
 static const struct hwtype ppp_hwtype = {
        .name =         "ppp",
        .title =        "Point-to-Point Protocol",