chiark / gitweb /
[PATCH] more namedev whitespace cleanups
[elogind.git] / namedev.c
index 7c8761088f304036b4a3b3994fa3e06e082ed4da..a010979052aedefd99b7ea281bf83f79e8ba1bab 100644 (file)
--- a/namedev.c
+++ b/namedev.c
 #include "udev_version.h"
 #include "namedev.h"
 #include "libsysfs/libsysfs.h"
+#include "klibc_fixups.h"
 
 #define TYPE_LABEL     "LABEL"
 #define TYPE_NUMBER    "NUMBER"
 #define TYPE_TOPOLOGY  "TOPOLOGY"
 #define TYPE_REPLACE   "REPLACE"
 #define TYPE_CALLOUT   "CALLOUT"
+#define CALLOUT_MAXARG 8
 
 static LIST_HEAD(config_device_list);
 
@@ -81,9 +83,9 @@ static void dump_dev(struct config_device *dev)
                          dev->owner, dev->group, dev->mode);
                break;
        case CALLOUT:
-               dbg_parse("CALLOUT name='%s', program='%s', bus='%s', id='%s', "
+               dbg_parse("CALLOUT name='%s', bus='%s', program='%s', id='%s', "
                          "owner='%s', group='%s', mode=%#o",
-                         dev->name, dev->exec_program, dev->bus, dev->id,
+                         dev->name, dev->bus, dev->exec_program, dev->id,
                          dev->owner, dev->group, dev->mode);
                break;
        default:
@@ -269,8 +271,8 @@ static int namedev_init_config(void)
                        strfieldcpy(dev.name, temp3);
 
                        dbg_parse("LABEL name='%s', bus='%s', "
-                                 "sysfs_file='%s', sysfs_value='%s'", 
-                                 dev.name, dev.bus, dev.sysfs_file, 
+                                 "sysfs_file='%s', sysfs_value='%s'",
+                                 dev.name, dev.bus, dev.sysfs_file,
                                  dev.sysfs_value);
                }
 
@@ -415,7 +417,6 @@ static int namedev_init_permissions(void)
 
        /* loop through the whole file */
        while (1) {
-               /* get a line */
                temp = fgets(line, sizeof(line), fd);
                if (temp == NULL)
                        break;
@@ -438,12 +439,24 @@ static int namedev_init_permissions(void)
 
                /* parse the line */
                temp2 = strsep(&temp, ":");
+               if (!temp2) {
+                       dbg("cannot parse line: %s", line);
+                       continue;
+               }
                strncpy(dev.name, temp2, sizeof(dev.name));
 
                temp2 = strsep(&temp, ":");
+               if (!temp2) {
+                       dbg("cannot parse line: %s", line);
+                       continue;
+               }
                strncpy(dev.owner, temp2, sizeof(dev.owner));
 
                temp2 = strsep(&temp, ":");
+               if (!temp2) {
+                       dbg("cannot parse line: %s", line);
+                       continue;
+               }
                strncpy(dev.group, temp2, sizeof(dev.owner));
 
                dev.mode = strtol(temp, NULL, 8);
@@ -479,6 +492,9 @@ static int exec_callout(struct config_device *dev, char *value, int len)
        pid_t pid;
        int value_set = 0;
        char buffer[256];
+       char *arg;
+       char *args[CALLOUT_MAXARG];
+       int i;
 
        dbg("callout to '%s'", dev->exec_program);
        retval = pipe(fds);
@@ -496,7 +512,22 @@ static int exec_callout(struct config_device *dev, char *value, int len)
                /* child */
                close(STDOUT_FILENO);
                dup(fds[1]);    /* dup write side of pipe to STDOUT */
-               retval = execve(dev->exec_program, main_argv, main_envp);
+               if (strchr(dev->exec_program, ' ')) {
+                       /* callout with arguments */
+                       arg = dev->exec_program;
+                       for (i=0; i < CALLOUT_MAXARG-1; i++) {
+                               args[i] = strsep(&arg, " ");
+                               if (args[i] == NULL)
+                                       break;
+                       }
+                       if (args[i]) {
+                               dbg("too many args - %d", i);
+                               args[i] = NULL;
+                       }
+                       retval = execve(args[0], args, main_envp);
+               } else {
+                       retval = execve(dev->exec_program, main_argv, main_envp);
+               }
                if (retval != 0) {
                        dbg("child execve failed");
                        exit(1);
@@ -523,6 +554,7 @@ static int exec_callout(struct config_device *dev, char *value, int len)
                                strncpy(value, buffer, len);
                        }
                }
+               dbg("callout returned '%s'", value);
                close(fds[0]);
                res = wait(&status);
                if (res < 0) {
@@ -849,6 +881,7 @@ found:
                char *pos = strchr(udev->name, '%');
                char *dig;
                char name[NAME_SIZE];
+
                if (pos) {
                        strfieldcpy(name, pos+2);
                        *pos = 0x00;
@@ -857,8 +890,7 @@ found:
                                if (!sysfs_device)
                                        break;
                                strcat(udev->name, sysfs_device->bus_id);
-                               dbg("bus_id inserted: %s", 
-                                               sysfs_device->bus_id);
+                               dbg("substitute bus_id '%s'", sysfs_device->bus_id);
                                break;
                        case 'n':
                                dig = class_dev->name + strlen(class_dev->name);
@@ -924,5 +956,3 @@ int namedev_init(void)
        dump_dev_list();
        return retval;
 }
-
-