[PATCH 08/26] kbuild: gen_init_cpio expands shell variables in file names

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Sam Ravnborg
Date: Saturday, December 20, 2008 - 7:31 am

From: Sally, Gene <Gene.Sally@timesys.com>

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: Sam Ravnborg <sam@ravnborg.org>
---
 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 7abc07f..f1d3fe3 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"
-- 
1.6.0.2.GIT

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
kbuild-next content, Sam Ravnborg, (Sat Dec 20, 7:25 am)
[PATCH 02/26] kbuild: expand -I in KBUILD_CPPFLAGS, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 05/26] kbuild: use KECHO convenience echo, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 06/26] kbuild: teach mkmakfile to be silent, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 08/26] kbuild: gen_init_cpio expands shell variable ..., Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 09/26] kconfig: fix options to check-lxdialog.sh, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 11/26] genksyms: track symbol checksum changes, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 14/26] scripts: improve the decodecode script, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 16/26] setlocalversion: add git-svn support, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 17/26] kbuild: remove TAR_IGNORE, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 18/26] kbuild: fix make incompatibility, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 19/26] kbuild: fix make tags/cscope, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 23/26] kbuild: simplify use of genksyms, Sam Ravnborg, (Sat Dec 20, 7:31 am)
[PATCH 24/26] kbuild: strip generated symbols from *.ko, Sam Ravnborg, (Sat Dec 20, 7:31 am)