summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorMichael Brown2011-01-28 01:16:18 +0100
committerMichael Brown2011-01-28 01:16:18 +0100
commit990cbb8f2c69224d88c32006ad16a28d454352fa (patch)
tree431517929b24d6f114d78facd5dbf91c5200c2ba /src/core
parent[autoboot] Connect SAN disk during a filename boot, if applicable (diff)
downloadipxe-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')
-rw-r--r--src/core/exec.c76
-rw-r--r--src/core/settings.c81
2 files changed, 82 insertions, 75 deletions
diff --git a/src/core/exec.c b/src/core/exec.c
index bb3b343d8..57b2df581 100644
--- a/src/core/exec.c
+++ b/src/core/exec.c
@@ -87,80 +87,6 @@ int execv ( const char *command, char * const argv[] ) {
}
/**
- * Expand variables within command line
- *
- * @v command Command line
- * @ret expcmd Expanded command line
- *
- * The expanded command line is allocated with malloc() and the caller
- * must eventually free() it.
- */
-static char * expand_command ( const char *command ) {
- char *expcmd;
- char *start;
- char *end;
- char *head;
- char *name;
- char *tail;
- int setting_len;
- int new_len;
- char *tmp;
-
- /* Obtain temporary modifiable copy of command line */
- expcmd = strdup ( command );
- if ( ! expcmd )
- return NULL;
-
- /* Expand while expansions remain */
- while ( 1 ) {
-
- head = expcmd;
-
- /* Locate setting to be expanded */
- start = NULL;
- end = NULL;
- for ( tmp = expcmd ; *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 = expcmd;
- new_len = asprintf ( &expcmd, "%s%s%s",
- head, setting_buf, tail );
- free ( tmp );
- if ( new_len < 0 )
- return NULL;
- }
- }
-
- return expcmd;
-}
-
-/**
* Split command line into tokens
*
* @v command Command line
@@ -294,7 +220,7 @@ int system ( const char *command ) {
int rc = 0;
/* Perform variable expansion */
- expcmd = expand_command ( command );
+ expcmd = expand_settings ( command );
if ( ! expcmd )
return -ENOMEM;
diff --git a/src/core/settings.c b/src/core/settings.c
index e2b482630..da662e616 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
*
******************************************************************************