diff options
author | Paul Smith <psmith@gnu.org> | 2013-06-28 21:57:59 -0400 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2013-06-28 21:57:59 -0400 |
commit | 9453a7451d66ee1ea5762a75161bf8a818c01a1f (patch) | |
tree | fc76410d37ff3b464dd1da10a4ab4b90e1331354 /misc.c | |
parent | 5e7bf7c554317849610173845871ae7d6a130ffe (diff) | |
download | gunmake-9453a7451d66ee1ea5762a75161bf8a818c01a1f.tar.gz |
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.
Diffstat (limited to 'misc.c')
-rw-r--r-- | misc.c | 20 |
1 files changed, 20 insertions, 0 deletions
@@ -22,6 +22,11 @@ this program. If not, see <http://www.gnu.org/licenses/>. */ #include <stdarg.h> +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#else +# include <sys/file.h> +#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; } |