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>
This commit is contained in:
Bartosz Golaszewski 2013-07-25 04:39:04 +02:00 committed by Denys Vlasenko
parent b855460adc
commit c19be75d57
5 changed files with 60 additions and 99 deletions

2
TODO
View File

@ -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.
---

View 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

58
libbb/in_ether.c Normal file
View File

@ -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;
}

View 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)
{

View 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",