X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fudev.c;h=40b9f638c5b9d51b0c2c432cbe4a223e1873dd96;hp=1a527895878d4de36f17406c3fe7ad44c1ceb07d;hb=3b29ff8c2a6489b9517d61c0f63256a1ad0c36f7;hpb=d7ce19907ff585e7fb6b950a40bd638d49c96a27 diff --git a/discover/udev.c b/discover/udev.c index 1a52789..40b9f63 100644 --- a/discover/udev.c +++ b/discover/udev.c @@ -1,17 +1,19 @@ #define _GNU_SOURCE -#include +#include #include +#include +#include #include -#include -#include #include +#include #include +#include #include #include -#include +#include #include "event.h" #include "udev.h" @@ -30,7 +32,12 @@ struct udev { static void udev_print_event(struct event *event) { const char *action, *params[] = { - "DEVNAME", "ID_TYPE", "ID_BUS", "ID_FS_UUID", "ID_FS_LABEL", + "DEVNAME", + "DEVPATH", + "ID_TYPE", + "ID_BUS", + "ID_FS_UUID", + "ID_FS_LABEL", NULL, }; int i; @@ -43,24 +50,36 @@ static void udev_print_event(struct event *event) for (i = 0; params[i]; i++) pb_log("\t%-12s => %s\n", params[i], event_get_param(event, params[i])); - } static void udev_handle_message(struct udev *udev, char *buf, int len) { int result; struct event *event; + const char *devpath; event = talloc(udev, struct event); event->type = EVENT_TYPE_UDEV; + pb_log("%s\n", buf); + result = event_parse_ad_message(event, buf, len); if (result) return; udev_print_event(event); - device_handler_event(udev->handler, event); + + /* Ignore ram, loop, and devices with no DEVNAME. */ + + devpath = event_get_param(event, "DEVPATH"); + + if (event_get_param(event, "DEVNAME") + && !strstr(devpath, "virtual/block/loop") + && !strstr(devpath, "virtual/block/ram")) { + device_handler_event(udev->handler, event); + } + talloc_free(event); return; @@ -97,7 +116,7 @@ static int udev_destructor(void *p) return 0; } -struct udev *udev_init(struct device_handler *handler) +struct udev *udev_init(struct waitset *waitset, struct device_handler *handler) { struct sockaddr_un addr; struct udev *udev; @@ -116,6 +135,7 @@ struct udev *udev_init(struct device_handler *handler) talloc_set_destructor(udev, udev_destructor); + memset(&addr, 0, sizeof addr); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, PBOOT_DEVICE_SOCKET); @@ -124,7 +144,7 @@ struct udev *udev_init(struct device_handler *handler) goto out_err; } - waiter_register(udev->socket, WAIT_IN, udev_process, udev); + waiter_register(waitset, udev->socket, WAIT_IN, udev_process, udev); pb_log("%s: waiting on %s\n", __func__, PBOOT_DEVICE_SOCKET); @@ -137,7 +157,16 @@ out_err: int udev_trigger(struct udev __attribute__((unused)) *udev) { - int rc = system("/sbin/udevadm trigger --subsystem-match=block"); + const char *cmd[] = { + pb_system_apps.udevadm, + "trigger", + "--subsystem-match=block", + "--action=add", + NULL, + }; + int rc; + + rc = pb_run_cmd(cmd, 1, 0); if (rc) pb_log("udev trigger failed: %d (%d)\n", rc, WEXITSTATUS(rc));