]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
socket-util: remove unused {send,receive}_many_fds*()
authorMike Yuan <me@yhndnzj.com>
Sun, 15 Jun 2025 19:35:36 +0000 (21:35 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 17 Feb 2026 05:56:00 +0000 (14:56 +0900)
These were introduced as part of the effort of sd-executor
worker pool (#29566), which never landed due to unsignificant
performance improvement. Let's just remove the unused
helpers. If that work ever gets resurrected they can be
restored from this commit pretty easily.

src/basic/socket-util.c
src/basic/socket-util.h
src/test/test-socket-util.c

index 9f62b11427819aaca35a724d907e7339f250049c..1194eafc1b0cdae196c1a3fa05bc76ff58ebebea 100644 (file)
@@ -970,53 +970,6 @@ int getpeerpidref(int fd, PidRef *ret) {
         return pidref_set_pidfd_consume(ret, pidfd);
 }
 
-ssize_t send_many_fds_iov_sa(
-                int transport_fd,
-                int *fds_array, size_t n_fds_array,
-                const struct iovec *iov, size_t iovlen,
-                const struct sockaddr *sa, socklen_t len,
-                int flags) {
-
-        _cleanup_free_ struct cmsghdr *cmsg = NULL;
-        struct msghdr mh = {
-                .msg_name = (struct sockaddr*) sa,
-                .msg_namelen = len,
-                .msg_iov = (struct iovec *)iov,
-                .msg_iovlen = iovlen,
-        };
-        ssize_t k;
-
-        assert(transport_fd >= 0);
-        assert(fds_array || n_fds_array == 0);
-
-        /* The kernel will reject sending more than SCM_MAX_FD FDs at once */
-        if (n_fds_array > SCM_MAX_FD)
-                return -E2BIG;
-
-        /* We need either an FD array or data to send. If there's nothing, return an error. */
-        if (n_fds_array == 0 && !iov)
-                return -EINVAL;
-
-        if (n_fds_array > 0) {
-                mh.msg_controllen = CMSG_SPACE(sizeof(int) * n_fds_array);
-                mh.msg_control = cmsg = malloc(mh.msg_controllen);
-                if (!cmsg)
-                        return -ENOMEM;
-
-                *cmsg = (struct cmsghdr) {
-                        .cmsg_len = CMSG_LEN(sizeof(int) * n_fds_array),
-                        .cmsg_level = SOL_SOCKET,
-                        .cmsg_type = SCM_RIGHTS,
-                };
-                memcpy(CMSG_DATA(cmsg), fds_array, sizeof(int) * n_fds_array);
-        }
-        k = sendmsg(transport_fd, &mh, MSG_NOSIGNAL | flags);
-        if (k < 0)
-                return (ssize_t) -errno;
-
-        return k;
-}
-
 ssize_t send_one_fd_iov_sa(
                 int transport_fd,
                 int fd,
@@ -1072,74 +1025,6 @@ int send_one_fd_sa(
         return (int) send_one_fd_iov_sa(transport_fd, fd, NULL, 0, sa, len, flags);
 }
 
-ssize_t receive_many_fds_iov(
-                int transport_fd,
-                struct iovec *iov, size_t iovlen,
-                int **ret_fds_array, size_t *ret_n_fds_array,
-                int flags) {
-
-        CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(int) * SCM_MAX_FD)) control;
-        struct msghdr mh = {
-                .msg_control = &control,
-                .msg_controllen = sizeof(control),
-                .msg_iov = iov,
-                .msg_iovlen = iovlen,
-        };
-        _cleanup_free_ int *fds_array = NULL;
-        size_t n_fds_array = 0;
-        struct cmsghdr *cmsg;
-        ssize_t k;
-
-        assert(transport_fd >= 0);
-        assert(ret_fds_array);
-        assert(ret_n_fds_array);
-
-        /*
-         * Receive many FDs via @transport_fd. We don't care for the transport-type. We retrieve all the FDs
-         * at once. This is best used in combination with send_many_fds().
-         */
-
-        k = recvmsg_safe(transport_fd, &mh, MSG_CMSG_CLOEXEC | flags);
-        if (k < 0)
-                return k;
-
-        CMSG_FOREACH(cmsg, &mh)
-                if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
-                        size_t n = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
-
-                        if (!GREEDY_REALLOC_APPEND(fds_array, n_fds_array, CMSG_TYPED_DATA(cmsg, int), n)) {
-                                cmsg_close_all(&mh);
-                                return -ENOMEM;
-                        }
-                }
-
-        if (n_fds_array == 0) {
-                cmsg_close_all(&mh);
-
-                /* If didn't receive an FD or any data, return an error. */
-                if (k == 0)
-                        return -EIO;
-        }
-
-        *ret_fds_array = TAKE_PTR(fds_array);
-        *ret_n_fds_array = n_fds_array;
-
-        return k;
-}
-
-int receive_many_fds(int transport_fd, int **ret_fds_array, size_t *ret_n_fds_array, int flags) {
-        ssize_t k;
-
-        k = receive_many_fds_iov(transport_fd, NULL, 0, ret_fds_array, ret_n_fds_array, flags);
-        if (k == 0)
-                return 0;
-
-        /* k must be negative, since receive_many_fds_iov() only returns a positive value if data was received
-         * through the iov. */
-        assert(k < 0);
-        return (int) k;
-}
-
 ssize_t receive_one_fd_iov(
                 int transport_fd,
                 struct iovec *iov, size_t iovlen,
index dc6d2a0fc3c9c03562998a4332a57293f42b6e16..78b948ad461b57ea09751e128b4e92eb7fbb23a1 100644 (file)
@@ -120,28 +120,6 @@ int getpeergroups(int fd, gid_t **ret);
 int getpeerpidfd(int fd);
 int getpeerpidref(int fd, PidRef *ret);
 
-ssize_t send_many_fds_iov_sa(
-                int transport_fd,
-                int *fds_array, size_t n_fds_array,
-                const struct iovec *iov, size_t iovlen,
-                const struct sockaddr *sa, socklen_t len,
-                int flags);
-static inline ssize_t send_many_fds_iov(
-                int transport_fd,
-                int *fds_array, size_t n_fds_array,
-                const struct iovec *iov, size_t iovlen,
-                int flags) {
-
-        return send_many_fds_iov_sa(transport_fd, fds_array, n_fds_array, iov, iovlen, NULL, 0, flags);
-}
-static inline int send_many_fds(
-                int transport_fd,
-                int *fds_array,
-                size_t n_fds_array,
-                int flags) {
-
-        return send_many_fds_iov_sa(transport_fd, fds_array, n_fds_array, NULL, 0, NULL, 0, flags);
-}
 ssize_t send_one_fd_iov_sa(
                 int transport_fd,
                 int fd,
@@ -156,8 +134,6 @@ int send_one_fd_sa(int transport_fd,
 #define send_one_fd(transport_fd, fd, flags) send_one_fd_iov_sa(transport_fd, fd, NULL, 0, NULL, 0, flags)
 ssize_t receive_one_fd_iov(int transport_fd, struct iovec *iov, size_t iovlen, int flags, int *ret_fd);
 int receive_one_fd(int transport_fd, int flags);
-ssize_t receive_many_fds_iov(int transport_fd, struct iovec *iov, size_t iovlen, int **ret_fds_array, size_t *ret_n_fds_array, int flags);
-int receive_many_fds(int transport_fd, int **ret_fds_array, size_t *ret_n_fds_array, int flags);
 
 ssize_t next_datagram_size_fd(int fd);
 
@@ -203,9 +179,7 @@ void* cmsg_find_and_copy_data(struct msghdr *mh, int level, int type, void *buf,
         }
 
 size_t sockaddr_ll_len(const struct sockaddr_ll *sa);
-
 size_t sockaddr_un_len(const struct sockaddr_un *sa);
-
 size_t sockaddr_len(const union sockaddr_union *sa);
 
 int socket_ioctl_fd(void);
index 4549dcb0dda0e571543217dd4221bd41089ab8af..090839ac0684298490b380ada78b72eff95b689f 100644 (file)
@@ -299,70 +299,6 @@ TEST(passfd_contents_read) {
         ASSERT_STREQ(buf, file_contents);
 }
 
-TEST(pass_many_fds_contents_read) {
-        _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
-        static const char file_contents[][STRLEN("test contents in the fileX") + 1] = {
-                "test contents in the file0",
-                "test contents in the file1",
-                "test contents in the file2"
-        };
-        static const char wire_contents[] = "test contents on the wire";
-        int r;
-
-        assert_se(socketpair(AF_UNIX, SOCK_DGRAM, 0, pair) >= 0);
-
-        r = ASSERT_OK(pidref_safe_fork("(passfd_contents_read)", FORK_DEATHSIG_SIGTERM|FORK_LOG|FORK_WAIT, NULL));
-
-        if (r == 0) {
-                /* Child */
-                struct iovec iov = IOVEC_MAKE_STRING(wire_contents);
-                char tmpfile[][STRLEN("/tmp/test-socket-util-passfd-contents-read-XXXXXX") + 1] = {
-                        "/tmp/test-socket-util-passfd-contents-read-XXXXXX",
-                        "/tmp/test-socket-util-passfd-contents-read-XXXXXX",
-                        "/tmp/test-socket-util-passfd-contents-read-XXXXXX"
-                };
-                int tmpfds[3] = EBADF_TRIPLET;
-
-                pair[0] = safe_close(pair[0]);
-
-                for (size_t i = 0; i < 3; ++i) {
-                        assert_se(write_tmpfile(tmpfile[i], file_contents[i]) == 0);
-                        tmpfds[i] = open(tmpfile[i], O_RDONLY);
-                        assert_se(tmpfds[i] >= 0);
-                        assert_se(unlink(tmpfile[i]) == 0);
-                }
-
-                assert_se(send_many_fds_iov(pair[1], tmpfds, 3, &iov, 1, MSG_DONTWAIT) > 0);
-                close_many(tmpfds, 3);
-                _exit(EXIT_SUCCESS);
-        }
-
-        /* Parent */
-        char buf[64];
-        struct iovec iov = IOVEC_MAKE(buf, sizeof(buf)-1);
-        _cleanup_free_ int *fds = NULL;
-        size_t n_fds = 0;
-        ssize_t k;
-
-        pair[1] = safe_close(pair[1]);
-
-        k = receive_many_fds_iov(pair[0], &iov, 1, &fds, &n_fds, MSG_DONTWAIT);
-        assert_se(k > 0);
-        buf[k] = 0;
-        ASSERT_STREQ(buf, wire_contents);
-
-        assert_se(n_fds == 3);
-
-        for (size_t i = 0; i < 3; ++i) {
-                assert_se(fds[i] >= 0);
-                r = read(fds[i], buf, sizeof(buf)-1);
-                assert_se(r >= 0);
-                buf[r] = 0;
-                ASSERT_STREQ(buf, file_contents[i]);
-                safe_close(fds[i]);
-        }
-}
-
 TEST(receive_nopassfd) {
         _cleanup_close_pair_ int pair[2] = EBADF_PAIR;
         static const char wire_contents[] = "no fd passed here";