[git commit] networking: code shrink

Denys Vlasenko vda.linux at googlemail.com
Thu Jul 25 02:39:04 UTC 2013


commit: http://git.busybox.net/busybox/commit/?id=c19be75d57ff42dee54b53e21b3eb4723b8cf243
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 TODO                   |    2 -
 include/libbb.h        |    1 +
 libbb/in_ether.c       |   58 ++++++++++++++++++++++++++++++++++++++++++++++++
 networking/ifconfig.c  |   43 -----------------------------------
 networking/interface.c |   55 +--------------------------------------------
 5 files changed, 60 insertions(+), 99 deletions(-)

diff --git a/TODO b/TODO
index b66a1c1..8d0850c 100644
--- 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>
diff --git a/include/libbb.h b/include/libbb.h
index f22c125..83e9b5f 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -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
index 0000000..dadadba
--- /dev/null
+++ b/libbb/in_ether.c
@@ -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;
+}
diff --git a/networking/ifconfig.c b/networking/ifconfig.c
index 782374b..999305a 100644
--- a/networking/ifconfig.c
+++ b/networking/ifconfig.c
@@ -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)
 {
diff --git a/networking/interface.c b/networking/interface.c
index 9ae8b3f..3dc5b36 100644
--- a/networking/interface.c
+++ b/networking/interface.c
@@ -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",


More information about the busybox-cvs mailing list