diff mbox

[U-Boot,v3,1/3] lib: add uuid_str_to_bin for use with bootp and PXE uuid

Message ID 1309366710-17400-2-git-send-email-jason.hobbs@calxeda.com
State Superseded
Headers show

Commit Message

Jason Hobbs June 29, 2011, 4:58 p.m. UTC
Signed-off-by: Jason Hobbs <jason.hobbs@calxeda.com>
---
Changes for v2:
- Move uuid_str_to_bin's prototype from uuid. to common.h
- Place uuid.o make rule in sorted order and conditionalize

Changes for v3:
- Check for NULL pointers in uuid conversion function

 include/common.h |    3 +++
 lib/Makefile     |    1 +
 lib/uuid.c       |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 57 insertions(+), 0 deletions(-)
 create mode 100644 lib/uuid.c

Comments

Wolfgang Denk July 25, 2011, 9:37 p.m. UTC | #1
Dear "Jason Hobbs",

In message <1309366710-17400-2-git-send-email-jason.hobbs@calxeda.com> you wrote:
> Signed-off-by: Jason Hobbs <jason.hobbs@calxeda.com>
...
> +void uuid_str_to_bin(const char *uuid, unsigned char *out)
> +{
> +	uint16_t tmp16;
> +	uint32_t tmp32;
> +	uint64_t tmp64;
> +
> +	if (!uuid || !out)
> +		return;
> +
> +	tmp32 = cpu_to_le32(simple_strtoul(uuid, NULL, 16));
> +	memcpy(out, &tmp32, 4);
> +
> +	tmp16 = cpu_to_le16(simple_strtoul(uuid + 9, NULL, 16));
> +	memcpy(out + 4, &tmp16, 2);
> +
> +	tmp16 = cpu_to_le16(simple_strtoul(uuid + 14, NULL, 16));
> +	memcpy(out + 6, &tmp16, 2);
> +
> +	tmp16 = cpu_to_be16(simple_strtoul(uuid + 19, NULL, 16));
> +	memcpy(out + 8, &tmp16, 2);
> +
> +	tmp64 = cpu_to_be64(simple_strtoull(uuid + 24, NULL, 16));
> +	memcpy(out + 10, (char *)&tmp64 + 2, 6);
> +}

I asked this before, and I repeat my question: Should we not add at
least basic error checking?  Like verifying that the input string is
actually long enough for what we are doing here?

Best regards,

Wolfgang Denk
Jason Hobbs July 26, 2011, 9:48 p.m. UTC | #2
On Mon, Jul 25, 2011 at 11:37:34PM +0200, Wolfgang Denk wrote:
> > +void uuid_str_to_bin(const char *uuid, unsigned char *out)

I will add a separate function to verify the format of a UUID string.
It doesn't belong in this function, which otherwise only needs to read
the string once.  It will check for length, that '-' is placed
appropriately, and that proper hexadecimal numbers are used.

Thanks,
Jason
diff mbox

Patch

diff --git a/include/common.h b/include/common.h
index 1e21b7a..77c27a1 100644
--- a/include/common.h
+++ b/include/common.h
@@ -645,6 +645,9 @@  int strcmp_compar(const void *, const void *);
 /* lib/time.c */
 void	udelay        (unsigned long);
 
+/* lib/uuid.c */
+void uuid_str_to_bin(const char *uuid, unsigned char *out);
+
 /* lib/vsprintf.c */
 ulong	simple_strtoul(const char *cp,char **endp,unsigned int base);
 int strict_strtoul(const char *cp, unsigned int base, unsigned long *res);
diff --git a/lib/Makefile b/lib/Makefile
index afa6914..a8e0920 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -51,6 +51,7 @@  COBJS-$(CONFIG_SHA256) += sha256.o
 COBJS-y += string.o
 COBJS-y	+= strmhz.o
 COBJS-y += time.o
+COBJS-$(CONFIG_BOOTP_PXE) += uuid.o
 COBJS-y += vsprintf.o
 COBJS-$(CONFIG_RBTREE)	+= rbtree.o
 
diff --git a/lib/uuid.c b/lib/uuid.c
new file mode 100644
index 0000000..2270245
--- /dev/null
+++ b/lib/uuid.c
@@ -0,0 +1,53 @@ 
+/*
+ * Copyright 2011 Calxeda, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include "common.h"
+
+/*
+ * 0        9    14   19   24
+ * xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
+ *    le     le   le   be       be
+ */
+void uuid_str_to_bin(const char *uuid, unsigned char *out)
+{
+	uint16_t tmp16;
+	uint32_t tmp32;
+	uint64_t tmp64;
+
+	if (!uuid || !out)
+		return;
+
+	tmp32 = cpu_to_le32(simple_strtoul(uuid, NULL, 16));
+	memcpy(out, &tmp32, 4);
+
+	tmp16 = cpu_to_le16(simple_strtoul(uuid + 9, NULL, 16));
+	memcpy(out + 4, &tmp16, 2);
+
+	tmp16 = cpu_to_le16(simple_strtoul(uuid + 14, NULL, 16));
+	memcpy(out + 6, &tmp16, 2);
+
+	tmp16 = cpu_to_be16(simple_strtoul(uuid + 19, NULL, 16));
+	memcpy(out + 8, &tmp16, 2);
+
+	tmp64 = cpu_to_be64(simple_strtoull(uuid + 24, NULL, 16));
+	memcpy(out + 10, (char *)&tmp64 + 2, 6);
+}