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 }