]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sysupdated: use notify_socket_prepare() 36911/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 31 Mar 2025 17:16:42 +0000 (02:16 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 31 Mar 2025 18:58:38 +0000 (03:58 +0900)
This also make it use autobind notify socket.

src/sysupdate/sysupdated.c

index db11c30ac48b771e596f5a90530ab83204426f99..fcb949fc0fc636eefc8a1f5a56384161968efac1 100644 (file)
@@ -46,7 +46,7 @@ typedef struct Manager {
 
         Hashmap *polkit_registry;
 
-        sd_event_source *notify_event;
+        char *notify_socket_path;
 
         RuntimeScope runtime_scope; /* For now only RUNTIME_SCOPE_SYSTEM */
 } Manager;
@@ -456,7 +456,7 @@ static int job_start(Job *j) {
                 };
                 size_t k = 2;
 
-                if (setenv("NOTIFY_SOCKET", "/run/systemd/sysupdate/notify", /* overwrite= */ 1) < 0) {
+                if (setenv("NOTIFY_SOCKET", j->manager->notify_socket_path, /* overwrite= */ 1) < 0) {
                         log_error_errno(errno, "setenv() failed: %m");
                         _exit(EXIT_FAILURE);
                 }
@@ -1637,7 +1637,7 @@ static Manager *manager_free(Manager *m) {
         hashmap_free(m->jobs);
 
         m->bus = sd_bus_flush_close_unref(m->bus);
-        sd_event_source_unref(m->notify_event);
+        free(m->notify_socket_path);
         sd_event_unref(m->event);
 
         return mfree(m);
@@ -1698,11 +1698,6 @@ static int manager_on_notify(sd_event_source *s, int fd, uint32_t revents, void
 
 static int manager_new(Manager **ret) {
         _cleanup_(manager_freep) Manager *m = NULL;
-        _cleanup_close_ int notify_fd = -EBADF;
-        static const union sockaddr_union sa = {
-                .un.sun_family = AF_UNIX,
-                .un.sun_path = "/run/systemd/sysupdate/notify",
-        };
         int r;
 
         assert(ret);
@@ -1738,34 +1733,14 @@ static int manager_new(Manager **ret) {
         if (r < 0)
                 return r;
 
-        notify_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
-        if (notify_fd < 0)
-                return -errno;
-
-        (void) mkdir_parents_label(sa.un.sun_path, 0755);
-        (void) sockaddr_un_unlink(&sa.un);
-
-        if (bind(notify_fd, &sa.sa, SOCKADDR_UN_LEN(sa.un)) < 0)
-                return -errno;
-
-        r = setsockopt_int(notify_fd, SOL_SOCKET, SO_PASSCRED, true);
-        if (r < 0)
-                return r;
-
-        r = setsockopt_int(notify_fd, SOL_SOCKET, SO_PASSPIDFD, true);
-        if (r < 0)
-                log_debug_errno(r, "Failed to enable SO_PASSPIDFD, ignoring: %m");
-
-        r = sd_event_add_io(m->event, &m->notify_event, notify_fd, EPOLLIN, manager_on_notify, m);
-        if (r < 0)
-                return r;
-
-        (void) sd_event_source_set_description(m->notify_event, "notify-socket");
-
-        r = sd_event_source_set_io_fd_own(m->notify_event, true);
+        r = notify_socket_prepare(
+                        m->event,
+                        SD_EVENT_PRIORITY_NORMAL,
+                        manager_on_notify,
+                        m,
+                        &m->notify_socket_path);
         if (r < 0)
                 return r;
-        TAKE_FD(notify_fd);
 
         *ret = TAKE_PTR(m);
         return 0;