mirror of
https://github.com/mirror/make.git
synced 2025-03-27 12:31:23 +08:00
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.
This commit is contained in:
parent
5e7bf7c554
commit
9453a7451d
@ -1,3 +1,10 @@
|
|||||||
|
2013-06-28 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* misc.c (set_append_mode): Set the O_APPEND flag on a file descriptor.
|
||||||
|
(open_tmpfd): Set append mode on the temporary file descriptor.
|
||||||
|
* main.c (main): Set append mode on stdout and stderr.
|
||||||
|
* makeint.h (set_append_mode): Declare it.
|
||||||
|
|
||||||
2013-06-22 Eli Zaretskii <eliz@gnu.org>
|
2013-06-22 Eli Zaretskii <eliz@gnu.org>
|
||||||
|
|
||||||
* build_w32.bat (LinkGCC): Prevent a comment from being displayed
|
* build_w32.bat (LinkGCC): Prevent a comment from being displayed
|
||||||
@ -55,7 +62,7 @@
|
|||||||
* main.c (verify_flag): Global variable to determine whether to
|
* main.c (verify_flag): Global variable to determine whether to
|
||||||
verify the database or not.
|
verify the database or not.
|
||||||
(decode_debug_flags): If debug mode, enable verify_flag.
|
(decode_debug_flags): If debug mode, enable verify_flag.
|
||||||
(main): If MAKE_MAINTAINTER_MODE, enable verify_flag, otherwise not.
|
(main): If MAKE_MAINTAINER_MODE, enable verify_flag, otherwise not.
|
||||||
(die): Only verify the database if verify_flag is set.
|
(die): Only verify the database if verify_flag is set.
|
||||||
* file.c (enter_file): Don't check caching unless verify_flag.
|
* file.c (enter_file): Don't check caching unless verify_flag.
|
||||||
* makeint.h: Export verify_flag.
|
* makeint.h: Export verify_flag.
|
||||||
|
6
main.c
6
main.c
@ -1195,6 +1195,12 @@ main (int argc, char **argv, char **envp)
|
|||||||
setlinebuf (stdout);
|
setlinebuf (stdout);
|
||||||
#endif /* setlinebuf missing. */
|
#endif /* setlinebuf missing. */
|
||||||
|
|
||||||
|
/* Configure stdout/stderr to be in append mode.
|
||||||
|
This keeps parallel jobs from losing output due to overlapping writes. */
|
||||||
|
|
||||||
|
set_append_mode (fileno (stdout));
|
||||||
|
set_append_mode (fileno (stderr));
|
||||||
|
|
||||||
/* Figure out where this program lives. */
|
/* Figure out where this program lives. */
|
||||||
|
|
||||||
if (argv[0] == 0)
|
if (argv[0] == 0)
|
||||||
|
@ -453,6 +453,7 @@ int alpha_compare (const void *, const void *);
|
|||||||
void print_spaces (unsigned int);
|
void print_spaces (unsigned int);
|
||||||
char *find_percent (char *);
|
char *find_percent (char *);
|
||||||
const char *find_percent_cached (const char **);
|
const char *find_percent_cached (const char **);
|
||||||
|
void set_append_mode (int);
|
||||||
int open_tmpfd (void);
|
int open_tmpfd (void);
|
||||||
FILE *open_tmpfile (char **, const char *);
|
FILE *open_tmpfile (char **, const char *);
|
||||||
|
|
||||||
|
20
misc.c
20
misc.c
@ -22,6 +22,11 @@ this program. If not, see <http://www.gnu.org/licenses/>. */
|
|||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_FCNTL_H
|
||||||
|
# include <fcntl.h>
|
||||||
|
#else
|
||||||
|
# include <sys/file.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Compare strings *S1 and *S2.
|
/* Compare strings *S1 and *S2.
|
||||||
Return negative if the first is less, positive if it is greater,
|
Return negative if the first is less, positive if it is greater,
|
||||||
@ -897,6 +902,19 @@ get_path_max (void)
|
|||||||
#endif
|
#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. */
|
/* Provide support for temporary files. */
|
||||||
|
|
||||||
#ifndef HAVE_STDLIB_H
|
#ifndef HAVE_STDLIB_H
|
||||||
@ -928,6 +946,8 @@ open_tmpfd ()
|
|||||||
|
|
||||||
fclose (tfile);
|
fclose (tfile);
|
||||||
|
|
||||||
|
set_append_mode (fd);
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user