diff --git a/src/core/settings.c b/src/core/settings.c index 42caae0c..b8833c8d 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -1767,6 +1767,34 @@ static int format_hex_hyphen_setting ( const void *raw, size_t raw_len, return format_hex_setting ( raw, raw_len, buf, len, "-" ); } +/** + * Parse hex string setting value (using no delimiter) + * + * @v value Formatted setting value + * @v buf Buffer to contain raw value + * @v len Length of buffer + * @v size Integer size, in bytes + * @ret len Length of raw value, or negative error + */ +static int parse_hex_raw_setting ( const char *value, void *buf, + size_t len ) { + return hex_decode ( value, 0, buf, len ); +} + +/** + * Format hex string setting value (using no delimiter) + * + * @v raw Raw setting value + * @v raw_len Length of raw setting value + * @v buf Buffer to contain formatted value + * @v len Length of buffer + * @ret len Length of formatted value, or negative error + */ +static int format_hex_raw_setting ( const void *raw, size_t raw_len, + char *buf, size_t len ) { + return format_hex_setting ( raw, raw_len, buf, len, "" ); +} + /** A hex-string setting (colon-delimited) */ struct setting_type setting_type_hex __setting_type = { .name = "hex", @@ -1781,6 +1809,13 @@ struct setting_type setting_type_hexhyp __setting_type = { .format = format_hex_hyphen_setting, }; +/** A hex-string setting (non-delimited) */ +struct setting_type setting_type_hexraw __setting_type = { + .name = "hexraw", + .parse = parse_hex_raw_setting, + .format = format_hex_raw_setting, +}; + /** * Parse UUID setting value * diff --git a/src/include/ipxe/settings.h b/src/include/ipxe/settings.h index 9b7404ac..7ceb55ca 100644 --- a/src/include/ipxe/settings.h +++ b/src/include/ipxe/settings.h @@ -322,6 +322,7 @@ extern struct setting_type setting_type_uint16 __setting_type; extern struct setting_type setting_type_uint32 __setting_type; extern struct setting_type setting_type_hex __setting_type; extern struct setting_type setting_type_hexhyp __setting_type; +extern struct setting_type setting_type_hexraw __setting_type; extern struct setting_type setting_type_uuid __setting_type; extern struct setting ip_setting __setting ( SETTING_IPv4 ); diff --git a/src/tests/settings_test.c b/src/tests/settings_test.c index 3156f8d2..d6d12574 100644 --- a/src/tests/settings_test.c +++ b/src/tests/settings_test.c @@ -170,6 +170,12 @@ static struct setting test_hexhyp_setting = { .type = &setting_type_hexhyp, }; +/** Test raw hex string setting type */ +static struct setting test_hexraw_setting = { + .name = "test_hexraw", + .type = &setting_type_hexraw, +}; + /** Test UUID setting type */ static struct setting test_uuid_setting = { .name = "test_uuid", @@ -262,6 +268,14 @@ static void settings_test_exec ( void ) { 0x09, 0x6c, 0x66, 0x13, 0xc1, 0xa8, 0xec, 0x27 ), "9f-e5-6d-fb-24-3a-4c-bb-a9-09-6c-66-13-c1-a8-ec-27" ); + /* "hexraw" setting type */ + storef_ok ( &test_settings, &test_hexraw_setting, + "012345abcdef", RAW ( 0x01, 0x23, 0x45, 0xab, 0xcd, 0xef )); + fetchf_ok ( &test_settings, &test_hexraw_setting, + RAW ( 0x9e, 0x4b, 0x6e, 0xef, 0x36, 0xb6, 0x46, 0xfe, 0x8f, + 0x17, 0x06, 0x39, 0x6b, 0xf4, 0x48, 0x4e ), + "9e4b6eef36b646fe8f1706396bf4484e" ); + /* "uuid" setting type (no store capability) */ fetchf_ok ( &test_settings, &test_uuid_setting, RAW ( 0x1a, 0x6a, 0x74, 0x9d, 0x0e, 0xda, 0x46, 0x1a,0xa8,