From: Mike Yuan Date: Sun, 15 Jun 2025 19:35:36 +0000 (+0200) Subject: socket-util: remove unused {send,receive}_many_fds*() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fad273450ad8bc73f1ecde4504555196777493e4;p=thirdparty%2Fsystemd.git socket-util: remove unused {send,receive}_many_fds*() 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. --- diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 9f62b114278..1194eafc1b0 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -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, diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index dc6d2a0fc3c..78b948ad461 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -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); diff --git a/src/test/test-socket-util.c b/src/test/test-socket-util.c index 4549dcb0dda..090839ac068 100644 --- a/src/test/test-socket-util.c +++ b/src/test/test-socket-util.c @@ -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";