X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fudev.c;h=dd9fc7ccea6d77cd8fbb8a5fa33a9cbf01cfbedb;hp=9c1b399cd7857a9d59c6bb1b4884a26bbd315c8a;hb=fa6b8cb1d5e9e586370631b879a36cdf49110504;hpb=32e6a41f33e5576716b351bd473a27939fe94fa1 diff --git a/discover/udev.c b/discover/udev.c index 9c1b399..dd9fc7c 100644 --- a/discover/udev.c +++ b/discover/udev.c @@ -10,17 +10,19 @@ #include #include +#include +#include #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; }; @@ -58,7 +60,7 @@ static void parse_event_params(struct udev_event *event, char *buf, int len) } } -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; @@ -80,11 +82,11 @@ static void print_event(struct udev_event *event) 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])); } @@ -132,6 +134,8 @@ static void handle_udev_message(struct udev *udev, char *buf, int len) print_event(event); + device_handler_event(udev->handler, event); + talloc_free(event); return; @@ -168,7 +172,7 @@ static int udev_destructor(void *p) return 0; } -struct udev *udev_init(void) +struct udev *udev_init(struct device_handler *handler) { struct sockaddr_un addr; struct udev *udev; @@ -177,6 +181,8 @@ struct udev *udev_init(void) 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)); @@ -195,6 +201,8 @@ struct udev *udev_init(void) waiter_register(udev->socket, WAIT_IN, udev_process, udev); + pb_log("%s: waiting on %s\n", __func__, PBOOT_DEVICE_SOCKET); + return udev; out_err: @@ -202,6 +210,16 @@ 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);