diff options
author | Michael Brown | 2011-01-28 01:16:18 +0100 |
---|---|---|
committer | Michael Brown | 2011-01-28 01:16:18 +0100 |
commit | 990cbb8f2c69224d88c32006ad16a28d454352fa (patch) | |
tree | 431517929b24d6f114d78facd5dbf91c5200c2ba /src/core/settings.c | |
parent | [autoboot] Connect SAN disk during a filename boot, if applicable (diff) | |
download | ipxe-990cbb8f2c69224d88c32006ad16a28d454352fa.tar.gz ipxe-990cbb8f2c69224d88c32006ad16a28d454352fa.tar.xz ipxe-990cbb8f2c69224d88c32006ad16a28d454352fa.zip |
[settings] Generalise expand_command() to expand_settings()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/settings.c')
-rw-r--r-- | src/core/settings.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/core/settings.c b/src/core/settings.c index e2b48263..da662e61 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -1469,6 +1469,87 @@ struct setting_type setting_type_uuid __setting_type = { /****************************************************************************** * + * Setting expansion + * + ****************************************************************************** + */ + +/** + * Expand variables within string + * + * @v string String + * @ret expstr Expanded string + * + * The expanded string is allocated with malloc() and the caller must + * eventually free() it. + */ +char * expand_settings ( const char *string ) { + char *expstr; + char *start; + char *end; + char *head; + char *name; + char *tail; + int setting_len; + int new_len; + char *tmp; + + /* Obtain temporary modifiable copy of string */ + expstr = strdup ( string ); + if ( ! expstr ) + return NULL; + + /* Expand while expansions remain */ + while ( 1 ) { + + head = expstr; + + /* Locate setting to be expanded */ + start = NULL; + end = NULL; + for ( tmp = expstr ; *tmp ; tmp++ ) { + if ( ( tmp[0] == '$' ) && ( tmp[1] == '{' ) ) + start = tmp; + if ( start && ( tmp[0] == '}' ) ) { + end = tmp; + break; + } + } + if ( ! end ) + break; + *start = '\0'; + name = ( start + 2 ); + *end = '\0'; + tail = ( end + 1 ); + + /* Determine setting length */ + setting_len = fetchf_named_setting ( name, NULL, 0 ); + if ( setting_len < 0 ) + setting_len = 0; /* Treat error as empty setting */ + + /* Read setting into temporary buffer */ + { + char setting_buf[ setting_len + 1 ]; + + setting_buf[0] = '\0'; + fetchf_named_setting ( name, setting_buf, + sizeof ( setting_buf ) ); + + /* Construct expanded string and discard old string */ + tmp = expstr; + new_len = asprintf ( &expstr, "%s%s%s", + head, setting_buf, tail ); + free ( tmp ); + if ( new_len < 0 ) + return NULL; + } + } + + return expstr; +} + +/****************************************************************************** + * * Settings * ****************************************************************************** |