+ udev_monitor_unref(m);
+ return -1;
+}
+
+/*
+ * udev_process - waiter callback for monitor netlink.
+ */
+
+static int udev_process(void *arg)
+{
+ struct udev_monitor *monitor = arg;
+ struct udev_device *dev;
+ const char *action;
+ int result;
+
+ dev = udev_monitor_receive_device(monitor);
+
+ if (!dev) {
+ pb_log("udev_monitor_receive_device failed\n");
+ return -1;
+ }
+
+ action = udev_device_get_action(dev);
+
+ if (!action) {
+ pb_log("udev_device_get_action failed\n");
+ goto fail;
+ }
+
+ result = udev_handle_dev_action(dev, action);
+
+ udev_device_unref(dev);
+ return result;
+
+fail:
+ udev_device_unref(dev);
+ return -1;
+}
+
+static void udev_log_fn(struct udev __attribute__((unused)) *udev,
+ int __attribute__((unused)) priority, const char *file, int line,
+ const char *fn, const char *format, va_list args)
+{
+ pb_log("libudev: %s %s:%d: ", fn, file, line);
+ vfprintf(pb_log_get_stream(), format, args);