diff options
-rw-r--r-- | namedev.c | 18 | ||||
-rw-r--r-- | test/udev-test.pl | 9 | ||||
-rw-r--r-- | udev.8 | 3 |
3 files changed, 23 insertions, 7 deletions
@@ -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"); diff --git a/test/udev-test.pl b/test/udev-test.pl index f2f77dd0e4..a3bf768fe3 100644 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -244,6 +244,15 @@ BUS="scsi", PROGRAM="/bin/echo -n escape-%%n", KERNEL="sda3", NAME="%c" EOF }, { + desc => "program with lots of arguments", + subsys => "block", + devpath => "block/sda/sda3", + expected => "foo9" , + conf => <<EOF +BUS="scsi", PROGRAM="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL="sda3", NAME="%c{7}" +EOF + }, + { desc => "program result substitution (numbered part of)", subsys => "block", devpath => "block/sda/sda3", @@ -182,8 +182,7 @@ all of the values being required in order to match the rule. .TP .B PROGRAM Call external program. This key is valid if the program returns successful. -A few command line options may specified, but shell characters like pipe, -diversion or similiar options are not available. The environment variables of +The environment variables of .B udev are also available for the program. .br |