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
|
See grep -r strtod
|
||||||
Alot of duplication that wants cleanup.
|
Alot of duplication that wants cleanup.
|
||||||
---
|
|
||||||
in_ether duplicated in network/{interface,ifconfig}.c
|
|
||||||
---
|
---
|
||||||
unify progress_meter. wget, flash_eraseall, pipe_progress, fbsplash, setfiles.
|
unify progress_meter. wget, flash_eraseall, pipe_progress, fbsplash, setfiles.
|
||||||
---
|
---
|
||||||
|
@ -1140,6 +1140,7 @@ struct hwtype {
|
|||||||
};
|
};
|
||||||
extern smallint interface_opt_a;
|
extern smallint interface_opt_a;
|
||||||
int display_interfaces(char *ifname) FAST_FUNC;
|
int display_interfaces(char *ifname) FAST_FUNC;
|
||||||
|
int in_ether(const char *bufp, struct sockaddr *sap) FAST_FUNC;
|
||||||
#if ENABLE_FEATURE_HWIB
|
#if ENABLE_FEATURE_HWIB
|
||||||
int in_ib(const char *bufp, struct sockaddr *sap) FAST_FUNC;
|
int in_ib(const char *bufp, struct sockaddr *sap) FAST_FUNC;
|
||||||
#else
|
#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) }
|
{ 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, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int ifconfig_main(int argc UNUSED_PARAM, char **argv)
|
int ifconfig_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -722,68 +722,15 @@ static char* FAST_FUNC ether_print(unsigned char *ptr)
|
|||||||
return buff;
|
return buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int FAST_FUNC ether_input(const char *bufp, struct sockaddr *sap);
|
|
||||||
|
|
||||||
static const struct hwtype ether_hwtype = {
|
static const struct hwtype ether_hwtype = {
|
||||||
.name = "ether",
|
.name = "ether",
|
||||||
.title = "Ethernet",
|
.title = "Ethernet",
|
||||||
.type = ARPHRD_ETHER,
|
.type = ARPHRD_ETHER,
|
||||||
.alen = ETH_ALEN,
|
.alen = ETH_ALEN,
|
||||||
.print = ether_print,
|
.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 = {
|
static const struct hwtype ppp_hwtype = {
|
||||||
.name = "ppp",
|
.name = "ppp",
|
||||||
.title = "Point-to-Point Protocol",
|
.title = "Point-to-Point Protocol",
|
||||||
|
Loading…
Reference in New Issue
Block a user