+struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev)
+{
+ struct udev_monitor *udev_monitor;
+
+ if (udev == NULL)
+ return NULL;
+ udev_monitor = malloc(sizeof(struct udev_monitor));
+ if (udev_monitor == NULL)
+ return NULL;
+ memset(udev_monitor, 0x00, sizeof(struct udev_monitor));
+ udev_monitor->refcount = 1;
+ udev_monitor->udev = udev;
+
+ udev_monitor->sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
+ if (udev_monitor->sock == -1) {
+ err(udev, "error getting socket: %m\n");
+ free(udev_monitor);
+ return NULL;
+ }
+
+ udev_monitor->snl.nl_family = AF_NETLINK;
+ udev_monitor->snl.nl_pid = getpid();
+ udev_monitor->snl.nl_groups = 1;
+
+ info(udev, "monitor %p created with NETLINK_KOBJECT_UEVENT\n", udev_monitor);
+ return udev_monitor;
+}
+