diff --git a/compctl.c b/compctl.c
index ddeccc2f0efe54e0e6715aa8c37b6d1e117a7c49..dd73291b085b0a841cdf010e0c5af7e28171c90b 100644
--- a/compctl.c
+++ b/compctl.c
@@ -30,9 +30,10 @@ connectd(void)
 	};
 
 	char cbuf[CMSG_SPACE(sizeof(cred))];
-	struct msghdr msg = {0};
-	msg.msg_control = cbuf;
-	msg.msg_controllen = sizeof(cbuf);
+	struct msghdr msg = {
+		.msg_control = cbuf,
+		.msg_controllen = sizeof(cbuf),
+	};
 
 	struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
 	cmsg->cmsg_level = SOL_SOCKET;
diff --git a/compctld.c b/compctld.c
index ad1283f93162d186e2aed3780ea9ccd6222b6d39..6ca9dfddd9ed1c2c4f1ac7a38de414eb344b7202 100644
--- a/compctld.c
+++ b/compctld.c
@@ -121,19 +121,27 @@ main(int argc, char *argv[])
 
 		/* Decode the message with credentials. */
 
-		struct msghdr msg;
+		struct ucred *cred;
+		char cbuf[CMSG_SPACE(sizeof(*cred))];
+		struct msghdr msg = {
+			.msg_control = cbuf,
+			.msg_controllen = sizeof(cbuf),
+		};
 		char *errmsg;
-		if (recvmsg(fd, &msg, MSG_WAITALL) <= 0) {
+recvagain:
+		if (recvmsg(fd, &msg, MSG_WAITALL) < 0) {
+			if (errno == EAGAIN)
+				goto recvagain;
 			errmsg = "recvmsg";
 sockerror:
 			logperror(errmsg);
 			close(fd);
 			continue;
 		}
-		struct ucred *cred;
 		struct cmsghdr *cmsg;
 		cmsg = CMSG_FIRSTHDR(&msg);
-		if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
+		if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN(sizeof(*cred))) {
+			syslog(LOG_INFO, "want %lu", CMSG_LEN(sizeof(*cred)));
 			errmsg = "cmsg";
 			goto sockerror;
 		}