summaryrefslogtreecommitdiffstats
path: root/src/core/base16.c
diff options
context:
space:
mode:
authorMichael Brown2024-02-29 14:58:50 +0100
committerMichael Brown2024-02-29 15:43:55 +0100
commitda7b2662890dfb284786f37237a6c92809eee217 (patch)
treeb162da60cf331f5db4f1389ebdef1556542858f2 /src/core/base16.c
parent[efi] Work around broken boot services table manipulation by UEFI shim (diff)
downloadipxe-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/base16.c')
-rw-r--r--src/core/base16.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/core/base16.c b/src/core/base16.c
index f9e0f336..47e35f41 100644
--- a/src/core/base16.c
+++ b/src/core/base16.c
@@ -78,12 +78,23 @@ int hex_decode ( char separator, const char *encoded, void *data, size_t len ) {
unsigned int count = 0;
unsigned int sixteens;
unsigned int units;
+ int optional;
+ /* Strip out optionality flag from separator character */
+ optional = ( separator & HEX_DECODE_OPTIONAL );
+ separator &= ~HEX_DECODE_OPTIONAL;
+
+ /* Decode string */
while ( *encoded ) {
/* Check separator, if applicable */
- if ( count && separator && ( ( *(encoded++) != separator ) ) )
- return -EINVAL;
+ if ( count && separator ) {
+ if ( *encoded == separator ) {
+ encoded++;
+ } else if ( ! optional ) {
+ return -EINVAL;
+ }
+ }
/* Extract digits. Note that either digit may be NUL,
* which would be interpreted as an invalid value by