chiark / gitweb /
[PATCH] move kernel name/number evaluation into udev_init_device()
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Mon, 21 Feb 2005 13:48:12 +0000 (14:48 +0100)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 06:36:13 +0000 (23:36 -0700)
namedev.c
namedev.h
udev.h
udev_utils.c
udev_utils.h

index a5c711b..0463d4d 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -343,19 +343,6 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
        }
 }
 
-static void fix_kernel_name(struct udevice *udev)
-{
-       char *temp = udev->kernel_name;
-
-       while (*temp != 0x00) {
-               /* Some block devices have a ! in their name, 
-                * we need to change that to / */
-               if (*temp == '!')
-                       *temp = '/';
-               ++temp;
-       }
-}
-
 static int execute_program(struct udevice *udev, const char *path, char *value, int len)
 {
        int retval;
@@ -549,8 +536,8 @@ static int match_id(struct config_device *dev, struct sysfs_class_device *class_
        dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
        if (strcmp_pattern(dev->id, temp) != 0)
                return -ENODEV;
-       else
-               return 0;
+
+       return 0;
 }
 
 static int match_place(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
@@ -582,7 +569,6 @@ static int match_place(struct config_device *dev, struct sysfs_class_device *cla
 static int match_rule(struct udevice *udev, struct config_device *dev,
                      struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
 {
-       /* check for matching kernel name */
        if (dev->kernel[0] != '\0') {
                dbg("check for " FIELD_KERNEL " dev->kernel='%s' class_dev->name='%s'",
                    dev->kernel, class_dev->name);
@@ -593,7 +579,6 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
                dbg(FIELD_KERNEL " matches");
        }
 
-       /* check for matching subsystem */
        if (dev->subsystem[0] != '\0') {
                dbg("check for " FIELD_SUBSYSTEM " dev->subsystem='%s' class_dev->name='%s'",
                    dev->subsystem, class_dev->name);
@@ -710,7 +695,6 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d
        struct sysfs_class_device *class_dev_parent;
        struct sysfs_device *sysfs_device = NULL;
        struct config_device *dev;
-       char *pos;
 
        dbg("class_dev->name='%s'", class_dev->name);
 
@@ -733,16 +717,7 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d
                strfieldcpy(udev->bus_id, sysfs_device->bus_id);
        }
 
-       strfieldcpy(udev->kernel_name, class_dev->name);
-       fix_kernel_name(udev);
-       dbg("udev->kernel_name = '%s'", udev->kernel_name);
-
-       /* get kernel number */
-       pos = class_dev->name + strlen(class_dev->name);
-       while (isdigit(*(pos-1)))
-               pos--;
-       strfieldcpy(udev->kernel_number, pos);
-       dbg("kernel_number='%s'", udev->kernel_number);
+       dbg("udev->kernel_name='%s'", udev->kernel_name);
 
        /* look for a matching rule to apply */
        list_for_each_entry(dev, &config_device_list, node) {
@@ -781,7 +756,7 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d
                                dbg("applied group='%s' to '%s'", udev->group, udev->kernel_name);
                        }
 
-                       /* collect symlinks for this or the final matching rule */
+                       /* collect symlinks */
                        if (dev->symlink[0] != '\0') {
                                char temp[NAME_SIZE];
 
index a929e52..3a16144 100644 (file)
--- a/namedev.h
+++ b/namedev.h
@@ -36,14 +36,14 @@ struct sysfs_class_device;
 #define DRIVER_SIZE            64
 #define PROGRAM_SIZE           128
 
+#define FIELD_KERNEL           "KERNEL"
+#define FIELD_SUBSYSTEM                "SUBSYSTEM"
 #define FIELD_BUS              "BUS"
 #define FIELD_SYSFS            "SYSFS"
 #define FIELD_ID               "ID"
 #define FIELD_PLACE            "PLACE"
 #define FIELD_PROGRAM          "PROGRAM"
 #define FIELD_RESULT           "RESULT"
-#define FIELD_KERNEL           "KERNEL"
-#define FIELD_SUBSYSTEM                "SUBSYSTEM"
 #define FIELD_DRIVER           "DRIVER"
 #define FIELD_NAME             "NAME"
 #define FIELD_SYMLINK          "SYMLINK"
diff --git a/udev.h b/udev.h
index 17ff403..d6dbd7c 100644 (file)
--- a/udev.h
+++ b/udev.h
@@ -26,6 +26,7 @@
 #include <sys/types.h>
 #include <sys/param.h>
 #include "libsysfs/sysfs/libsysfs.h"
+#include "list.h"
 
 #define ALARM_TIMEOUT                  120
 #define COMMENT_CHARACTER              '#'
index e6580d2..ea4aa25 100644 (file)
 #include "list.h"
 
 
-void udev_init_device(struct udevice *udev, const char* devpath, const char *subsystem)
+int udev_init_device(struct udevice *udev, const char* devpath, const char *subsystem)
 {
+       char *pos;
+
        memset(udev, 0x00, sizeof(struct udevice));
 
-       if (devpath)
+       if (devpath) {
                strfieldcpy(udev->devpath, devpath);
+               no_trailing_slash(udev->devpath);
+       }
        if (subsystem)
                strfieldcpy(udev->subsystem, subsystem);
 
@@ -60,6 +64,30 @@ void udev_init_device(struct udevice *udev, const char* devpath, const char *sub
        udev->mode = 0660;
        strcpy(udev->owner, "root");
        strcpy(udev->group, "root");
+
+       /* get kernel name */
+       pos = strrchr(udev->devpath, '/');
+       if (pos == NULL)
+               return -1;
+       strfieldcpy(udev->kernel_name, &pos[1]);
+
+       /* get kernel number */
+       pos = &udev->kernel_name[strlen(udev->kernel_name)];
+       while (isdigit(pos[-1]))
+               pos--;
+       strfieldcpy(udev->kernel_number, pos);
+       dbg("kernel_number='%s'", udev->kernel_number);
+
+       /* Some block devices have '!' in their name, change that to '/' */
+       pos = udev->kernel_name;
+       while (pos[0] != '\0') {
+               if (pos[0] == '!')
+                       pos[0] = '/';
+               pos++;
+       }
+
+       dbg("kernel_name='%s'", udev->kernel_name);
+       return 0;
 }
 
 int kernel_release_satisfactory(unsigned int version, unsigned int patchlevel, unsigned int sublevel)
@@ -232,31 +260,35 @@ void no_trailing_slash(char *path)
                path[--len] = '\0';
 }
 
-struct files {
-       struct list_head list;
+struct name_entry {
+       struct list_head node;
        char name[NAME_SIZE];
 };
 
 /* sort files in lexical order */
-static int file_list_insert(char *filename, struct list_head *file_list)
+static int name_list_add(struct list_head *name_list, const char *name, int sort)
 {
-       struct files *loop_file;
-       struct files *new_file;
-
-       list_for_each_entry(loop_file, file_list, list) {
-               if (strcmp(loop_file->name, filename) > 0) {
-                       break;
+       struct name_entry *loop_name;
+       struct name_entry *new_name;
+
+       list_for_each_entry(loop_name, name_list, node) {
+               /* avoid doubles */
+               if (strcmp(loop_name->name, name) == 0) {
+                       dbg("'%s' is already in the list", name);
+                       return 0;
                }
+               if (sort && strcmp(loop_name->name, name) > 0)
+                       break;
        }
 
-       new_file = malloc(sizeof(struct files));
-       if (new_file == NULL) {
+       new_name = malloc(sizeof(struct name_entry));
+       if (new_name == NULL) {
                dbg("error malloc");
                return -ENOMEM;
        }
 
-       strfieldcpy(new_file->name, filename);
-       list_add_tail(&new_file->list, &loop_file->list);
+       strfieldcpy(new_name->name, name);
+       list_add_tail(&new_name->node, &loop_name->node);
        return 0;
 }
 
@@ -267,8 +299,8 @@ int call_foreach_file(file_fnct_t fnct, const char *dirname,
        struct dirent *ent;
        DIR *dir;
        char *ext;
-       struct files *loop_file;
-       struct files *tmp_file;
+       struct name_entry *loop_file;
+       struct name_entry *tmp_file;
        LIST_HEAD(file_list);
 
        dbg("open directory '%s'", dirname);
@@ -295,11 +327,11 @@ int call_foreach_file(file_fnct_t fnct, const char *dirname,
                        continue;
 
                dbg("put file '%s/%s' in list", dirname, ent->d_name);
-               file_list_insert(ent->d_name, &file_list);
+               name_list_add(&file_list, ent->d_name, 1);
        }
 
        /* call function for every file in the list */
-       list_for_each_entry_safe(loop_file, tmp_file, &file_list, list) {
+       list_for_each_entry_safe(loop_file, tmp_file, &file_list, node) {
                char filename[NAME_SIZE];
 
                snprintf(filename, NAME_SIZE, "%s/%s", dirname, loop_file->name);
@@ -307,7 +339,7 @@ int call_foreach_file(file_fnct_t fnct, const char *dirname,
 
                fnct(filename, data);
 
-               list_del(&loop_file->list);
+               list_del(&loop_file->node);
                free(loop_file);
        }
 
index 19061f1..268c207 100644 (file)
@@ -76,7 +76,7 @@ do { \
 # define asmlinkage    /* nothing */
 #endif
 
-extern void udev_init_device(struct udevice *udev, const char* devpath, const char *subsystem);
+extern int udev_init_device(struct udevice *udev, const char* devpath, const char *subsystem);
 extern int kernel_release_satisfactory(unsigned int version, unsigned int patchlevel, unsigned int sublevel);
 extern int create_path(const char *path);
 extern int parse_get_pair(char **orig_string, char **left, char **right);