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:
		
				
					committed by
					
						
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						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",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user