chiark / gitweb /
[PATCH] Revert previous dev_d.c change, it's not what is causing HAL problems.
[elogind.git] / namedev.c
index 466016c297972c46afef90aa964df47adb357a63..695fb55413910e7507b408425529875f1db4c759 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -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,28 +421,34 @@ 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] == '\'') {
                                /* don't separate if in apostrophes */
                                pos++;
                                argv[i] = strsep(&pos, "\'");
-                               while (pos[0] == ' ')
+                               while (pos && pos[0] == ' ')
                                        pos++;
-               } else {
+                       } else {
                                argv[i] = strsep(&pos, " ");
                        }
                        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;
 
        retval = pipe(fds);
        if (retval != 0) {
@@ -454,17 +460,9 @@ static int execute_program(char *path, char *value, int len)
        switch(pid) {
        case 0:
                /* child */
-               close(STDOUT_FILENO);
-
-               /* dup write side of pipe to STDOUT */
-               dup(fds[1]);
-               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);
-               }
+               /* dup2 write side of pipe to STDOUT */
+               dup2(fds[1], STDOUT_FILENO);
+               retval = execv(arg, argv);
 
                info(FIELD_PROGRAM " execution of '%s' failed", path);
                exit(1);
@@ -813,10 +811,12 @@ static int match_rule(struct config_device *dev, struct sysfs_class_device *clas
 
                /* execute external program */
                if (dev->program[0] != '\0') {
+                       char program[PROGRAM_SIZE];
+
                        dbg("check " FIELD_PROGRAM);
-                       apply_format(udev, dev->program, sizeof(dev->program),
-                                    class_dev, sysfs_device);
-                       if (execute_program(dev->program, udev->program_result, NAME_SIZE) != 0) {
+                       strfieldcpy(program, dev->program);
+                       apply_format(udev, program, sizeof(program), class_dev, sysfs_device);
+                       if (execute_program(program, udev->program_result, NAME_SIZE) != 0) {
                                dbg(FIELD_PROGRAM " returned nonzero");
                                goto try_parent;
                        } else {