Skip to content

Commit

Permalink
[settings] Generalise expand_command() to expand_settings()
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Jan 28, 2011
1 parent e088892 commit 990cbb8
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 75 deletions.
76 changes: 1 addition & 75 deletions src/core/exec.c
Expand Up @@ -86,80 +86,6 @@ int execv ( const char *command, char * const argv[] ) {
return -ENOEXEC;
}

/**
* 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
*
Expand Down Expand Up @@ -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;

Expand Down
81 changes: 81 additions & 0 deletions src/core/settings.c
Expand Up @@ -1467,6 +1467,87 @@ struct setting_type setting_type_uuid __setting_type = {
.fetchf = fetchf_uuid,
};

/******************************************************************************
*
* 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
Expand Down
1 change: 1 addition & 0 deletions src/include/ipxe/settings.h
Expand Up @@ -221,6 +221,7 @@ extern int storef_setting ( struct settings *settings,
const char *value );
extern int storef_named_setting ( const char *name, const char *value );
extern int fetchf_named_setting ( const char *name, char *buf, size_t len );
extern char * expand_settings ( const char *string );

extern struct setting_type setting_type_string __setting_type;
extern struct setting_type setting_type_ipv4 __setting_type;
Expand Down

0 comments on commit 990cbb8

Please sign in to comment.