+ pb_log("libudev: %s %s:%d: ", fn, file, line);
+ vfprintf(pb_log_get_stream(), format, args);
+}
+
+struct pb_udev *udev_init(struct device_handler *handler,
+ struct waitset *waitset)
+{
+ struct pb_udev *udev;
+ int result;
+
+ udev = talloc_zero(handler, struct pb_udev);
+ talloc_set_destructor(udev, udev_destructor);
+ udev->handler = handler;
+
+ udev->udev = udev_new();
+
+ if (!udev->udev) {
+ pb_log("udev_new failed\n");
+ goto fail;
+ }
+
+ udev_set_userdata(udev->udev, udev);
+
+ udev_set_log_fn(udev->udev, udev_log_fn);
+
+ result = udev_setup_monitor(udev->udev, &udev->monitor);
+ if (result)
+ goto fail;
+
+ result = udev_enumerate(udev->udev);
+ if (result)
+ goto fail;
+
+ waiter_register_io(waitset, udev_monitor_get_fd(udev->monitor), WAIT_IN,
+ udev_process, udev->monitor);
+
+ pb_debug("%s: waiting on udev\n", __func__);
+
+ return udev;
+
+fail: