diff options
-rw-r--r-- | namedev.c | 27 | ||||
-rw-r--r-- | test/udev-test.pl | 9 | ||||
-rw-r--r-- | udevstart.c | 21 |
3 files changed, 43 insertions, 14 deletions
@@ -412,7 +412,7 @@ static void fix_kernel_name(struct udevice *udev) } } -static int execute_program(char *path, char *value, int len) +static int execute_program(const char *path, char *value, int len) { int retval; int count; @@ -421,12 +421,12 @@ static int execute_program(char *path, char *value, int len) pid_t pid; char *pos; char arg[PROGRAM_SIZE]; - char *argv[sizeof(arg) / 2]; + char *argv[(PROGRAM_SIZE / 2) + 1]; int i; + strfieldcpy(arg, path); i = 0; if (strchr(path, ' ')) { - strfieldcpy(arg, path); pos = arg; while (pos != NULL) { if (pos[0] == '\'') { @@ -441,8 +441,19 @@ static int execute_program(char *path, char *value, int len) dbg("arg[%i] '%s'", i, argv[i]); i++; } + argv[i] = NULL; + dbg("execute '%s' with parsed arguments", arg); + } else { + argv[0] = arg; + argv[1] = main_argv[1]; + argv[2] = NULL; + dbg("execute '%s' with subsystem '%s' argument", arg, argv[1]); } - argv[i] = NULL; + + /* set basename() only */ + pos = strrchr(argv[0], '/'); + if (pos != NULL) + argv[0] = &pos[1]; retval = pipe(fds); if (retval != 0) { @@ -456,13 +467,7 @@ static int execute_program(char *path, char *value, int len) /* child */ /* dup2 write side of pipe to STDOUT */ dup2(fds[1], STDOUT_FILENO); - if (argv[0] != NULL) { - dbg("execute '%s' with given arguments", argv[0]); - retval = execv(argv[0], argv); - } else { - dbg("execute '%s' with main argument", path); - retval = execv(path, main_argv); - } + retval = execv(arg, argv); info(FIELD_PROGRAM " execution of '%s' failed", path); exit(1); diff --git a/test/udev-test.pl b/test/udev-test.pl index 590b551dfe..9e4e192c51 100644 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -256,6 +256,15 @@ BUS="scsi", PROGRAM="/bin/echo -n special-device", RESULT="special-*", NAME="%c- EOF }, { + desc => "program result substitution (no argument should be subsystem)", + subsys => "block", + devpath => "/block/sda/sda3", + exp_name => "subsys_block" , + conf => <<EOF +BUS="scsi", PROGRAM="/bin/echo", RESULT="block", NAME="subsys_block" +EOF + }, + { desc => "program result substitution (newline removal)", subsys => "block", devpath => "/block/sda/sda3", diff --git a/udevstart.c b/udevstart.c index ba63745620..cabafb0abc 100644 --- a/udevstart.c +++ b/udevstart.c @@ -86,6 +86,21 @@ static char *first_list[] = { NULL, }; +static void add_device(char *path, char *subsys, int fake) +{ + char *argv[3]; + + /* fake argument vector and environment for callouts and dev.d/ */ + argv[0] = "udev"; + argv[1] = subsys; + argv[2] = NULL; + + main_argv = argv; + setenv("DEVPATH", path, 1); + setenv("ACTION", "add", 1); + udev_add_device(path, subsys, fake); +} + static void exec_list(struct list_head *device_list) { struct device *loop_device; @@ -96,7 +111,7 @@ static void exec_list(struct list_head *device_list) list_for_each_entry_safe(loop_device, tmp_device, device_list, list) { for (i=0; first_list[i] != NULL; i++) { if (strncmp(loop_device->path, first_list[i], strlen(first_list[i])) == 0) { - udev_add_device(loop_device->path, loop_device->subsys, NOFAKE); + add_device(loop_device->path, loop_device->subsys, NOFAKE); list_del(&loop_device->list); free(loop_device); break; @@ -116,14 +131,14 @@ static void exec_list(struct list_head *device_list) if (found) continue; - udev_add_device(loop_device->path, loop_device->subsys, NOFAKE); + add_device(loop_device->path, loop_device->subsys, NOFAKE); list_del(&loop_device->list); free(loop_device); } /* handle the rest of the devices left over, if any */ list_for_each_entry_safe(loop_device, tmp_device, device_list, list) { - udev_add_device(loop_device->path, loop_device->subsys, NOFAKE); + add_device(loop_device->path, loop_device->subsys, NOFAKE); list_del(&loop_device->list); free(loop_device); } |