log: Open log file CLOEXEC so child processes don't get the fd

Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
diff --git a/shared/os-compatibility.c b/shared/os-compatibility.c
index b903347..0599974 100644
--- a/shared/os-compatibility.c
+++ b/shared/os-compatibility.c
@@ -36,8 +36,8 @@
 
 #include "os-compatibility.h"
 
-static int
-set_cloexec_or_close(int fd)
+int
+os_fd_set_cloexec(int fd)
 {
 	long flags;
 
@@ -46,16 +46,22 @@
 
 	flags = fcntl(fd, F_GETFD);
 	if (flags == -1)
-		goto err;
+		return -1;
 
 	if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1)
-		goto err;
+		return -1;
 
+	return 0;
+}
+
+static int
+set_cloexec_or_close(int fd)
+{
+	if (os_fd_set_cloexec(fd) != 0) {
+		close(fd);
+		return -1;
+	}
 	return fd;
-
-err:
-	close(fd);
-	return -1;
 }
 
 int
diff --git a/shared/os-compatibility.h b/shared/os-compatibility.h
index a12ac0b..06d2574 100644
--- a/shared/os-compatibility.h
+++ b/shared/os-compatibility.h
@@ -41,6 +41,9 @@
 #endif
 
 int
+os_fd_set_cloexec(int fd);
+
+int
 os_socketpair_cloexec(int domain, int type, int protocol, int *sv);
 
 int
diff --git a/src/log.c b/src/log.c
index 535bcba..0302c8c 100644
--- a/src/log.c
+++ b/src/log.c
@@ -36,6 +36,8 @@
 
 #include "compositor.h"
 
+#include "os-compatibility.h"
+
 static FILE *weston_logfile = NULL;
 
 static int cached_tm_mday = -1;
@@ -77,8 +79,11 @@
 {
 	wl_log_set_handler_server(custom_handler);
 
-	if (filename != NULL)
+	if (filename != NULL) {
 		weston_logfile = fopen(filename, "a");
+		if (weston_logfile)
+			os_fd_set_cloexec(fileno(weston_logfile));
+	}
 
 	if (weston_logfile == NULL)
 		weston_logfile = stderr;