test "$prefix" = NONE && test "$exec_prefix" = NONE && exec_prefix=
dnl /* libudev version */
-LIBUDEV_LT_CURRENT=1
-LIBUDEV_LT_REVISION=1
-LIBUDEV_LT_AGE=1
+LIBUDEV_LT_CURRENT=2
+LIBUDEV_LT_REVISION=0
+LIBUDEV_LT_AGE=2
AC_SUBST(LIBUDEV_LT_CURRENT)
AC_SUBST(LIBUDEV_LT_REVISION)
AC_SUBST(LIBUDEV_LT_AGE)
# run a command on remove events
ACTION=="remove", ENV{REMOVE_CMD}!="", RUN+="$env{REMOVE_CMD}"
-
-# event to be catched by udevmonitor
-RUN+="socket:@/org/kernel/udev/monitor"
-
int refcount;
int sock;
struct sockaddr_nl snl;
+ struct sockaddr_nl snl_peer;
struct sockaddr_un sun;
socklen_t addrlen;
};
return udev_monitor;
}
-struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev)
+struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, unsigned int group)
{
struct udev_monitor *udev_monitor;
}
udev_monitor->snl.nl_family = AF_NETLINK;
- udev_monitor->snl.nl_pid = getpid();
- udev_monitor->snl.nl_groups = 1;
+ udev_monitor->snl.nl_groups = group;
+ udev_monitor->snl_peer.nl_family = AF_NETLINK;
+ udev_monitor->snl_peer.nl_groups = UDEV_MONITOR_UDEV;
- dbg(udev, "monitor %p created with NETLINK_KOBJECT_UEVENT\n", udev_monitor);
+ dbg(udev, "monitor %p created with NETLINK_KOBJECT_UEVENT (%u)\n", udev_monitor, group);
return udev_monitor;
}
const int on = 1;
if (udev_monitor->snl.nl_family != 0) {
- err = bind(udev_monitor->sock, (struct sockaddr *)&udev_monitor->snl, sizeof(struct sockaddr_nl));
+ err = bind(udev_monitor->sock,
+ (struct sockaddr *)&udev_monitor->snl, sizeof(struct sockaddr_nl));
if (err < 0) {
err(udev_monitor->udev, "bind failed: %m\n");
return err;
}
dbg(udev_monitor->udev, "monitor %p listening on netlink\n", udev_monitor);
} else if (udev_monitor->sun.sun_family != 0) {
- err = bind(udev_monitor->sock, (struct sockaddr *)&udev_monitor->sun, udev_monitor->addrlen);
+ err = bind(udev_monitor->sock,
+ (struct sockaddr *)&udev_monitor->sun, udev_monitor->addrlen);
if (err < 0) {
err(udev_monitor->udev, "bind failed: %m\n");
return err;
len = udev_device_get_properties_monitor_buf(udev_device, &buf);
if (len < 32)
return -1;
- count = sendto(udev_monitor->sock,
- buf, len, 0,
- (struct sockaddr *)&udev_monitor->sun, udev_monitor->addrlen);
+ if (udev_monitor->sun.sun_family != 0) {
+ count = sendto(udev_monitor->sock,
+ buf, len, 0,
+ (struct sockaddr *)&udev_monitor->sun,
+ udev_monitor->addrlen);
+ } else {
+ /* no destination besides the muticast group, we will always get -1 ECONNREFUSED */
+ count = sendto(udev_monitor->sock,
+ buf, len, 0,
+ (struct sockaddr *)&udev_monitor->snl_peer,
+ sizeof(struct sockaddr_nl));
+ }
info(udev_monitor->udev, "passed %zi bytes to monitor %p, \n", count, udev_monitor);
return count;
}
/* udev and kernel device events */
struct udev_monitor;
+enum udev_monitor_netlink_group {
+ UDEV_MONITOR_KERNEL = 1,
+ UDEV_MONITOR_UDEV = 2,
+};
extern struct udev_monitor *udev_monitor_new_from_socket(struct udev *udev, const char *socket_path);
-extern struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev);
+extern struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, enum udev_monitor_netlink_group group);
extern int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor);
extern struct udev_monitor *udev_monitor_ref(struct udev_monitor *udev_monitor);
extern void udev_monitor_unref(struct udev_monitor *udev_monitor);
print_udev =1;
}
- if (getuid() != 0 && print_kernel) {
- fprintf(stderr, "root privileges needed to subscribe to kernel events\n");
- goto out;
- }
-
/* set signal handlers */
memset(&act, 0x00, sizeof(struct sigaction));
act.sa_handler = (void (*)(int)) sig_handler;
printf("monitor will print the received events for:\n");
if (print_udev) {
- udev_monitor = udev_monitor_new_from_socket(udev, "@/org/kernel/udev/monitor");
+ udev_monitor = udev_monitor_new_from_netlink(udev, UDEV_MONITOR_UDEV);
if (udev_monitor == NULL) {
rc = 1;
goto out;
printf("UDEV - the event which udev sends out after rule processing\n");
}
if (print_kernel) {
- kernel_monitor = udev_monitor_new_from_netlink(udev);
+ kernel_monitor = udev_monitor_new_from_netlink(udev, UDEV_MONITOR_KERNEL);
if (kernel_monitor == NULL) {
+ fprintf(stderr, "unable to subscribe to kernel events\n");
rc = 3;
goto out;
}
switch (pid) {
case 0:
/* child */
- udev_monitor_unref(kernel_monitor);
udev_ctrl_unref(udev_ctrl);
logging_close();
logging_init("udevd-event");
udev_device_update_db(event->dev);
}
+ /* send processed event back to the kernel netlink socket */
+ udev_monitor_send_device(kernel_monitor, event->dev);
+
info(event->udev, "seq %llu exit with %i\n", udev_device_get_seqnum(event->dev), err);
logging_close();
if (err != 0)
goto exit;
}
- kernel_monitor = udev_monitor_new_from_netlink(udev);
+ kernel_monitor = udev_monitor_new_from_netlink(udev, UDEV_MONITOR_KERNEL);
if (kernel_monitor == NULL || udev_monitor_enable_receiving(kernel_monitor) < 0) {
fprintf(stderr, "error initializing netlink socket\n");
err(udev, "error initializing netlink socket\n");