From: Johannes Berg Date: Thu, 25 Mar 2010 06:38:15 +0000 (-0700) Subject: add hex parser util X-Git-Tag: v0.9.20~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=236d41910e404366663b110a3316eee95a9618f8;p=thirdparty%2Fiw.git add hex parser util --- diff --git a/iw.h b/iw.h index 305604e..d1608e8 100644 --- a/iw.h +++ b/iw.h @@ -117,6 +117,7 @@ __u32 __listen_events(struct nl80211_state *state, int mac_addr_a2n(unsigned char *mac_addr, char *arg); void mac_addr_n2a(char *mac_addr, unsigned char *arg); +unsigned char *parse_hex(char *hex, size_t *outlen); int parse_keys(struct nl_msg *msg, char **argv, int argc); diff --git a/util.c b/util.c index 3cb7703..9fc0844 100644 --- a/util.c +++ b/util.c @@ -48,6 +48,43 @@ int mac_addr_a2n(unsigned char *mac_addr, char *arg) return 0; } +unsigned char *parse_hex(char *hex, size_t *outlen) +{ + size_t len = strlen(hex); + unsigned char *result = calloc(len/2 + 2, 1); + int pos = 0; + + if (!result) + return NULL; + + *outlen = 0; + + while (1) { + int temp; + char *cp = strchr(hex, ':'); + if (cp) { + *cp = 0; + cp++; + } + if (sscanf(hex, "%x", &temp) != 1) + goto error; + if (temp < 0 || temp > 255) + goto error; + + (*outlen)++; + + result[pos++] = temp; + if (!cp) + break; + hex = cp; + } + + return result; + error: + free(result); + return NULL; +} + static const char *ifmodes[NL80211_IFTYPE_MAX + 1] = { "unspecified", "IBSS",