networking: code shrink
No binary (build failed)
—
(log yok)
| @@ -228,8 +228,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. | |
| --- | |
| @@ -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 | |
| @@ -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; |
| + | } |
| @@ -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) | |
| { | |
| @@ -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", | |