diff options
author | hyokeun <hyokeun.jeon@samsung.com> | 2016-09-06 14:09:22 +0900 |
---|---|---|
committer | hyokeun <hyokeun.jeon@samsung.com> | 2016-09-06 14:09:22 +0900 |
commit | bd54c25035217800f3b1d39f6472d599cd602d5a (patch) | |
tree | 299417fe96f546225439ff92b27ac3e55909a970 /roms/ipxe/src/core/settings.c | |
parent | 186efde2677c31fb40d154a81a5f3731eab52414 (diff) | |
download | qemu-bd54c25035217800f3b1d39f6472d599cd602d5a.tar.gz qemu-bd54c25035217800f3b1d39f6472d599cd602d5a.tar.bz2 qemu-bd54c25035217800f3b1d39f6472d599cd602d5a.zip |
Imported Upstream version 2.7.0upstream/2.7.0
Diffstat (limited to 'roms/ipxe/src/core/settings.c')
-rw-r--r-- | roms/ipxe/src/core/settings.c | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/roms/ipxe/src/core/settings.c b/roms/ipxe/src/core/settings.c index 12e6c7d61..9cae0cae3 100644 --- a/roms/ipxe/src/core/settings.c +++ b/roms/ipxe/src/core/settings.c @@ -1474,9 +1474,9 @@ struct setting * find_setting ( const char *name ) { * @v name Name * @ret tag Tag number, or 0 if not a valid number */ -static unsigned int parse_setting_tag ( const char *name ) { +static unsigned long parse_setting_tag ( const char *name ) { char *tmp = ( ( char * ) name ); - unsigned int tag = 0; + unsigned long tag = 0; while ( 1 ) { tag = ( ( tag << 8 ) | strtoul ( tmp, &tmp, 0 ) ); @@ -1666,15 +1666,43 @@ const struct setting_type setting_type_string __setting_type = { .format = format_string_setting, }; -/** A URI-encoded string setting type +/** + * Parse URI-encoded string setting value * - * This setting type is obsolete; the name ":uristring" is retained to - * avoid breaking existing scripts. + * @v type Setting type + * @v value Formatted setting value + * @v buf Buffer to contain raw value + * @v len Length of buffer + * @ret len Length of raw value, or negative error + */ +static int parse_uristring_setting ( const struct setting_type *type __unused, + const char *value, void *buf, size_t len ){ + + return uri_decode ( value, buf, len ); +} + +/** + * Format URI-encoded string setting value + * + * @v type Setting type + * @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_uristring_setting ( const struct setting_type *type __unused, + const void *raw, size_t raw_len, + char *buf, size_t len ) { + + return uri_encode ( 0, raw, raw_len, buf, len ); +} + +/** A URI-encoded string setting type */ const struct setting_type setting_type_uristring __setting_type = { .name = "uristring", - .parse = parse_string_setting, - .format = format_string_setting, + .parse = parse_uristring_setting, + .format = format_uristring_setting, }; /** @@ -2204,6 +2232,10 @@ static int format_busdevfn_setting ( const struct setting_type *type __unused, const void *raw, size_t raw_len, char *buf, size_t len ) { unsigned long busdevfn; + unsigned int seg; + unsigned int bus; + unsigned int slot; + unsigned int func; int check_len; /* Extract numeric value */ @@ -2212,9 +2244,14 @@ static int format_busdevfn_setting ( const struct setting_type *type __unused, return check_len; assert ( check_len == ( int ) raw_len ); + /* Extract PCI address components */ + seg = PCI_SEG ( busdevfn ); + bus = PCI_BUS ( busdevfn ); + slot = PCI_SLOT ( busdevfn ); + func = PCI_FUNC ( busdevfn ); + /* Format value */ - return snprintf ( buf, len, "%02lx:%02lx.%lx", PCI_BUS ( busdevfn ), - PCI_SLOT ( busdevfn ), PCI_FUNC ( busdevfn ) ); + return snprintf ( buf, len, "%04x:%02x:%02x.%x", seg, bus, slot, func ); } /** PCI bus:dev.fn setting type */ |