chiark / gitweb /
udev: remove RUN+="socket:.." and udev_monitor_new_from_netlink()
authorKay Sievers <kay@vrfy.org>
Mon, 9 Apr 2012 18:45:45 +0000 (20:45 +0200)
committerKay Sievers <kay@vrfy.org>
Mon, 9 Apr 2012 19:18:30 +0000 (21:18 +0200)
Makefile.am
NEWS
TODO
src/udev/libudev-monitor.c
src/udev/libudev.h
src/udev/udev-event.c
src/udev/udev-rules.c

index 95119e30dbbdf538e304420584b5b46287141d78..8f56d2549605e6af6771cb25a13edf0a55161a05 100644 (file)
@@ -22,7 +22,7 @@ AM_MAKEFLAGS = --no-print-directory
 SUBDIRS = . po
 
 LIBUDEV_CURRENT=13
-LIBUDEV_REVISION=2
+LIBUDEV_REVISION=3
 LIBUDEV_AGE=13
 
 LIBGUDEV_CURRENT=1
diff --git a/NEWS b/NEWS
index 90445dfbe8ed9f05dd2cf0a4e17c210e4796e158..7984b6be94dccf1864d70a39deabc766b1b2139a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,10 @@ CHANGES WITH 182:
         * udev: /lib/udev/devices/ are not read anymore; tmpfiles should
           be used to create workarounds for broken subsystems.
 
+        * udev: RUN+="socket:..."  and udev_monitor_new_from_socket() is
+          no longer supported. udev_monitor_new_from_netlink() needs to be
+          used to subscribe to events.
+
         * systemd-logingctl and systemd-journalctl have been renamed
           to logingctl and journalctl to match systemctl.
 
diff --git a/TODO b/TODO
index d794cbb94976248517087b65938c94ac27228080..900412d8e5a30cffd73265c0211a9a71ab022cae 100644 (file)
--- a/TODO
+++ b/TODO
@@ -25,13 +25,10 @@ Features:
 
 * udev: scsi_id -> sg3_utils?
 
-* udev: kill /usr/lib/udev/devices/ and use tmpfiles for it
-
 * udev: add trigger --subsystem-match=usb/usb_device
 
-* udev: remove RUN+="socket:"
-
 * udev: libudev.so.1
+  - remove deprecated symbols
   - use symbol versioning
   - return object with *_unref()
   - kill: udev_monitor_from_socket()
index 7fcf7e52f25bc6c552ba388c82a498ec412647b2..5da41e7b43fb4aae093112b5f959a5f4054a0b34 100644 (file)
@@ -46,7 +46,6 @@ struct udev_monitor {
         struct sockaddr_nl snl;
         struct sockaddr_nl snl_trusted_sender;
         struct sockaddr_nl snl_destination;
-        struct sockaddr_un sun;
         socklen_t addrlen;
         struct udev_list filter_subsystem_list;
         struct udev_list filter_tag_list;
@@ -102,62 +101,13 @@ static struct udev_monitor *udev_monitor_new(struct udev *udev)
  * @udev: udev library context
  * @socket_path: unix socket path
  *
- * This function should not be used in any new application. The
- * kernel's netlink socket multiplexes messages to all interested
- * clients. Creating custom sockets from udev to applications
- * should be avoided.
+ * This function is removed from libudev and will not do anything.
  *
- * Create a new udev monitor and connect to a specified socket. The
- * path to a socket either points to an existing socket file, or if
- * the socket path starts with a '@' character, an abstract namespace
- * socket will be used.
- *
- * A socket file will not be created. If it does not already exist,
- * it will fall-back and connect to an abstract namespace socket with
- * the given path. The permissions adjustment of a socket file, as
- * well as the later cleanup, needs to be done by the caller.
- *
- * The initial refcount is 1, and needs to be decremented to
- * release the resources of the udev monitor.
- *
- * Returns: a new udev monitor, or #NULL, in case of an error
+ * Returns: #NULL
  **/
 _public_ struct udev_monitor *udev_monitor_new_from_socket(struct udev *udev, const char *socket_path)
 {
-        struct udev_monitor *udev_monitor;
-        struct stat statbuf;
-
-        if (udev == NULL)
-                return NULL;
-        if (socket_path == NULL)
-                return NULL;
-        udev_monitor = udev_monitor_new(udev);
-        if (udev_monitor == NULL)
-                return NULL;
-
-        udev_monitor->sun.sun_family = AF_LOCAL;
-        if (socket_path[0] == '@') {
-                /* translate leading '@' to abstract namespace */
-                util_strscpy(udev_monitor->sun.sun_path, sizeof(udev_monitor->sun.sun_path), socket_path);
-                udev_monitor->sun.sun_path[0] = '\0';
-                udev_monitor->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(socket_path);
-        } else if (stat(socket_path, &statbuf) == 0 && S_ISSOCK(statbuf.st_mode)) {
-                /* existing socket file */
-                util_strscpy(udev_monitor->sun.sun_path, sizeof(udev_monitor->sun.sun_path), socket_path);
-                udev_monitor->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(socket_path);
-        } else {
-                /* no socket file, assume abstract namespace socket */
-                util_strscpy(&udev_monitor->sun.sun_path[1], sizeof(udev_monitor->sun.sun_path)-1, socket_path);
-                udev_monitor->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(socket_path)+1;
-        }
-        udev_monitor->sock = socket(AF_LOCAL, SOCK_DGRAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
-        if (udev_monitor->sock == -1) {
-                err(udev, "error getting socket: %m\n");
-                free(udev_monitor);
-                return NULL;
-        }
-
-        return udev_monitor;
+        return NULL;
 }
 
 struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const char *name, int fd)
@@ -379,39 +329,31 @@ _public_ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor)
         int err = 0;
         const int on = 1;
 
-        if (udev_monitor->sun.sun_family != 0) {
-                if (!udev_monitor->bound) {
-                        err = bind(udev_monitor->sock,
-                                   (struct sockaddr *)&udev_monitor->sun, udev_monitor->addrlen);
-                        if (err == 0)
-                                udev_monitor->bound = true;
-                }
-        } else if (udev_monitor->snl.nl_family != 0) {
-                udev_monitor_filter_update(udev_monitor);
-                if (!udev_monitor->bound) {
-                        err = bind(udev_monitor->sock,
-                                   (struct sockaddr *)&udev_monitor->snl, sizeof(struct sockaddr_nl));
-                        if (err == 0)
-                                udev_monitor->bound = true;
-                }
-                if (err == 0) {
-                        struct sockaddr_nl snl;
-                        socklen_t addrlen;
-
-                        /*
-                         * get the address the kernel has assigned us
-                         * it is usually, but not necessarily the pid
-                         */
-                        addrlen = sizeof(struct sockaddr_nl);
-                        err = getsockname(udev_monitor->sock, (struct sockaddr *)&snl, &addrlen);
-                        if (err == 0)
-                                udev_monitor->snl.nl_pid = snl.nl_pid;
-                }
-        } else {
+        if (udev_monitor->snl.nl_family == 0)
                 return -EINVAL;
+
+        udev_monitor_filter_update(udev_monitor);
+
+        if (!udev_monitor->bound) {
+                err = bind(udev_monitor->sock,
+                           (struct sockaddr *)&udev_monitor->snl, sizeof(struct sockaddr_nl));
+                if (err == 0)
+                        udev_monitor->bound = true;
         }
 
-        if (err < 0) {
+        if (err >= 0) {
+                struct sockaddr_nl snl;
+                socklen_t addrlen;
+
+                /*
+                 * get the address the kernel has assigned us
+                 * it is usually, but not necessarily the pid
+                 */
+                addrlen = sizeof(struct sockaddr_nl);
+                err = getsockname(udev_monitor->sock, (struct sockaddr *)&snl, &addrlen);
+                if (err == 0)
+                        udev_monitor->snl.nl_pid = snl.nl_pid;
+        } else {
                 err(udev_monitor->udev, "bind failed: %m\n");
                 return err;
         }
@@ -713,98 +655,65 @@ int udev_monitor_send_device(struct udev_monitor *udev_monitor,
         const char *buf;
         ssize_t blen;
         ssize_t count;
+        struct msghdr smsg;
+        struct iovec iov[2];
+        const char *val;
+        struct udev_monitor_netlink_header nlh;
+        struct udev_list_entry *list_entry;
+        uint64_t tag_bloom_bits;
+
+        if (udev_monitor->snl.nl_family == 0)
+                return -EINVAL;
 
         blen = udev_device_get_properties_monitor_buf(udev_device, &buf);
         if (blen < 32)
                 return -EINVAL;
 
-        if (udev_monitor->sun.sun_family != 0) {
-                struct msghdr smsg;
-                struct iovec iov[2];
-                const char *action;
-                char header[2048];
-                char *s;
-
-                /* header <action>@<devpath> */
-                action = udev_device_get_action(udev_device);
-                if (action == NULL)
-                        return -EINVAL;
-                s = header;
-                if (util_strpcpyl(&s, sizeof(header), action, "@", udev_device_get_devpath(udev_device), NULL) == 0)
-                        return -EINVAL;
-                iov[0].iov_base = header;
-                iov[0].iov_len = (s - header)+1;
-
-                /* add properties list */
-                iov[1].iov_base = (char *)buf;
-                iov[1].iov_len = blen;
-
-                memset(&smsg, 0x00, sizeof(struct msghdr));
-                smsg.msg_iov = iov;
-                smsg.msg_iovlen = 2;
-                smsg.msg_name = &udev_monitor->sun;
-                smsg.msg_namelen = udev_monitor->addrlen;
-                count = sendmsg(udev_monitor->sock, &smsg, 0);
-                dbg(udev_monitor->udev, "passed %zi bytes to socket monitor %p\n", count, udev_monitor);
-                return count;
+        /* add versioned header */
+        memset(&nlh, 0x00, sizeof(struct udev_monitor_netlink_header));
+        memcpy(nlh.prefix, "libudev", 8);
+        nlh.magic = htonl(UDEV_MONITOR_MAGIC);
+        nlh.header_size = sizeof(struct udev_monitor_netlink_header);
+        val = udev_device_get_subsystem(udev_device);
+        nlh.filter_subsystem_hash = htonl(util_string_hash32(val));
+        val = udev_device_get_devtype(udev_device);
+        if (val != NULL)
+                nlh.filter_devtype_hash = htonl(util_string_hash32(val));
+        iov[0].iov_base = &nlh;
+        iov[0].iov_len = sizeof(struct udev_monitor_netlink_header);
+
+        /* add tag bloom filter */
+        tag_bloom_bits = 0;
+        udev_list_entry_foreach(list_entry, udev_device_get_tags_list_entry(udev_device))
+                tag_bloom_bits |= util_string_bloom64(udev_list_entry_get_name(list_entry));
+        if (tag_bloom_bits > 0) {
+                nlh.filter_tag_bloom_hi = htonl(tag_bloom_bits >> 32);
+                nlh.filter_tag_bloom_lo = htonl(tag_bloom_bits & 0xffffffff);
         }
 
-        if (udev_monitor->snl.nl_family != 0) {
-                struct msghdr smsg;
-                struct iovec iov[2];
-                const char *val;
-                struct udev_monitor_netlink_header nlh;
-                struct udev_list_entry *list_entry;
-                uint64_t tag_bloom_bits;
-
-                /* add versioned header */
-                memset(&nlh, 0x00, sizeof(struct udev_monitor_netlink_header));
-                memcpy(nlh.prefix, "libudev", 8);
-                nlh.magic = htonl(UDEV_MONITOR_MAGIC);
-                nlh.header_size = sizeof(struct udev_monitor_netlink_header);
-                val = udev_device_get_subsystem(udev_device);
-                nlh.filter_subsystem_hash = htonl(util_string_hash32(val));
-                val = udev_device_get_devtype(udev_device);
-                if (val != NULL)
-                        nlh.filter_devtype_hash = htonl(util_string_hash32(val));
-                iov[0].iov_base = &nlh;
-                iov[0].iov_len = sizeof(struct udev_monitor_netlink_header);
-
-                /* add tag bloom filter */
-                tag_bloom_bits = 0;
-                udev_list_entry_foreach(list_entry, udev_device_get_tags_list_entry(udev_device))
-                        tag_bloom_bits |= util_string_bloom64(udev_list_entry_get_name(list_entry));
-                if (tag_bloom_bits > 0) {
-                        nlh.filter_tag_bloom_hi = htonl(tag_bloom_bits >> 32);
-                        nlh.filter_tag_bloom_lo = htonl(tag_bloom_bits & 0xffffffff);
-                }
-
-                /* add properties list */
-                nlh.properties_off = iov[0].iov_len;
-                nlh.properties_len = blen;
-                iov[1].iov_base = (char *)buf;
-                iov[1].iov_len = blen;
+        /* add properties list */
+        nlh.properties_off = iov[0].iov_len;
+        nlh.properties_len = blen;
+        iov[1].iov_base = (char *)buf;
+        iov[1].iov_len = blen;
 
-                memset(&smsg, 0x00, sizeof(struct msghdr));
-                smsg.msg_iov = iov;
-                smsg.msg_iovlen = 2;
-                /*
-                 * Use custom address for target, or the default one.
-                 *
-                 * If we send to a multicast group, we will get
-                 * ECONNREFUSED, which is expected.
-                 */
-                if (destination != NULL)
-                        smsg.msg_name = &destination->snl;
-                else
-                        smsg.msg_name = &udev_monitor->snl_destination;
-                smsg.msg_namelen = sizeof(struct sockaddr_nl);
-                count = sendmsg(udev_monitor->sock, &smsg, 0);
-                dbg(udev_monitor->udev, "passed %zi bytes to netlink monitor %p\n", count, udev_monitor);
-                return count;
-        }
-
-        return -EINVAL;
+        memset(&smsg, 0x00, sizeof(struct msghdr));
+        smsg.msg_iov = iov;
+        smsg.msg_iovlen = 2;
+        /*
+         * Use custom address for target, or the default one.
+         *
+         * If we send to a multicast group, we will get
+         * ECONNREFUSED, which is expected.
+         */
+        if (destination != NULL)
+                smsg.msg_name = &destination->snl;
+        else
+                smsg.msg_name = &udev_monitor->snl_destination;
+        smsg.msg_namelen = sizeof(struct sockaddr_nl);
+        count = sendmsg(udev_monitor->sock, &smsg, 0);
+        dbg(udev_monitor->udev, "passed %zi bytes to netlink monitor %p\n", count, udev_monitor);
+        return count;
 }
 
 /**
index 10e098d4f7ca5606cede549aa0ff88fe8b736bca..3bcddb2eb3e37ea7db852e94e40fbe04efc73820 100644 (file)
@@ -114,8 +114,6 @@ void udev_monitor_unref(struct udev_monitor *udev_monitor);
 struct udev *udev_monitor_get_udev(struct udev_monitor *udev_monitor);
 /* kernel and udev generated events over netlink */
 struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char *name);
-/* custom socket (use netlink and filters instead) */
-struct udev_monitor *udev_monitor_new_from_socket(struct udev *udev, const char *socket_path);
 /* bind socket */
 int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor);
 int udev_monitor_set_receive_buffer_size(struct udev_monitor *udev_monitor, int size);
@@ -127,6 +125,7 @@ int udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_mo
 int udev_monitor_filter_add_match_tag(struct udev_monitor *udev_monitor, const char *tag);
 int udev_monitor_filter_update(struct udev_monitor *udev_monitor);
 int udev_monitor_filter_remove(struct udev_monitor *udev_monitor);
+__attribute__((deprecated)) struct udev_monitor *udev_monitor_new_from_socket(struct udev *udev, const char *socket_path);
 
 /*
  * udev_enumerate
index 2b4cc6923e2364d5ad131035cc282922aa6d1cd1..afbfebb3a9934394da7cff77dc248fda9650836a 100644 (file)
@@ -956,14 +956,6 @@ void udev_event_execute_run(struct udev_event *event, const sigset_t *sigmask)
 
                         udev_event_apply_format(event, cmd, command, sizeof(command));
                         udev_builtin_run(event->dev, builtin_cmd, command, false);
-                } else if (strncmp(cmd, "socket:", strlen("socket:")) == 0) {
-                        struct udev_monitor *monitor;
-
-                        monitor = udev_monitor_new_from_socket(event->udev, &cmd[strlen("socket:")]);
-                        if (monitor == NULL)
-                                continue;
-                        udev_monitor_send_device(monitor, NULL, event->dev);
-                        udev_monitor_unref(monitor);
                 } else {
                         char program[UTIL_PATH_SIZE];
                         char **envp;
index 73e17c65c0f12b00af114eb810b6016046b545d2..401da5d8c5efa3a1ad2a89e3301115f067ae537c 100644 (file)
@@ -1450,9 +1450,6 @@ static int add_rule(struct udev_rules *rules, char *line,
                         } else if (strcmp(attr, "program") == 0) {
                                 enum udev_builtin_cmd cmd = UDEV_BUILTIN_MAX;
 
-                                if (strncmp(value, "socket:", 7) == 0)
-                                        log_error("RUN+=\"socket:...\" support will be removed from a future udev release. "
-                                            "Please remove it from: %s:%u and use libudev to subscribe to events.\n", filename, lineno);
                                 rule_add_key(&rule_tmp, TK_A_RUN_PROGRAM, op, value, &cmd);
                         } else {
                                 log_error("RUN{} unknown type, ignoring RUN %s:%u\n", filename, lineno);