#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"
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;
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;
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;
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;
talloc_set_destructor(udev, udev_destructor);
+ memset(&addr, 0, sizeof addr);
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, PBOOT_DEVICE_SOCKET);
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);
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));