diff options
Diffstat (limited to 'usr/gen_init_cpio.c')
| -rw-r--r-- | usr/gen_init_cpio.c | 28 | 
1 files changed, 27 insertions, 1 deletions
| diff --git a/usr/gen_init_cpio.c b/usr/gen_init_cpio.c index 7abc07f0fcd2..f1d3fe34176a 100644 --- a/usr/gen_init_cpio.c +++ b/usr/gen_init_cpio.c @@ -370,6 +370,30 @@ error:  	return rc;  } +static char *cpio_replace_env(char *new_location) +{ +       char expanded[PATH_MAX + 1]; +       char env_var[PATH_MAX + 1]; +       char *start; +       char *end; + +       for (start = NULL; (start = strstr(new_location, "${")); ) { +               end = strchr(start, '}'); +               if (start < end) { +                       *env_var = *expanded = '\0'; +                       strncat(env_var, start + 2, end - start - 2); +                       strncat(expanded, new_location, start - new_location); +                       strncat(expanded, getenv(env_var), PATH_MAX); +                       strncat(expanded, end + 1, PATH_MAX); +                       strncpy(new_location, expanded, PATH_MAX); +               } else +                       break; +       } + +       return new_location; +} + +  static int cpio_mkfile_line(const char *line)  {  	char name[PATH_MAX + 1]; @@ -415,7 +439,8 @@ static int cpio_mkfile_line(const char *line)  	} else {  		dname = name;  	} -	rc = cpio_mkfile(dname, location, mode, uid, gid, nlinks); +	rc = cpio_mkfile(dname, cpio_replace_env(location), +	                 mode, uid, gid, nlinks);   fail:  	if (dname_len) free(dname);  	return rc; @@ -439,6 +464,7 @@ void usage(const char *prog)  		"\n"  		"<name>       name of the file/dir/nod/etc in the archive\n"  		"<location>   location of the file in the current filesystem\n" +		"             expands shell variables quoted with ${}\n"  		"<target>     link target\n"  		"<mode>       mode/permissions of the file\n"  		"<uid>        user id (0=root)\n" | 
