diff options
author | Rich Felker <dalias@aerifal.cx> | 2013-06-25 21:15:27 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2013-06-25 21:15:27 -0400 |
commit | 83966b369d2fa105a58a35830f75662e18273965 (patch) | |
tree | 73d3648ede6d3427c23efeaa2f026400c652de92 | |
parent | ef5507867b59d19f21437970e87b5d0415c07b2e (diff) | |
download | musl-83966b369d2fa105a58a35830f75662e18273965.tar.gz musl-83966b369d2fa105a58a35830f75662e18273965.tar.bz2 musl-83966b369d2fa105a58a35830f75662e18273965.tar.xz musl-83966b369d2fa105a58a35830f75662e18273965.zip |
add ether_aton[_r] and ether_ntoa[_r] functions
based on patch by Strake with minor stylistic changes, and combined
into a single file. this patch remained open for a long time due to
some question as to whether ether_aton would be better implemented in
terms of sscanf, and it's time something was committed, so here it is.
-rw-r--r-- | include/netinet/ether.h | 14 | ||||
-rw-r--r-- | src/network/ether.c | 43 |
2 files changed, 57 insertions, 0 deletions
diff --git a/include/netinet/ether.h b/include/netinet/ether.h new file mode 100644 index 00000000..c5179d5e --- /dev/null +++ b/include/netinet/ether.h @@ -0,0 +1,14 @@ +#ifndef _NETINET_ETHER_H +#define _NETINET_ETHER_H + +#include <netinet/if_ether.h> + +char *ether_ntoa (const struct ether_addr *); + +struct ether_addr *ether_aton (const char *); + +char *ether_ntoa_r (const struct ether_addr *, char *); + +struct ether_addr *ether_aton_r (const char *, struct ether_addr *); + +#endif 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); +} |