From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from tango.tkos.co.il ([62.219.50.35]) by bombadil.infradead.org with esmtps (Exim 4.72 #1 (Red Hat Linux)) id 1OgyY1-0001Jg-Kl for barebox@lists.infradead.org; Thu, 05 Aug 2010 11:23:43 +0000 From: Baruch Siach Date: Thu, 5 Aug 2010 14:23:17 +0300 Message-Id: List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: barebox-bounces@lists.infradead.org Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH 1/2] misc: introduce string_to_bin To: barebox@lists.infradead.org Factor out string_to_bin from string_to_ethaddr. string_to_bin is useful for other hex data strings. Signed-off-by: Baruch Siach --- include/common.h | 1 + lib/misc.c | 29 +++++++++++++++++++++++++++++ net/net.c | 17 +---------------- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/include/common.h b/include/common.h index 0edc778..f600eb0 100644 --- a/include/common.h +++ b/include/common.h @@ -127,6 +127,7 @@ struct memarea_info { int spec_str_to_info(const char *str, struct memarea_info *info); int parse_area_spec(const char *str, ulong *start, ulong *size); +int string_to_bin(const char *str, u8 *buf, unsigned int buflen); /* Just like simple_strtoul(), but this one honors a K/M/G suffix */ unsigned long strtoul_suffix(const char *str, char **endp, int base); diff --git a/lib/misc.c b/lib/misc.c index 549b960..7735725 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -107,3 +107,32 @@ int parse_area_spec(const char *str, ulong *start, ulong *size) return -1; } EXPORT_SYMBOL(parse_area_spec); + +/* + * This function parses strings in the form "xx:xx:xx...", where x is an + * hexadecimal digit. + */ +int string_to_bin(const char *str, u8 *buf, unsigned int buflen) +{ + int i; + char *e; + + if (!str || strlen(str) != buflen*3 - 1) + return -1; + + for (i = 0; i < buflen-1; i++) + if (str[i*3 + 2] != ':') + return -1; + + for (i = 0; str[i]; i++) + if (!isxdigit(str[i]) && !(str[i] == ':')) + return -1; + + for (i = 0; i < buflen; i++) { + buf[i] = simple_strtoul(str, &e, 16); + str = e + 1; + } + + return 0; +} +EXPORT_SYMBOL(string_to_bin); diff --git a/net/net.c b/net/net.c index 8d99595..017de8b 100644 --- a/net/net.c +++ b/net/net.c @@ -161,22 +161,7 @@ void print_IPaddr (IPaddr_t x) int string_to_ethaddr(const char *str, char *enetaddr) { - int reg; - char *e; - - if (!str || strlen(str) != 17) - return -1; - - if (str[2] != ':' || str[5] != ':' || str[8] != ':' || - str[11] != ':' || str[14] != ':') - return -1; - - for (reg = 0; reg < 6; ++reg) { - enetaddr[reg] = simple_strtoul (str, &e, 16); - str = e + 1; - } - - return 0; + return string_to_bin(str, enetaddr, 6); } void ethaddr_to_string(const unsigned char *enetaddr, char *str) -- 1.7.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox