X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Flog.c;h=6eb57ca750fe8bc6c7ea860ce2ea537b67009375;hb=493e0e6648552c0dce6c5225c8438d2829f1ac11;hp=032eb876f205099888597450168df2fca5364145;hpb=584ddd64e2f0caa3673bb219407e084826f5d965;p=exim.git diff --git a/src/src/log.c b/src/src/log.c index 032eb876f..6eb57ca75 100644 --- a/src/src/log.c +++ b/src/src/log.c @@ -252,7 +252,11 @@ Returns: a file descriptor, or < 0 on failure (errno set) int log_create(uschar *name) { -int fd = Uopen(name, O_CREAT|O_APPEND|O_WRONLY, LOG_MODE); +int fd = Uopen(name, +#ifdef O_CLOEXEC + O_CLOEXEC | +#endif + O_CREAT|O_APPEND|O_WRONLY, LOG_MODE); /* If creation failed, attempt to build a log directory in case that is the problem. */ @@ -266,7 +270,11 @@ if (fd < 0 && errno == ENOENT) DEBUG(D_any) debug_printf("%s log directory %s\n", created? "created" : "failed to create", name); *lastslash = '/'; - if (created) fd = Uopen(name, O_CREAT|O_APPEND|O_WRONLY, LOG_MODE); + if (created) fd = Uopen(name, +#ifdef O_CLOEXEC + O_CLOEXEC | +#endif + O_CREAT|O_APPEND|O_WRONLY, LOG_MODE); } return fd; @@ -316,7 +324,11 @@ if (pid == 0) /* If we created a subprocess, wait for it. If it succeeded, try the open. */ while (pid > 0 && waitpid(pid, &status, 0) != pid); -if (status == 0) fd = Uopen(name, O_APPEND|O_WRONLY, LOG_MODE); +if (status == 0) fd = Uopen(name, +#ifdef O_CLOEXEC + O_CLOEXEC | +#endif + O_APPEND|O_WRONLY, LOG_MODE); /* If we failed to create a subprocess, we are in a bad way. We return with fd still < 0, and errno set, letting the caller handle the error. */ @@ -438,11 +450,17 @@ if (!ok) /* We now have the file name. Try to open an existing file. After a successful open, arrange for automatic closure on exec(), and then return. */ -*fd = Uopen(buffer, O_APPEND|O_WRONLY, LOG_MODE); +*fd = Uopen(buffer, +#ifdef O_CLOEXEC + O_CLOEXEC | +#endif + O_APPEND|O_WRONLY, LOG_MODE); if (*fd >= 0) { +#ifndef O_CLOEXEC (void)fcntl(*fd, F_SETFD, fcntl(*fd, F_GETFD) | FD_CLOEXEC); +#endif return; } @@ -469,7 +487,9 @@ else if (euid == root_uid) *fd = log_create_as_exim(buffer); if (*fd >= 0) { +#ifndef O_CLOEXEC (void)fcntl(*fd, F_SETFD, fcntl(*fd, F_GETFD) | FD_CLOEXEC); +#endif return; } @@ -643,6 +663,14 @@ while ((t = string_nextinlist(&tt, &sep, log_buffer, LOG_BUFFER_SIZE))) } +void +mainlog_close(void) +{ +if (mainlogfd < 0) return; +(void)close(mainlogfd); +mainlogfd = -1; +mainlog_inode = 0; +} /************************************************* * Write message to log file * @@ -951,14 +979,14 @@ been opened, but we don't want to keep on writing to it for too long after it has been renamed. Therefore, do a stat() and see if the inode has changed, and if so, re-open. */ -if ((flags & LOG_MAIN) != 0 && - (selector == 0 || (selector & log_selector[0]) != 0)) +if ( flags & LOG_MAIN + && (!selector || selector & log_selector[0])) { - if ((logging_mode & LOG_MODE_SYSLOG) != 0 && - (syslog_duplication || (flags & (LOG_REJECT|LOG_PANIC)) == 0)) + if ( logging_mode & LOG_MODE_SYSLOG + && (syslog_duplication || !(flags & (LOG_REJECT|LOG_PANIC)))) write_syslog(LOG_INFO, log_buffer); - if ((logging_mode & LOG_MODE_FILE) != 0) + if (logging_mode & LOG_MODE_FILE) { struct stat statbuf; @@ -984,14 +1012,8 @@ if ((flags & LOG_MAIN) != 0 && happening. */ if (mainlogfd >= 0) - { if (Ustat(mainlog_name, &statbuf) < 0 || statbuf.st_ino != mainlog_inode) - { - (void)close(mainlogfd); - mainlogfd = -1; - mainlog_inode = 0; - } - } + mainlog_close(); /* If the log is closed, open it. Then write the line. */