diff options
author | Michael Brown | 2024-02-29 14:58:50 +0100 |
---|---|---|
committer | Michael Brown | 2024-02-29 15:43:55 +0100 |
commit | da7b2662890dfb284786f37237a6c92809eee217 (patch) | |
tree | b162da60cf331f5db4f1389ebdef1556542858f2 /src/core/uuid.c | |
parent | [efi] Work around broken boot services table manipulation by UEFI shim (diff) | |
download | ipxe-da7b2662890dfb284786f37237a6c92809eee217.tar.gz ipxe-da7b2662890dfb284786f37237a6c92809eee217.tar.xz ipxe-da7b2662890dfb284786f37237a6c92809eee217.zip |
[uuid] Add uuid_aton() to parse a UUID from a string
Add uuid_aton() to parse a UUID value from a string (analogous to
inet_aton(), inet6_aton(), sock_aton(), etc), treating it as a
32-digit hex string with optional hyphen separators. The placement of
the separators is not checked: each byte within the hex string may be
separated by a hyphen, or not separated at all.
Add dedicated self-tests for UUID parsing and formatting (already
partially covered by the ":uuid" and ":guid" settings self-tests).
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/uuid.c')
-rw-r--r-- | src/core/uuid.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/core/uuid.c b/src/core/uuid.c index c43d4216..b6600af7 100644 --- a/src/core/uuid.c +++ b/src/core/uuid.c @@ -25,7 +25,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <stdint.h> #include <stdio.h> +#include <errno.h> #include <byteswap.h> +#include <ipxe/base16.h> #include <ipxe/uuid.h> /** @file @@ -53,3 +55,29 @@ const char * uuid_ntoa ( const union uuid *uuid ) { uuid->canonical.e[4], uuid->canonical.e[5] ); return buf; } + +/** + * Parse UUID + * + * @v string UUID string + * @v uuid UUID to fill in + * @ret rc Return status code + */ +int uuid_aton ( const char *string, union uuid *uuid ) { + int len; + int rc; + + /* Decode as hex string with optional '-' separator */ + len = hex_decode ( ( '-' | HEX_DECODE_OPTIONAL ), string, uuid->raw, + sizeof ( *uuid ) ); + if ( len < 0 ) { + rc = len; + return rc; + } + + /* Check length */ + if ( len != sizeof ( *uuid ) ) + return -EINVAL; + + return 0; +} |