mirror of
https://git.busybox.net/busybox.git
synced 2024-11-30 17:13:32 +08:00
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:
parent
b855460adc
commit
c19be75d57
2
TODO
2
TODO
@ -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
|
||||
|
58
libbb/in_ether.c
Normal file
58
libbb/in_ether.c
Normal 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;
|
||||
}
|
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user