Reviewed-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>
Signed-off-by: Derek Foreman <der...@osg.samsung.com>
---

Nested the os_fd_set_cloexec() call so calling weston_log_file_open() multiple
times behaves as expected.

 shared/os-compatibility.c | 22 ++++++++++++++--------
 shared/os-compatibility.h |  3 +++
 src/log.c                 |  7 ++++++-
 3 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/shared/os-compatibility.c b/shared/os-compatibility.c
index 611e7c8..d0ff1c8 100644
--- a/shared/os-compatibility.c
+++ b/shared/os-compatibility.c
@@ -33,8 +33,8 @@
 
 #include "os-compatibility.h"
 
-static int
-set_cloexec_or_close(int fd)
+int
+os_fd_set_cloexec(int fd)
 {
        long flags;
 
@@ -43,16 +43,22 @@ set_cloexec_or_close(int fd)
 
        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 fd;
+       return 0;
+}
 
-err:
-       close(fd);
-       return -1;
+static int
+set_cloexec_or_close(int fd)
+{
+       if (os_fd_set_cloexec(fd) != 0) {
+               close(fd);
+               return -1;
+       }
+       return fd;
 }
 
 int
diff --git a/shared/os-compatibility.h b/shared/os-compatibility.h
index 172bb7e..60ae7fd 100644
--- a/shared/os-compatibility.h
+++ b/shared/os-compatibility.h
@@ -38,6 +38,9 @@ backtrace(void **buffer, int size)
 #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 99bbe18..0dae3b2 100644
--- a/src/log.c
+++ b/src/log.c
@@ -33,6 +33,8 @@
 
 #include "compositor.h"
 
+#include "os-compatibility.h"
+
 static FILE *weston_logfile = NULL;
 
 static int cached_tm_mday = -1;
@@ -74,8 +76,11 @@ weston_log_file_open(const char *filename)
 {
        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;
-- 
2.1.4

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to