chiark / gitweb /
prepare for new HAL udevdb dump
[elogind.git] / udev_sysfs.c
index d46f1f26d85bf94fc55eab0a425ba2f164aac15d..75e275d5002fde7a237fbf83312b6ebb73ea7e99 100644 (file)
@@ -59,6 +59,23 @@ static const struct subsystem_file {
        { NULL, NULL }
 };
 
+dev_t get_devt(struct sysfs_class_device *class_dev)
+{
+       struct sysfs_attribute *attr = NULL;
+       unsigned int major, minor;
+
+       attr = sysfs_get_classdev_attr(class_dev, "dev");
+       if (attr == NULL)
+               return 0;
+       dbg("dev='%s'", attr->value);
+
+       if (sscanf(attr->value, "%u:%u", &major, &minor) != 2)
+               return 0;
+       dbg("found major=%d, minor=%d", major, minor);
+
+       return makedev(major, minor);
+}
+
 int subsystem_expect_no_dev(const char *subsystem)
 {
        const struct subsystem_file *file;
@@ -88,7 +105,7 @@ static int wait_for_class_device_attributes(struct sysfs_class_device *class_dev
                                            const char **error)
 {
        const char *file;
-       char filename[SYSFS_PATH_MAX];
+       char filename[PATH_SIZE];
        int loop;
 
        file = get_subsystem_specific_file(class_dev->classname);
@@ -97,7 +114,8 @@ static int wait_for_class_device_attributes(struct sysfs_class_device *class_dev
                return 0;
        }
 
-       snprintf(filename, SYSFS_PATH_MAX-1, "%s/%s", class_dev->path, file);
+       snprintf(filename, sizeof(filename), "%s/%s", class_dev->path, file);
+       filename[sizeof(filename)-1] = '\0';
        dbg("looking at class '%s' for specific file '%s'", class_dev->classname, filename);
 
        loop = WAIT_MAX_SECONDS * WAIT_LOOP_PER_SECOND;
@@ -155,6 +173,7 @@ static int class_device_expect_no_device_link(struct sysfs_class_device *class_d
                { .subsystem = "input",         .device = "mice" },
                { .subsystem = "input",         .device = "mouse" },
                { .subsystem = "input",         .device = "ts" },
+               { .subsystem = "input",         .device = "js" },
                { .subsystem = "vc",            .device = NULL },
                { .subsystem = "tty",           .device = NULL },
                { .subsystem = "cpuid",         .device = "cpu" },
@@ -211,7 +230,7 @@ static int class_device_expect_no_device_link(struct sysfs_class_device *class_d
                { NULL, NULL }
        };
        const struct class_device *classdevice;
-       int len;
+       unsigned int len;
 
        /* the kernel may tell us what to wait for */
        if (kernel_release_satisfactory(2,6,10) > 0)
@@ -278,40 +297,42 @@ int wait_for_devices_device(struct sysfs_device *devices_dev,
                { .bus = "usb",         .file = "idVendor" },
                { .bus = "usb",         .file = "iInterface" },
                { .bus = "usb",         .file = "bNumEndpoints" },
-               { .bus = "usb-serial",  .file = "detach_state" },
-               { .bus = "ide",         .file = "detach_state" },
+               { .bus = "usb-serial",  .file = "bus" },
+               { .bus = "ide",         .file = "bus" },
                { .bus = "pci",         .file = "vendor" },
-               { .bus = "platform",    .file = "detach_state" },
-               { .bus = "pcmcia",      .file = "detach_state" },
-               { .bus = "i2c",         .file = "detach_state" },
+               { .bus = "pci_express", .file = "bus" },
+               { .bus = "platform",    .file = "bus" },
+               { .bus = "pcmcia",      .file = "bus" },
+               { .bus = "i2c",         .file = "bus" },
                { .bus = "ieee1394",    .file = "node_count" },
                { .bus = "ieee1394",    .file = "nodeid" },
                { .bus = "ieee1394",    .file = "address" },
                { .bus = "bttv-sub",    .file = NULL },
-               { .bus = "pnp",         .file = "detach_state" },
-               { .bus = "eisa",        .file = "detach_state" },
-               { .bus = "pseudo",      .file = "detach_state" },
-               { .bus = "mmc",         .file = "detach_state" },
-               { .bus = "macio",       .file = "detach_state" },
-               { .bus = "of_platform", .file = "detach_state" },
-               { .bus = "vio",         .file = "detach_state" },
-               { .bus = "ecard",       .file = "detach_state" },
-               { .bus = "sa1111-rab",  .file = "detach_state" },
-               { .bus = "amba",        .file = "detach_state" },
-               { .bus = "locomo-bus",  .file = "detach_state" },
-               { .bus = "logicmodule", .file = "detach_state" },
-               { .bus = "parisc",      .file = "detach_state" },
-               { .bus = "ocp",         .file = "detach_state" },
-               { .bus = "dio",         .file = "detach_state" },
-               { .bus = "MCA",         .file = "detach_state" },
-               { .bus = "wl",          .file = "detach_state" },
-               { .bus = "ccwgroup",    .file = "detach_state" },
-               { .bus = "css",         .file = "detach_state" },
-               { .bus = "ccw",         .file = "detach_state" },
-               { .bus = "iucv",        .file = "detach_state" },
+               { .bus = "pnp",         .file = "bus" },
+               { .bus = "eisa",        .file = "bus" },
+               { .bus = "serio",       .file = "bus" },
+               { .bus = "pseudo",      .file = "bus" },
+               { .bus = "mmc",         .file = "bus" },
+               { .bus = "macio",       .file = "bus" },
+               { .bus = "of_platform", .file = "bus" },
+               { .bus = "vio",         .file = "bus" },
+               { .bus = "ecard",       .file = "bus" },
+               { .bus = "sa1111-rab",  .file = "bus" },
+               { .bus = "amba",        .file = "bus" },
+               { .bus = "locomo-bus",  .file = "bus" },
+               { .bus = "logicmodule", .file = "bus" },
+               { .bus = "parisc",      .file = "bus" },
+               { .bus = "ocp",         .file = "bus" },
+               { .bus = "dio",         .file = "bus" },
+               { .bus = "MCA",         .file = "bus" },
+               { .bus = "wl",          .file = "bus" },
+               { .bus = "ccwgroup",    .file = "bus" },
+               { .bus = "css",         .file = "bus" },
+               { .bus = "ccw",         .file = "bus" },
+               { .bus = "iucv",        .file = "bus" },
                { NULL, NULL }
        };
-       const struct device_file *devicefile;
+       const struct device_file *devicefile = NULL;
        int loop;
 
        /* the kernel may tell us what to wait for */
@@ -344,7 +365,7 @@ int wait_for_devices_device(struct sysfs_device *devices_dev,
 
                for (devicefile = device_files; devicefile->bus != NULL; devicefile++) {
                        if (strcmp(devices_dev->bus, devicefile->bus) == 0) {
-                               char filename[SYSFS_PATH_MAX];
+                               char filename[PATH_SIZE];
                                struct stat stats;
 
                                if (devicefile->file == NULL) {
@@ -353,7 +374,8 @@ int wait_for_devices_device(struct sysfs_device *devices_dev,
                                }
 
                                found_bus_type = 1;
-                               snprintf(filename, SYSFS_PATH_MAX-1, "%s/%s", devices_dev->path, devicefile->file);
+                               snprintf(filename, sizeof(filename), "%s/%s", devices_dev->path, devicefile->file);
+                               filename[sizeof(filename)-1] = '\0';
                                dbg("looking at bus '%s' device for specific file '%s'", devices_dev->bus, filename);
 
                                if (stat(filename, &stats) == 0) {
@@ -381,7 +403,7 @@ int wait_for_devices_device(struct sysfs_device *devices_dev,
 
 struct sysfs_class_device *wait_class_device_open(const char *path)
 {
-       struct sysfs_class_device *class_dev;
+       struct sysfs_class_device *class_dev = NULL;
        int loop;
 
        loop = WAIT_MAX_SECONDS * WAIT_LOOP_PER_SECOND;
@@ -393,7 +415,7 @@ struct sysfs_class_device *wait_class_device_open(const char *path)
                usleep(1000 * 1000 / WAIT_LOOP_PER_SECOND);
        }
 
-       return (class_dev);
+       return class_dev;
 }
 
 int wait_for_class_device(struct sysfs_class_device *class_dev,
@@ -450,7 +472,7 @@ int wait_for_class_device(struct sysfs_class_device *class_dev,
 
 struct sysfs_device *wait_devices_device_open(const char *path)
 {
-       struct sysfs_device *devices_dev;
+       struct sysfs_device *devices_dev = NULL;
        int loop;
 
        loop = WAIT_MAX_SECONDS * WAIT_LOOP_PER_SECOND;
@@ -462,5 +484,5 @@ struct sysfs_device *wait_devices_device_open(const char *path)
                usleep(1000 * 1000 / WAIT_LOOP_PER_SECOND);
        }
 
-       return(devices_dev);
+       return devices_dev;
 }