compositor: Use dup instead of fcntl to get a non-CLOEXEC fd
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 8 Dec 2011 15:19:40 +0000 (10:19 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 8 Dec 2011 15:19:52 +0000 (10:19 -0500)
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.

compositor/compositor.c

index 30cc7ab..2a7cfe7 100644 (file)
@@ -88,7 +88,7 @@ wlsc_watch_process(struct wlsc_process *process)
 static void
 child_client_exec(int sockfd, const char *path)
 {
-       int flags;
+       int clientfd;
        char s[32];
        sigset_t allsigs;
 
@@ -96,13 +96,15 @@ child_client_exec(int sockfd, const char *path)
        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)