swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

commit 2c544a955832762dae212468df2b4087815c175b
parent a9bfa6aa433a29fb144b1c7c22374aad53a1dd87
Author: Michael Forney <mforney@mforney.org>
Date:   Mon,  5 Jun 2017 00:34:29 -0700

launch: Simplify receive_fd

Diffstat:
Mlaunch/protocol.c | 64+++++++++++++++++++++++++++-------------------------------------
1 file changed, 27 insertions(+), 37 deletions(-)

diff --git a/launch/protocol.c b/launch/protocol.c @@ -10,7 +10,7 @@ send_fd(int socket, int fd, const void *buffer, ssize_t buffer_size) char control[CMSG_SPACE(sizeof(int))]; struct iovec iov = { .iov_base = (void *)buffer, - .iov_len = buffer_size + .iov_len = buffer_size, }; struct msghdr message = { .msg_name = NULL, @@ -39,49 +39,39 @@ send_fd(int socket, int fd, const void *buffer, ssize_t buffer_size) } ssize_t -receive_fd(int socket, int *fd, void *buffer, - ssize_t buffer_size) +receive_fd(int socket, int *fd, void *buffer, ssize_t buffer_size) { - ssize_t size; - - if (fd) { - char control[CMSG_SPACE(sizeof(int))]; - struct iovec iov = { - .iov_base = buffer, - .iov_len = buffer_size - }; - struct msghdr message = { - .msg_name = NULL, - .msg_namelen = 0, - .msg_iov = &iov, - .msg_iovlen = 1, - .msg_control = &control, - .msg_controllen = sizeof control - }; - struct cmsghdr *cmsg; - - size = recvmsg(socket, &message, 0); + if (!fd) + return recv(socket, buffer, buffer_size, 0); - if (size < 0) - goto nofd; + ssize_t size; + char control[CMSG_SPACE(sizeof(int))]; + struct iovec iov = { + .iov_base = buffer, + .iov_len = buffer_size, + }; + struct msghdr message = { + .msg_name = NULL, + .msg_namelen = 0, + .msg_iov = &iov, + .msg_iovlen = 1, + .msg_control = &control, + .msg_controllen = sizeof(control), + }; + struct cmsghdr *cmsg; - cmsg = CMSG_FIRSTHDR(&message); + *fd = -1; + size = recvmsg(socket, &message, 0); + if (size < 0) + return -1; - if (!cmsg || cmsg->cmsg_len != CMSG_LEN(sizeof(int)) - || cmsg->cmsg_level != SOL_SOCKET - || cmsg->cmsg_type != SCM_RIGHTS) { - goto nofd; - } + cmsg = CMSG_FIRSTHDR(&message); + if (cmsg && cmsg->cmsg_len == CMSG_LEN(sizeof(int)) && + cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_RIGHTS) { memcpy(fd, CMSG_DATA(cmsg), sizeof *fd); - } else { - size = recv(socket, buffer, buffer_size, 0); } - goto done; - -nofd: - *fd = -1; -done: return size; }