summaryrefslogtreecommitdiff
path: root/roms/ipxe/src/core/settings.c
diff options
context:
space:
mode:
authorhyokeun <hyokeun.jeon@samsung.com>2016-09-06 14:09:22 +0900
committerhyokeun <hyokeun.jeon@samsung.com>2016-09-06 14:09:22 +0900
commitbd54c25035217800f3b1d39f6472d599cd602d5a (patch)
tree299417fe96f546225439ff92b27ac3e55909a970 /roms/ipxe/src/core/settings.c
parent186efde2677c31fb40d154a81a5f3731eab52414 (diff)
downloadqemu-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.c55
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 */