summaryrefslogtreecommitdiff
path: root/namedev.c
diff options
context:
space:
mode:
authorgreg@kroah.com <greg@kroah.com>2004-02-26 21:29:49 -0800
committerGreg KH <gregkh@suse.de>2005-04-26 21:32:31 -0700
commitdde05ccb8d423fbc5c29f54b0c1b545938c8f151 (patch)
treefbfb4c337f45dd48a0c7524014f54936c42be86f /namedev.c
parent3fe0734266becd2ebcb111b07c3e17b2a9780477 (diff)
[PATCH] remove limit of the number of args passed to PROGRAM
If we go over our internal limit of 7, then we call out to /bin/sh otherwise we handle it ourself without relying on a shell.
Diffstat (limited to 'namedev.c')
-rw-r--r--namedev.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/namedev.c b/namedev.c
index 21f52d1f3c..7c07e3b104 100644
--- a/namedev.c
+++ b/namedev.c
@@ -421,7 +421,13 @@ static int execute_program(char *path, char *value, int len)
case 0:
/* child */
close(STDOUT_FILENO);
- dup(fds[1]); /* dup write side of pipe to STDOUT */
+
+ /* dup write side of pipe to STDOUT */
+ dup(fds[1]);
+
+ /* copy off our path to use incase we have too many args */
+ strnfieldcpy(buffer, path, sizeof(buffer));
+
if (strchr(path, ' ')) {
/* exec with arguments */
pos = path;
@@ -431,14 +437,16 @@ static int execute_program(char *path, char *value, int len)
break;
}
if (args[i]) {
- dbg("too many args - %d", i);
- args[i] = NULL;
+ dbg("too many args - %d, using subshell instead '%s'", i, buffer);
+ retval = execl("/bin/sh", "sh", "-c", buffer, NULL);
+ } else {
+ dbg("execute program '%s'", path);
+ retval = execv(args[0], args);
}
- retval = execv(args[0], args);
} else {
retval = execv(path, main_argv);
}
- dbg("child execve failed");
+ info(FIELD_PROGRAM " execution of '%s' failed", path);
exit(1);
case -1:
dbg("fork failed");