X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevstart.c;h=fd490f0791688ea8b0d4bd5d045f1431546e62c1;hp=ba63745620cbeec1e5d3ac5744a45a30d4bacb62;hb=1b1ba9336508dd1a06bb81bbf89b049e9e38f126;hpb=a551c7b0ceb72145a5256cdd53b0b52ff9f766de diff --git a/udevstart.c b/udevstart.c index ba6374562..fd490f079 100644 --- a/udevstart.c +++ b/udevstart.c @@ -33,6 +33,7 @@ #include #include +#include "libsysfs/sysfs/libsysfs.h" #include "logging.h" #include "udev_lib.h" #include "list.h" @@ -86,6 +87,40 @@ static char *first_list[] = { NULL, }; +static int add_device(char *devpath, char *subsystem) +{ + struct udevice udev; + char path[SYSFS_PATH_MAX]; + struct sysfs_class_device *class_dev; + char *argv[3]; + + /* fake argument vector and environment for callouts and dev.d/ */ + argv[0] = "udev"; + argv[1] = subsystem; + argv[2] = NULL; + + main_argv = argv; + setenv("DEVPATH", devpath, 1); + setenv("ACTION", "add", 1); + + snprintf(path, SYSFS_PATH_MAX-1, "%s%s", sysfs_path, devpath); + class_dev = sysfs_open_class_device_path(path); + if (class_dev == NULL) { + dbg ("sysfs_open_class_device_path failed"); + return -ENODEV; + } + + udev_set_values(&udev, devpath, subsystem); + udev_add_device(&udev, class_dev); + + /* run scripts */ + dev_d_execute(&udev); + + sysfs_close_class_device(class_dev); + + return 0; +} + static void exec_list(struct list_head *device_list) { struct device *loop_device; @@ -96,7 +131,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); list_del(&loop_device->list); free(loop_device); break; @@ -116,14 +151,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); 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); list_del(&loop_device->list); free(loop_device); }