compositor: Use dup instead of fcntl to get a non-CLOEXEC fd
One less syscall and error path to check, and feels like a cleaner approach.
The commit adds two lines, but that's because we actually handle the
potential error now.
diff --git a/compositor/compositor.c b/compositor/compositor.c
index 30cc7ab..2a7cfe7 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -88,7 +88,7 @@
static void
child_client_exec(int sockfd, const char *path)
{
- int flags;
+ int clientfd;
char s[32];
sigset_t allsigs;
@@ -96,13 +96,15 @@
sigfillset(&allsigs);
sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
- /* SOCK_CLOEXEC closes both ends, so we need to unset
- * the flag on the client fd. */
- flags = fcntl(sockfd, F_GETFD);
- if (flags != -1)
- fcntl(sockfd, F_SETFD, flags & ~FD_CLOEXEC);
+ /* SOCK_CLOEXEC closes both ends, so we dup the fd to get a
+ * non-CLOEXEC fd to pass through exec. */
+ clientfd = dup(sockfd);
+ if (clientfd == -1) {
+ fprintf(stderr, "compositor: dup failed: %m\n");
+ return;
+ }
- snprintf(s, sizeof s, "%d", sockfd);
+ snprintf(s, sizeof s, "%d", clientfd);
setenv("WAYLAND_SOCKET", s, 1);
if (execl(path, path, NULL) < 0)