Changed RERR_CRASH to RERR_CRASHED.
[rsync/rsync.git] / log.c
diff --git a/log.c b/log.c
index c1ef42b..b03fc08 100644 (file)
--- a/log.c
+++ b/log.c
@@ -44,6 +44,7 @@ extern char *auth_user;
 extern char *log_format;
 
 static int log_initialised;
+static int logfile_was_closed;
 static char *logfname;
 static FILE *logfile;
 struct stats stats;
@@ -64,6 +65,8 @@ struct {
        { RERR_STREAMIO   , "error in rsync protocol data stream" },
        { RERR_MESSAGEIO  , "errors with program diagnostics" },
        { RERR_IPC        , "error in IPC code" },
+       { RERR_CRASHED    , "sibling process crashed" },
+       { RERR_TERMINATED , "sibling process terminated abnormally" },
        { RERR_SIGNAL     , "received SIGUSR1 or SIGINT" },
        { RERR_WAITCHILD  , "some error returned by waitpid()" },
        { RERR_MALLOC     , "error allocating core memory buffers" },
@@ -96,14 +99,9 @@ static char const *rerr_name(int code)
 
 static void logit(int priority, char *buf)
 {
-       if (logfname) {
-               if (!logfile) {
-                       log_open();
-                       if (!logfname) {
-                               logit(priority, buf);
-                               return;
-                       }
-               }
+       if (logfile_was_closed)
+               logfile_reopen();
+       if (logfile) {
                fprintf(logfile,"%s [%d] %s",
                        timestring(time(NULL)), (int)getpid(), buf);
                fflush(logfile);
@@ -136,6 +134,22 @@ static void syslog_init()
 #endif
 }
 
+static void logfile_open(void)
+{
+       extern int orig_umask;
+       int old_umask = umask(022 | orig_umask);
+       logfile = fopen(logfname, "a");
+       umask(old_umask);
+       if (!logfile) {
+               int fopen_errno = errno;
+               /* Rsync falls back to using syslog on failure. */
+               syslog_init();
+               rsyserr(FERROR, fopen_errno,
+                       "failed to open log-file %s", logfname);
+               rprintf(FINFO, "Ignoring \"log file\" setting.\n");
+       }
+}
+
 void log_init(void)
 {
        time_t t;
@@ -152,42 +166,26 @@ void log_init(void)
 
        /* optionally use a log file instead of syslog */
        logfname = lp_log_file();
-       if (logfname) {
-               if (*logfname) {
-                       log_open();
-                       return;
-               }
-               logfname = NULL;
-       }
-
-       syslog_init();
+       if (logfname && *logfname)
+               logfile_open();
+       else
+               syslog_init();
 }
 
-void log_open(void)
+void logfile_close(void)
 {
-       if (logfname && !logfile) {
-               extern int orig_umask;
-               int old_umask = umask(022 | orig_umask);
-               logfile = fopen(logfname, "a");
-               umask(old_umask);
-               if (!logfile) {
-                       char *had_logfname = logfname;
-                       int open_errno = errno;
-                       /* Rsync falls back to using syslog on failure. */
-                       logfname = NULL;
-                       syslog_init();
-                       rsyserr(FERROR, open_errno,
-                               "failed to open log-file %s", had_logfname);
-                       rprintf(FINFO, "Ignoring \"log file\" setting.\n");
-               }
+       if (logfile) {
+               logfile_was_closed = 1;
+               fclose(logfile);
+               logfile = NULL;
        }
 }
 
-void log_close(void)
+void logfile_reopen(void)
 {
-       if (logfile) {
-               fclose(logfile);
-               logfile = NULL;
+       if (logfile_was_closed) {
+               logfile_was_closed = 0;
+               logfile_open();
        }
 }
 
@@ -516,7 +514,7 @@ static void log_formatted(enum logcode code, char *format, char *op,
                                int i;
                                for (i = 2; n[i]; i++)
                                        n[i] = ch;
-                       } else if (!(iflags & (ITEM_TRANSFER|ITEM_LOCAL_CHANGE))) {
+                       } else if (n[0] == '.' || n[0] == 'h') {
                                int i;
                                for (i = 2; n[i]; i++) {
                                        if (n[i] != '.')
@@ -606,12 +604,15 @@ void log_item(struct file_struct *file, struct stats *initial_stats,
 void maybe_log_item(struct file_struct *file, int iflags, int itemizing,
                    char *buf)
 {
-       int see_item = itemizing && (iflags || verbose > 1);
+       int significant_flags = iflags & SIGNIFICANT_ITEM_FLAGS;
+       int see_item = itemizing && (significant_flags || *buf || verbose > 1);
+       int local_change = iflags & ITEM_LOCAL_CHANGE
+           && (!(iflags & ITEM_XNAME_FOLLOWS) || significant_flags);
        if (am_server) {
                if (am_daemon && !dry_run && see_item)
                        log_item(file, &stats, iflags, buf);
-       } else if (see_item || iflags & ITEM_LOCAL_CHANGE || *buf
-           || (S_ISDIR(file->mode) && iflags & SIGNIFICANT_ITEM_FLAGS))
+       } else if (see_item || local_change || *buf
+           || (S_ISDIR(file->mode) && significant_flags))
                log_item(file, &stats, iflags, buf);
 }