Commit 3b1ec9fb authored by Sally, Gene's avatar Sally, Gene Committed by Sam Ravnborg

kbuild: gen_init_cpio expands shell variables in file names

Modify gen_init_cpio so that lines that specify files can contain
what looks like a shell variable that's expanded during processing.

For example:

   file /sbin/kinit ${RFS_BASE}/usr/src/klibc/kinit/kinit 0755 0 0

given RFS_BASE is "/some/directory" in the environment

would be expanded to

   file /sbin/kinit /some/directory/usr/src/klibc/kinit/kinit 0755 0 0

If several environment variables appear in a line, they are all expanded
with processing happening from left to right.
Undefined variables expand to a null string.
Syntax errors stop processing, letting the existing error handling
show the user offending line.

This patch helps embedded folks who frequently create several
RFS directories and then switch between them as they're tuning
an initramfs.

Signed-off-by: gene.sally@timesys.com
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
parent efddd795
...@@ -370,6 +370,30 @@ static int cpio_mkfile(const char *name, const char *location, ...@@ -370,6 +370,30 @@ static int cpio_mkfile(const char *name, const char *location,
return rc; 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) static int cpio_mkfile_line(const char *line)
{ {
char name[PATH_MAX + 1]; char name[PATH_MAX + 1];
...@@ -415,7 +439,8 @@ static int cpio_mkfile_line(const char *line) ...@@ -415,7 +439,8 @@ static int cpio_mkfile_line(const char *line)
} else { } else {
dname = name; dname = name;
} }
rc = cpio_mkfile(dname, location, mode, uid, gid, nlinks); rc = cpio_mkfile(dname, cpio_replace_env(location),
mode, uid, gid, nlinks);
fail: fail:
if (dname_len) free(dname); if (dname_len) free(dname);
return rc; return rc;
...@@ -439,6 +464,7 @@ void usage(const char *prog) ...@@ -439,6 +464,7 @@ void usage(const char *prog)
"\n" "\n"
"<name> name of the file/dir/nod/etc in the archive\n" "<name> name of the file/dir/nod/etc in the archive\n"
"<location> location of the file in the current filesystem\n" "<location> location of the file in the current filesystem\n"
" expands shell variables quoted with ${}\n"
"<target> link target\n" "<target> link target\n"
"<mode> mode/permissions of the file\n" "<mode> mode/permissions of the file\n"
"<uid> user id (0=root)\n" "<uid> user id (0=root)\n"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment