From 9453a7451d66ee1ea5762a75161bf8a818c01a1f Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Fri, 28 Jun 2013 21:57:59 -0400 Subject: Set O_APPEND mode for stdout/stderr and output-sync temporary files. POSIX does not guarantee that writes will be atomic if a file is opened for normal (non-append) output. That means if multiple processes are writing to the same file, output could be lost. I can't think of a real use-case where we would NOT want append for stdout/stderr, so force it if we can. --- misc.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'misc.c') diff --git a/misc.c b/misc.c index 1b1441b..d3a1da5 100644 --- a/misc.c +++ b/misc.c @@ -22,6 +22,11 @@ this program. If not, see . */ #include +#ifdef HAVE_FCNTL_H +# include +#else +# include +#endif /* Compare strings *S1 and *S2. Return negative if the first is less, positive if it is greater, @@ -897,6 +902,19 @@ get_path_max (void) #endif +/* Set a file descriptor to be in O_APPEND mode. + If it fails, just ignore it. */ + +void +set_append_mode (int fd) +{ +#if defined(F_GETFL) && defined(F_SETFL) && defined(O_APPEND) + int flags = fcntl (fd, F_GETFL, 0); + if (flags >= 0) + fcntl (fd, F_SETFL, flags | O_APPEND); +#endif +} + /* Provide support for temporary files. */ #ifndef HAVE_STDLIB_H @@ -928,6 +946,8 @@ open_tmpfd () fclose (tfile); + set_append_mode (fd); + return fd; } -- cgit v1.2.3