kbuild: gen_init_cpio expands shell variables in file names

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Sunday, December 28, 2008 - 5:59 pm

Gitweb:     http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b1ec9...
Commit:     3b1ec9fb8197197d5e3bcca3a05e82d4f50f11bc
Parent:     efddd79512cc582675004bfdf7e66585198b38f9
Author:     Sally, Gene <Gene.Sally@timesys.com>
AuthorDate: Wed Oct 29 09:54:17 2008 -0400
Committer:  Sam Ravnborg <sam@ravnborg.org>
CommitDate: Wed Dec 3 21:32:03 2008 +0100

    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: 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"
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
kbuild: gen_init_cpio expands shell variables in file names, Linux Kernel Mailing ..., (Sun Dec 28, 5:59 pm)