]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-ctrl: make udev_ctrl_new() return negative errno on failure
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 24 Jan 2019 06:00:06 +0000 (15:00 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Feb 2019 21:17:42 +0000 (06:17 +0900)
src/udev/udev-ctrl.c
src/udev/udev-ctrl.h
src/udev/udevadm-control.c
src/udev/udevadm-settle.c
src/udev/udevadm-trigger.c
src/udev/udevd.c

index c217815ac69fe0b9ca44d6b389149c8a062ff24b..0ed59c0c702554c2e0c8454d3f498c793f33face 100644 (file)
@@ -73,27 +73,29 @@ struct udev_ctrl_connection {
         int sock;
 };
 
-struct udev_ctrl *udev_ctrl_new_from_fd(int fd) {
+int udev_ctrl_new_from_fd(struct udev_ctrl **ret, int fd) {
+        _cleanup_close_ int sock = -1;
         struct udev_ctrl *uctrl;
         int r;
 
-        uctrl = new0(struct udev_ctrl, 1);
-        if (!uctrl)
-                return NULL;
-        uctrl->n_ref = 1;
+        assert(ret);
 
         if (fd < 0) {
-                uctrl->sock = socket(AF_LOCAL, SOCK_SEQPACKET|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
-                if (uctrl->sock < 0) {
-                        log_error_errno(errno, "Failed to create socket: %m");
-                        udev_ctrl_unref(uctrl);
-                        return NULL;
-                }
-        } else {
-                uctrl->bound = true;
-                uctrl->sock = fd;
+                sock = socket(AF_LOCAL, SOCK_SEQPACKET|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
+                if (sock < 0)
+                        return log_error_errno(errno, "Failed to create socket: %m");
         }
 
+        uctrl = new(struct udev_ctrl, 1);
+        if (!uctrl)
+                return -ENOMEM;
+
+        *uctrl = (struct udev_ctrl) {
+                .n_ref = 1,
+                .sock = fd >= 0 ? fd : TAKE_FD(sock),
+                .bound = fd >= 0,
+        };
+
         /*
          * FIXME: remove it as soon as we can depend on this:
          *   http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=90c6bd34f884cd9cee21f1d152baf6c18bcac949
@@ -108,11 +110,9 @@ struct udev_ctrl *udev_ctrl_new_from_fd(int fd) {
         };
 
         uctrl->addrlen = SOCKADDR_UN_LEN(uctrl->saddr.un);
-        return uctrl;
-}
 
-struct udev_ctrl *udev_ctrl_new(void) {
-        return udev_ctrl_new_from_fd(-1);
+        *ret = TAKE_PTR(uctrl);
+        return 0;
 }
 
 int udev_ctrl_enable_receiving(struct udev_ctrl *uctrl) {
index 8e452a42497fc56d759bb4e1e772ca7e3ddd6a39..7ea0de41d415dfc650a2311398ae62bf22eb3f3f 100644 (file)
@@ -5,8 +5,12 @@
 #include "time-util.h"
 
 struct udev_ctrl;
-struct udev_ctrl *udev_ctrl_new(void);
-struct udev_ctrl *udev_ctrl_new_from_fd(int fd);
+
+int udev_ctrl_new_from_fd(struct udev_ctrl **ret, int fd);
+static inline int udev_ctrl_new(struct udev_ctrl **ret) {
+        return udev_ctrl_new_from_fd(ret, -1);
+}
+
 int udev_ctrl_enable_receiving(struct udev_ctrl *uctrl);
 struct udev_ctrl *udev_ctrl_unref(struct udev_ctrl *uctrl);
 int udev_ctrl_cleanup(struct udev_ctrl *uctrl);
index 7cfc4c929d1e3368dd27535af43654878c26656a..b2fe69a1fd98e11fba7dcabfc50de82f923c783d 100644 (file)
@@ -86,9 +86,9 @@ int control_main(int argc, char *argv[], void *userdata) {
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "This command expects one or more options.");
 
-        uctrl = udev_ctrl_new();
-        if (!uctrl)
-                return log_oom();
+        r = udev_ctrl_new(&uctrl);
+        if (r < 0)
+                return log_error_errno(r, "Failed to initialize udev control: %m");
 
         while ((c = getopt_long(argc, argv, "el:sSRp:m:t:Vh", options, NULL)) >= 0)
                 switch (c) {
index 8d9c4509ff8da56817a7d7f8b9595d6a87d381f6..b4ea5a36a57671cac654b6b679962d5d338479a3 100644 (file)
@@ -100,8 +100,7 @@ int settle_main(int argc, char *argv[], void *userdata) {
         if (getuid() == 0) {
                 _cleanup_(udev_ctrl_unrefp) struct udev_ctrl *uctrl = NULL;
 
-                uctrl = udev_ctrl_new();
-                if (uctrl) {
+                if (udev_ctrl_new(&uctrl) >= 0) {
                         r = udev_ctrl_send_ping(uctrl, MAX(5 * USEC_PER_SEC, arg_timeout));
                         if (r < 0) {
                                 log_debug_errno(r, "Failed to connect to udev daemon: %m");
index 2a658158e61d0533919e97908d1cb78e50d51678..14c70e40092d847fff98e3a10aaf50f2bdd3e154 100644 (file)
@@ -308,9 +308,9 @@ int trigger_main(int argc, char *argv[], void *userdata) {
         if (ping) {
                 _cleanup_(udev_ctrl_unrefp) struct udev_ctrl *uctrl = NULL;
 
-                uctrl = udev_ctrl_new();
-                if (!uctrl)
-                        return log_oom();
+                r = udev_ctrl_new(&uctrl);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to initialize udev control: %m");
 
                 r = udev_ctrl_send_ping(uctrl, ping_timeout_usec);
                 if (r < 0)
index a5c24a70f4f9693d719c21081a71bbd0a325ee0e..dd100dd92ad3a0396a56705cf72b69fd806c5452 100644 (file)
@@ -1596,9 +1596,9 @@ static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cg
                 .cgroup = cgroup,
         };
 
-        manager->ctrl = udev_ctrl_new_from_fd(fd_ctrl);
-        if (!manager->ctrl)
-                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to initialize udev control socket");
+        r = udev_ctrl_new_from_fd(&manager->ctrl, fd_ctrl);
+        if (r < 0)
+                return log_error_errno(r, "Failed to initialize udev control socket: %m");
 
         r = udev_ctrl_enable_receiving(manager->ctrl);
         if (r < 0)