diff options
Diffstat (limited to 'src/network/ether.c')
| -rw-r--r-- | src/network/ether.c | 43 | 
1 files changed, 43 insertions, 0 deletions
| diff --git a/src/network/ether.c b/src/network/ether.c new file mode 100644 index 00000000..ac55411a --- /dev/null +++ b/src/network/ether.c @@ -0,0 +1,43 @@ +#include <stdlib.h> +#include <netinet/ether.h> +#include <stdio.h> + +struct ether_addr *ether_aton_r (const char *x, struct ether_addr *p_a) +{ +	struct ether_addr a; +	char *y; +	for (int ii = 0; ii < 6; ii++) { +		unsigned long int n; +		if (ii != 0) { +			if (x[0] != ':') return 0; /* bad format */ +			else x++; +		} +		n = strtoul (x, &y, 16); +		x = y; +		if (n > 0xFF) return 0; /* bad byte */ +		a.ether_addr_octet[ii] = n; +	} +	if (x[0] != 0) return 0; /* bad format */ +	*p_a = a; +	return p_a; +} + +struct ether_addr *ether_aton (const char *x) +{ +	static struct ether_addr a; +	return ether_aton_r (x, &a); +} + +char *ether_ntoa_r (const struct ether_addr *p_a, char *x) { +	char *y; +	y = x; +	for (int ii = 0; ii < 6; ii++) { +		x += sprintf (x, ii == 0 ? "%.2X" : ":%.2X", p_a->ether_addr_octet[ii]); +	} +	return y; +} + +char *ether_ntoa (const struct ether_addr *p_a) { +	static char x[18]; +	return ether_ntoa_r (p_a, x); +} | 
