|
|
Message-Id: <1350764145-10305-5-git-send-email-awg@embtoolkit.org>
Date: Sat, 20 Oct 2012 22:15:45 +0200
From: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
To: musl@...ts.openwall.com
Cc: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
Subject: [PATCH 4/4] <netinet/ether.h>: Add GNU extensions ether_ntoa_r() and ether_aton_r()
Signed-off-by: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
---
include/netinet/ether.h | 2 ++
src/network/ethers.c | 59 +++++++++++++++++++++++++++++++++++------------
2 files changed, 46 insertions(+), 15 deletions(-)
diff --git a/include/netinet/ether.h b/include/netinet/ether.h
index 44c614e..55be0d8 100644
--- a/include/netinet/ether.h
+++ b/include/netinet/ether.h
@@ -5,7 +5,9 @@
__BEGIN_DECLS
char *ether_ntoa(const struct ether_addr *);
+char *ether_ntoa_r(const struct ether_addr *, char *);
struct ether_addr *ether_aton(const char *);
+struct ether_addr *ether_aton_r(const char *, struct ether_addr *);
int ether_ntohost(char *, const struct ether_addr *);
int ether_hostton(const char *, struct ether_addr *);
int ether_line(const char *, struct ether_addr *, char *);
diff --git a/src/network/ethers.c b/src/network/ethers.c
index 8014581..930712e 100644
--- a/src/network/ethers.c
+++ b/src/network/ethers.c
@@ -36,13 +36,25 @@ char *ether_ntoa(const struct ether_addr *e)
{
static char a[18];
+ return ether_ntoa_r(e, a);
+}
+
+/*
+ * ether_ntoa_r():
+ * Thread safe version of ether_ntoa() (does not make use of static buffer).
+ */
+char *ether_ntoa_r(const struct ether_addr *e, char *a)
+{
+ int sz;
assert(e != NULL);
+ assert(a != NULL);
+
+ sz = sprintf(a, "%02x:%02x:%02x:%02x:%02x:%02x",
+ e->ether_addr_octet[0], e->ether_addr_octet[1],
+ e->ether_addr_octet[2], e->ether_addr_octet[3],
+ e->ether_addr_octet[4], e->ether_addr_octet[5]);
- (void) snprintf(a, sizeof a, "%02x:%02x:%02x:%02x:%02x:%02x",
- e->ether_addr_octet[0], e->ether_addr_octet[1],
- e->ether_addr_octet[2], e->ether_addr_octet[3],
- e->ether_addr_octet[4], e->ether_addr_octet[5]);
- return a;
+ return sz < 17 ? NULL : a;
}
/*
@@ -54,20 +66,37 @@ char *ether_ntoa(const struct ether_addr *e)
struct ether_addr *ether_aton(const char *s)
{
static struct ether_addr n;
- unsigned int i[6];
assert(s != NULL);
- if (sscanf(s, " %x:%x:%x:%x:%x:%x ", &i[0], &i[1],
- &i[2], &i[3], &i[4], &i[5]) == 6) {
- n.ether_addr_octet[0] = (unsigned char)i[0];
- n.ether_addr_octet[1] = (unsigned char)i[1];
- n.ether_addr_octet[2] = (unsigned char)i[2];
- n.ether_addr_octet[3] = (unsigned char)i[3];
- n.ether_addr_octet[4] = (unsigned char)i[4];
- n.ether_addr_octet[5] = (unsigned char)i[5];
- return &n;
+ return ether_aton_r(s, &n);
+}
+
+/*
+ * ether_aton_r():
+ * Thread safe version of ether_aton(), (does not make use of static structure).
+ */
+struct ether_addr *ether_aton_r(const char *s, struct ether_addr *n)
+{
+ unsigned int i[6];
+ int sz;
+
+ assert(s != NULL);
+ assert(n != NULL);
+
+ sz = sscanf(s, " %x:%x:%x:%x:%x:%x ",
+ &i[0], &i[1], &i[2], &i[3], &i[4], &i[5]);
+
+ if (sz == 6) {
+ n->ether_addr_octet[0] = (unsigned char)i[0];
+ n->ether_addr_octet[1] = (unsigned char)i[1];
+ n->ether_addr_octet[2] = (unsigned char)i[2];
+ n->ether_addr_octet[3] = (unsigned char)i[3];
+ n->ether_addr_octet[4] = (unsigned char)i[4];
+ n->ether_addr_octet[5] = (unsigned char)i[5];
+ return n;
}
+
return NULL;
}
--
1.7.9.5
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.