]> git.ozlabs.org Git - petitboot/blobdiff - discover/udev.c
protocol: Separate device add from boot-option add messages
[petitboot] / discover / udev.c
index bd7c6bd1abb28f2038fb828e2253fc665632f661..40b9f638c5b9d51b0c2c432cbe4a223e1873dd96 100644 (file)
@@ -1,17 +1,19 @@
 
 #define _GNU_SOURCE
 
-#include <stdlib.h>
+#include <errno.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
 #include <sys/socket.h>
+#include <sys/types.h>
 #include <sys/un.h>
 
+#include <log/log.h>
 #include <talloc/talloc.h>
 #include <waiter/waiter.h>
-#include <log/log.h>
+#include <system/system.h>
 
 #include "event.h"
 #include "udev.h"
@@ -54,6 +56,7 @@ 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;
@@ -66,7 +69,17 @@ static void udev_handle_message(struct udev *udev, char *buf, int len)
                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;
@@ -103,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;
@@ -131,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);
 
@@ -144,7 +157,16 @@ out_err:
 
 int udev_trigger(struct udev __attribute__((unused)) *udev)
 {
-       int rc = system("/sbin/udevadm trigger --subsystem-match=block --action=add");
+       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));