|
@@ -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"
|