#include <sys/un.h>
#include <talloc/talloc.h>
+#include <waiter/waiter.h>
+#include <log/log.h>
#include "udev.h"
-#include "log.h"
-#include "waiter.h"
#include "pb-discover.h"
+#include "device-handler.h"
#define PBOOT_DEVICE_SOCKET "/tmp/petitboot.udev"
#define max(a, b) ((a) > (b) ? (a) : (b))
struct udev {
+ struct device_handler *handler;
int socket;
};
}
}
-static const char *event_param(struct udev_event *event, const char *name)
+const char *udev_event_param(struct udev_event *event, const char *name)
{
int i;
action = event->action == UDEV_ACTION_ADD ? "add" : "remove";
pb_log("udev %s event:\n", action);
- printf("\tdevice: %s\n", event->device);
+ pb_log("\tdevice: %s\n", event->device);
for (i = 0; params[i]; i++)
- printf("\t%-12s => %s\n",
- params[i], event_param(event, params[i]));
+ pb_log("\t%-12s => %s\n",
+ params[i], udev_event_param(event, params[i]));
}
print_event(event);
+ device_handler_event(udev->handler, event);
+
talloc_free(event);
return;
return 0;
}
-struct udev *udev_init(void)
+struct udev *udev_init(struct device_handler *handler)
{
struct sockaddr_un addr;
struct udev *udev;
udev = talloc(NULL, struct udev);
+ udev->handler = handler;
+
udev->socket = socket(PF_UNIX, SOCK_DGRAM, 0);
if (udev->socket < 0) {
pb_log("Error creating udev socket: %s\n", strerror(errno));
waiter_register(udev->socket, WAIT_IN, udev_process, udev);
+ pb_log("%s: waiting on %s\n", __func__, PBOOT_DEVICE_SOCKET);
+
return udev;
out_err:
return NULL;
}
+int udev_trigger(struct udev __attribute__((unused)) *udev)
+{
+ int rc = system("/sbin/udevadm trigger --subsystem-match=block");
+
+ if (rc)
+ pb_log("udev trigger failed: %d (%d)\n", rc, WEXITSTATUS(rc));
+
+ return WEXITSTATUS(rc);
+}
+
void udev_destroy(struct udev *udev)
{
talloc_free(udev);