diff options
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | include/libbb.h | 1 | ||||
-rw-r--r-- | libbb/in_ether.c | 58 | ||||
-rw-r--r-- | networking/ifconfig.c | 43 | ||||
-rw-r--r-- | networking/interface.c | 55 |
5 files changed, 60 insertions, 99 deletions
@@ -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 f22c1252b..83e9b5fb9 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 000000000..dadadbafe --- /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 782374b35..999305aff 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 9ae8b3f03..3dc5b3640 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", |