mirror of
https://github.com/ipxe/ipxe
synced 2026-04-16 03:00:10 +03:00
[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>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user