commit 2c544a9
Michael Forney
·
2017-06-05 07:34:29 +0000 UTC
parent a9bfa6a
launch: Simplify receive_fd
1 files changed,
+27,
-37
+27,
-37
1@@ -10,7 +10,7 @@ send_fd(int socket, int fd, const void *buffer, ssize_t buffer_size)
2 char control[CMSG_SPACE(sizeof(int))];
3 struct iovec iov = {
4 .iov_base = (void *)buffer,
5- .iov_len = buffer_size
6+ .iov_len = buffer_size,
7 };
8 struct msghdr message = {
9 .msg_name = NULL,
10@@ -39,49 +39,39 @@ send_fd(int socket, int fd, const void *buffer, ssize_t buffer_size)
11 }
12
13 ssize_t
14-receive_fd(int socket, int *fd, void *buffer,
15- ssize_t buffer_size)
16+receive_fd(int socket, int *fd, void *buffer, ssize_t buffer_size)
17 {
18- ssize_t size;
19-
20- if (fd) {
21- char control[CMSG_SPACE(sizeof(int))];
22- struct iovec iov = {
23- .iov_base = buffer,
24- .iov_len = buffer_size
25- };
26- struct msghdr message = {
27- .msg_name = NULL,
28- .msg_namelen = 0,
29- .msg_iov = &iov,
30- .msg_iovlen = 1,
31- .msg_control = &control,
32- .msg_controllen = sizeof control
33- };
34- struct cmsghdr *cmsg;
35-
36- size = recvmsg(socket, &message, 0);
37+ if (!fd)
38+ return recv(socket, buffer, buffer_size, 0);
39
40- if (size < 0)
41- goto nofd;
42+ ssize_t size;
43+ char control[CMSG_SPACE(sizeof(int))];
44+ struct iovec iov = {
45+ .iov_base = buffer,
46+ .iov_len = buffer_size,
47+ };
48+ struct msghdr message = {
49+ .msg_name = NULL,
50+ .msg_namelen = 0,
51+ .msg_iov = &iov,
52+ .msg_iovlen = 1,
53+ .msg_control = &control,
54+ .msg_controllen = sizeof(control),
55+ };
56+ struct cmsghdr *cmsg;
57
58- cmsg = CMSG_FIRSTHDR(&message);
59+ *fd = -1;
60+ size = recvmsg(socket, &message, 0);
61+ if (size < 0)
62+ return -1;
63
64- if (!cmsg || cmsg->cmsg_len != CMSG_LEN(sizeof(int))
65- || cmsg->cmsg_level != SOL_SOCKET
66- || cmsg->cmsg_type != SCM_RIGHTS) {
67- goto nofd;
68- }
69+ cmsg = CMSG_FIRSTHDR(&message);
70
71+ if (cmsg && cmsg->cmsg_len == CMSG_LEN(sizeof(int)) &&
72+ cmsg->cmsg_level == SOL_SOCKET &&
73+ cmsg->cmsg_type == SCM_RIGHTS) {
74 memcpy(fd, CMSG_DATA(cmsg), sizeof *fd);
75- } else {
76- size = recv(socket, buffer, buffer_size, 0);
77 }
78
79- goto done;
80-
81-nofd:
82- *fd = -1;
83-done:
84 return size;
85 }