]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[settings] Add "hexraw" setting type
authorMichael Brown <mcb30@ipxe.org>
Fri, 12 Jul 2013 12:58:19 +0000 (14:58 +0200)
committerMichael Brown <mcb30@ipxe.org>
Fri, 12 Jul 2013 13:14:36 +0000 (15:14 +0200)
Originally-implemented-by: Jeppe Toustrup <ipxe@tenzer.dk>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/settings.c
src/include/ipxe/settings.h
src/tests/settings_test.c

index 42caae0c530ce1c53f2740996e812da67d7c1433..b8833c8d5bba72ce7f79fda9e3e52d49aa0aabe5 100644 (file)
@@ -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
  *
index 9b7404ac25b4971d43cff46235bc9e84a8921af8..7ceb55ca54e7ce7eb8e8d46b6039cd472b69ff96 100644 (file)
@@ -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 );
index 3156f8d22b74331e5a76c66e1e6bead90323fdba..d6d1257486773d981ab0ae200cfb4b9578158894 100644 (file)
@@ -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,