Applied this to the trunk (with a few improvements).
authorWayne Davison <wayned@samba.org>
Tue, 9 May 2006 18:41:55 +0000 (18:41 +0000)
committerWayne Davison <wayned@samba.org>
Tue, 9 May 2006 18:41:55 +0000 (18:41 +0000)
log-file.diff [deleted file]

diff --git a/log-file.diff b/log-file.diff
deleted file mode 100644 (file)
index b796b39..0000000
+++ /dev/null
@@ -1,539 +0,0 @@
-This patch allows a non-daemon server and/or a client rsync to log what they
-are doing, similar to how a daemon logs its actions.
-
---- old/cleanup.c
-+++ new/cleanup.c
-@@ -23,10 +23,13 @@
- #include "rsync.h"
-+extern int am_server;
-+extern int am_daemon;
- extern int io_error;
- extern int keep_partial;
- extern int log_got_error;
- extern char *partial_dir;
-+extern char *logfile_name;
- #ifdef HAVE_SIGACTION
- static struct sigaction sigact;
-@@ -151,7 +154,7 @@ void _exit_cleanup(int code, const char 
-                       code = RERR_PARTIAL;
-       }
--      if (code)
-+      if (code || am_daemon || (am_server && logfile_name))
-               log_exit(code, file, line);
-       if (verbose > 2) {
---- old/clientserver.c
-+++ new/clientserver.c
-@@ -39,10 +39,14 @@ extern int protocol_version;
- extern int io_timeout;
- extern int no_detach;
- extern int default_af_hint;
-+extern int logfile_format_has_i;
-+extern int logfile_format_has_o_or_i;
- extern mode_t orig_umask;
- extern char *bind_address;
- extern char *sockopts;
- extern char *config_file;
-+extern char *logfile_format;
-+extern char *logfile_name;
- extern char *files_from;
- extern char *tmpdir;
- extern struct chmod_mode_struct *chmod_modes;
-@@ -50,8 +54,6 @@ extern struct filter_list_struct server_
- char *auth_user;
- int read_only = 0;
--int daemon_log_format_has_i = 0;
--int daemon_log_format_has_o_or_i = 0;
- int module_id = -1;
- struct chmod_mode_struct *daemon_chmod_modes;
-@@ -324,11 +326,12 @@ static int rsync_module(int f_in, int f_
-               read_only = 1;
-       if (lp_transfer_logging(i)) {
--              if (log_format_has(lp_log_format(i), 'i'))
--                      daemon_log_format_has_i = 1;
--              if (daemon_log_format_has_i
--                  || log_format_has(lp_log_format(i), 'o'))
--                      daemon_log_format_has_o_or_i = 1;
-+              logfile_format = lp_log_format(i);
-+              if (log_format_has(logfile_format, 'i'))
-+                      logfile_format_has_i = 1;
-+              if (logfile_format_has_i
-+                  || log_format_has(logfile_format, 'o'))
-+                      logfile_format_has_o_or_i = 1;
-       }
-       am_root = (MY_UID() == 0);
---- old/flist.c
-+++ new/flist.c
-@@ -91,15 +91,15 @@ static int show_filelist_p(void)
- static void start_filelist_progress(char *kind)
- {
--      rprintf(FINFO, "%s ... ", kind);
-+      rprintf(FCLIENT, "%s ... ", kind);
-       if (verbose > 1 || do_progress)
--              rprintf(FINFO, "\n");
-+              rprintf(FCLIENT, "\n");
-       rflush(FINFO);
- }
- static void emit_filelist_progress(int count)
- {
--      rprintf(FINFO, " %d files...\r", count);
-+      rprintf(FCLIENT, " %d files...\r", count);
- }
- static void maybe_emit_filelist_progress(int count)
-@@ -283,7 +283,7 @@ void flist_expand(struct file_list *flis
-                               flist->malloced);
-       if (verbose >= 2 && flist->malloced != FLIST_START) {
--              rprintf(FINFO, "[%s] expand file_list to %.0f bytes, did%s move\n",
-+              rprintf(FCLIENT, "[%s] expand file_list to %.0f bytes, did%s move\n",
-                   who_am_i(),
-                   (double)sizeof flist->files[0] * flist->malloced,
-                   (new_ptr == flist->files) ? " not" : "");
-@@ -1059,6 +1059,7 @@ struct file_list *send_file_list(int f, 
-       int64 start_write;
-       int use_ff_fd = 0;
-+      rprintf(FLOG, "building file list\n");
-       if (show_filelist_p())
-               start_filelist_progress("building file list");
-@@ -1329,6 +1330,7 @@ struct file_list *recv_file_list(int f)
-       unsigned short flags;
-       int64 start_read;
-+      rprintf(FLOG, "receiving file list\n");
-       if (show_filelist_p())
-               start_filelist_progress("receiving file list");
---- old/generator.c
-+++ new/generator.c
-@@ -27,7 +27,7 @@ extern int verbose;
- extern int dry_run;
- extern int do_xfers;
- extern int log_format_has_i;
--extern int daemon_log_format_has_i;
-+extern int logfile_format_has_i;
- extern int am_root;
- extern int am_server;
- extern int am_daemon;
-@@ -672,7 +672,7 @@ static int try_dests_reg(struct file_str
-               if (itemizing)
-                       itemize(file, ndx, 0, stp, 0, 0, NULL);
-               if (verbose > 1 && maybe_ATTRS_REPORT) {
--                      code = daemon_log_format_has_i || dry_run
-+                      code = logfile_format_has_i || dry_run
-                            ? FCLIENT : FINFO;
-                       rprintf(code, "%s is uptodate\n", fname);
-               }
-@@ -694,7 +694,7 @@ static int try_dests_reg(struct file_str
-               if (maybe_ATTRS_REPORT
-                && ((!itemizing && verbose && match_level == 2)
-                 || (verbose > 1 && match_level == 3))) {
--                      code = daemon_log_format_has_i || dry_run
-+                      code = logfile_format_has_i || dry_run
-                            ? FCLIENT : FINFO;
-                       rprintf(code, "%s%s\n", fname,
-                               match_level == 3 ? " is uptodate" : "");
-@@ -770,7 +770,7 @@ static int try_dests_non(struct file_str
-                       itemize(file, ndx, 0, &st, changes, 0, lp);
-               }
-               if (verbose > 1 && maybe_ATTRS_REPORT) {
--                      code = daemon_log_format_has_i || dry_run
-+                      code = logfile_format_has_i || dry_run
-                            ? FCLIENT : FINFO;
-                       rprintf(code, "%s is uptodate\n", fname);
-               }
-@@ -1339,9 +1339,9 @@ void generate_files(int f_out, struct fi
-       if (protocol_version >= 29) {
-               itemizing = 1;
-               maybe_ATTRS_REPORT = log_format_has_i ? 0 : ATTRS_REPORT;
--              code = daemon_log_format_has_i ? 0 : FLOG;
-+              code = logfile_format_has_i ? 0 : FLOG;
-       } else if (am_daemon) {
--              itemizing = daemon_log_format_has_i && do_xfers;
-+              itemizing = logfile_format_has_i && do_xfers;
-               maybe_ATTRS_REPORT = ATTRS_REPORT;
-               code = itemizing || !do_xfers ? FCLIENT : FINFO;
-       } else if (!am_server) {
---- old/log.c
-+++ new/log.c
-@@ -39,18 +39,19 @@ extern int protocol_version;
- extern int preserve_times;
- extern int log_format_has_i;
- extern int log_format_has_o_or_i;
--extern int daemon_log_format_has_o_or_i;
-+extern int logfile_format_has_o_or_i;
- extern mode_t orig_umask;
- extern char *auth_user;
- extern char *log_format;
-+extern char *logfile_format;
-+extern char *logfile_name;
- #if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H
- extern iconv_t ic_chck;
- #endif
- static int log_initialised;
- static int logfile_was_closed;
--static char *logfname;
--static FILE *logfile;
-+static FILE *logfile_fp;
- struct stats stats;
- int log_got_error = 0;
-@@ -104,10 +105,10 @@ static void logit(int priority, char *bu
- {
-       if (logfile_was_closed)
-               logfile_reopen();
--      if (logfile) {
--              fprintf(logfile,"%s [%d] %s",
-+      if (logfile_fp) {
-+              fprintf(logfile_fp, "%s [%d] %s",
-                       timestring(time(NULL)), (int)getpid(), buf);
--              fflush(logfile);
-+              fflush(logfile_fp);
-       } else {
-               syslog(priority, "%s", buf);
-       }
-@@ -140,14 +141,14 @@ static void syslog_init()
- static void logfile_open(void)
- {
-       mode_t old_umask = umask(022 | orig_umask);
--      logfile = fopen(logfname, "a");
-+      logfile_fp = fopen(logfile_name, "a");
-       umask(old_umask);
--      if (!logfile) {
-+      if (!logfile_fp) {
-               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);
-+                      "failed to open log-file %s", logfile_name);
-               rprintf(FINFO, "Ignoring \"log file\" setting.\n");
-       }
- }
-@@ -163,9 +164,11 @@ void log_init(void)
-        * before the chroot. */
-       timestring(time(NULL));
--      /* optionally use a log file instead of syslog */
--      logfname = lp_log_file();
--      if (logfname && *logfname)
-+      /* Optionally use a log file instead of syslog.  (Non-daemon
-+       * rsyncs will have already set logfile_name, as needed.) */
-+      if (am_daemon)
-+              logfile_name = lp_log_file();
-+      if (logfile_name && *logfile_name)
-               logfile_open();
-       else
-               syslog_init();
-@@ -173,10 +176,10 @@ void log_init(void)
- void logfile_close(void)
- {
--      if (logfile) {
-+      if (logfile_fp) {
-               logfile_was_closed = 1;
--              fclose(logfile);
--              logfile = NULL;
-+              fclose(logfile_fp);
-+              logfile_fp = NULL;
-       }
- }
-@@ -235,9 +238,9 @@ void rwrite(enum logcode code, char *buf
-       if (code == FCLIENT)
-               code = FINFO;
--      else if (am_daemon) {
-+      else if (am_daemon || logfile_name) {
-               static int in_block;
--              char msg[2048];
-+              char msg[2048], *s;
-               int priority = code == FERROR ? LOG_WARNING : LOG_INFO;
-               if (in_block)
-@@ -246,10 +249,11 @@ void rwrite(enum logcode code, char *buf
-               if (!log_initialised)
-                       log_init();
-               strlcpy(msg, buf, MIN((int)sizeof msg, len + 1));
--              logit(priority, msg);
-+              for (s = msg; *s == '\n' && s[1]; s++) {}
-+              logit(priority, s);
-               in_block = 0;
--              if (code == FLOG || !am_server)
-+              if (code == FLOG || (am_daemon && !am_server))
-                       return;
-       } else if (code == FLOG)
-               return;
-@@ -395,26 +399,14 @@ void rflush(enum logcode code)
- {
-       FILE *f = NULL;
--      if (am_daemon) {
-+      if (am_daemon || code == FLOG)
-               return;
--      }
--      if (code == FLOG) {
--              return;
--      }
--
--      if (code == FERROR) {
-+      if (code == FERROR || am_server)
-               f = stderr;
--      }
--
--      if (code == FINFO) {
--              if (am_server)
--                      f = stderr;
--              else
--                      f = stdout;
--      }
-+      else
-+              f = stdout;
--      if (!f) exit_cleanup(RERR_MESSAGEIO);
-       fflush(f);
- }
-@@ -687,12 +679,12 @@ void log_item(struct file_struct *file, 
- {
-       char *s_or_r = am_sender ? "send" : "recv";
--      if (lp_transfer_logging(module_id)) {
--              log_formatted(FLOG, lp_log_format(module_id), s_or_r,
--                            file, initial_stats, iflags, hlink);
--      } else if (log_format && !am_server) {
-+      if (log_format && !am_server) {
-               log_formatted(FNAME, log_format, s_or_r,
-                             file, initial_stats, iflags, hlink);
-+      } else if (logfile_format) {
-+              log_formatted(FLOG, logfile_format, s_or_r,
-+                            file, initial_stats, iflags, hlink);
-       }
- }
-@@ -704,7 +696,7 @@ void maybe_log_item(struct file_struct *
-               || log_format_has_i > 1 || (verbose > 1 && log_format_has_i));
-       int local_change = iflags & ITEM_LOCAL_CHANGE && significant_flags;
-       if (am_server) {
--              if (am_daemon && !dry_run && see_item)
-+              if (logfile_name && !dry_run && see_item)
-                       log_item(file, &stats, iflags, buf);
-       } else if (see_item || local_change || *buf
-           || (S_ISDIR(file->mode) && significant_flags))
-@@ -732,10 +724,10 @@ void log_delete(char *fname, int mode)
-                             ITEM_DELETED, NULL);
-       }
--      if (!am_daemon || dry_run || !lp_transfer_logging(module_id))
-+      if (!logfile_name || dry_run || !logfile_format)
-               return;
--      fmt = daemon_log_format_has_o_or_i ? lp_log_format(module_id) : "deleting %n";
-+      fmt = logfile_format_has_o_or_i ? logfile_format : "deleting %n";
-       log_formatted(FLOG, fmt, "del.", &file, &stats, ITEM_DELETED, NULL);
- }
---- old/main.c
-+++ new/main.c
-@@ -176,7 +176,6 @@ static void handle_stats(int f)
-               return;
-       if (am_daemon) {
--              log_exit(0, __FILE__, __LINE__);
-               if (f == -1 || !am_sender)
-                       return;
-       }
---- old/options.c
-+++ new/options.c
-@@ -148,6 +148,8 @@ char *basis_dir[MAX_BASIS_DIRS+1];
- char *config_file = NULL;
- char *shell_cmd = NULL;
- char *log_format = NULL;
-+char *logfile_name = NULL;
-+char *logfile_format = NULL;
- char *password_file = NULL;
- char *rsync_path = RSYNC_PATH;
- char *backup_dir = NULL;
-@@ -164,7 +166,9 @@ int verbose = 0;
- int quiet = 0;
- int log_before_transfer = 0;
- int log_format_has_i = 0;
-+int logfile_format_has_i = 0;
- int log_format_has_o_or_i = 0;
-+int logfile_format_has_o_or_i = 0;
- int always_checksum = 0;
- int list_only = 0;
-@@ -361,6 +365,7 @@ void usage(enum logcode F)
-   rprintf(F,"     --progress              show progress during transfer\n");
-   rprintf(F," -P                          same as --partial --progress\n");
-   rprintf(F," -i, --itemize-changes       output a change-summary for all updates\n");
-+  rprintf(F,"     --log-file=FILE         output what we're doing to a log file\n");
-   rprintf(F,"     --log-format=FORMAT     output filenames using the specified format\n");
-   rprintf(F,"     --password-file=FILE    read password from FILE\n");
-   rprintf(F,"     --list-only             list the files instead of copying them\n");
-@@ -494,6 +499,7 @@ static struct poptOption long_options[] 
-   {"partial-dir",      0,  POPT_ARG_STRING, &partial_dir, 0, 0, 0 },
-   {"delay-updates",    0,  POPT_ARG_NONE,   &delay_updates, 0, 0, 0 },
-   {"prune-empty-dirs",'m', POPT_ARG_NONE,   &prune_empty_dirs, 0, 0, 0 },
-+  {"log-file",         0,  POPT_ARG_STRING, &logfile_name, 0, 0, 0 },
-   {"log-format",       0,  POPT_ARG_STRING, &log_format, 0, 0, 0 },
-   {"itemize-changes", 'i', POPT_ARG_NONE,   0, 'i', 0, 0 },
-   {"bwlimit",          0,  POPT_ARG_INT,    &bwlimit, 0, 0, 0 },
-@@ -1306,6 +1312,21 @@ int parse_arguments(int *argc, const cha
-       if (log_format_has_i || log_format_has(log_format, 'o'))
-               log_format_has_o_or_i = 1;
-+      if (am_daemon)
-+              logfile_name = NULL;
-+      else if (logfile_name) {
-+              if (am_server) {
-+                      logfile_format = "%i %n%L";
-+                      logfile_format_has_i = logfile_format_has_o_or_i = 1;
-+              } else if (log_format) {
-+                      logfile_format = log_format;
-+                      logfile_format_has_i = log_format_has_i;
-+                      logfile_format_has_o_or_i = log_format_has_o_or_i;
-+              }
-+              log_before_transfer = !am_server;
-+              log_init();
-+      }
-+
-       if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit))
-               bwlimit = daemon_bwlimit;
-       if (bwlimit) {
---- old/progress.c
-+++ new/progress.c
-@@ -105,7 +105,7 @@ static void rprint_progress(OFF_T ofs, O
-                       stats.num_files);
-       } else
-               strcpy(eol, "\r");
--      rprintf(FINFO, "%12s %3d%% %7.2f%s %4d:%02d:%02d%s",
-+      rprintf(FCLIENT, "%12s %3d%% %7.2f%s %4d:%02d:%02d%s",
-               human_num(ofs), pct, rate, units,
-               remain_h, remain_m, remain_s, eol);
- }
---- old/receiver.c
-+++ new/receiver.c
-@@ -29,7 +29,7 @@ extern int am_server;
- extern int do_progress;
- extern int log_before_transfer;
- extern int log_format_has_i;
--extern int daemon_log_format_has_i;
-+extern int logfile_format_has_i;
- extern int csum_length;
- extern int read_batch;
- extern int write_batch;
-@@ -343,8 +343,7 @@ int recv_files(int f_in, struct file_lis
-       struct file_struct *file;
-       struct stats initial_stats;
-       int save_make_backups = make_backups;
--      int itemizing = am_daemon ? daemon_log_format_has_i
--                    : !am_server && log_format_has_i;
-+      int itemizing = am_server ? logfile_format_has_i : log_format_has_i;
-       int max_phase = protocol_version >= 29 ? 2 : 1;
-       int i, recv_ok;
---- old/rsync.c
-+++ new/rsync.c
-@@ -32,7 +32,7 @@
- extern int verbose;
- extern int dry_run;
--extern int daemon_log_format_has_i;
-+extern int logfile_format_has_i;
- extern int preserve_perms;
- extern int preserve_executability;
- extern int preserve_times;
-@@ -218,7 +218,7 @@ int set_file_attrs(char *fname, struct f
- #endif
-       if (verbose > 1 && flags & ATTRS_REPORT) {
--              enum logcode code = daemon_log_format_has_i || dry_run
-+              enum logcode code = logfile_format_has_i || dry_run
-                                 ? FCLIENT : FINFO;
-               if (updated)
-                       rprintf(code, "%s\n", fname);
---- old/rsync.h
-+++ new/rsync.h
-@@ -158,8 +158,8 @@
- /* Log-message categories.  Only FERROR and FINFO get sent over the socket.
-- * FLOG and FCLIENT are only used on the daemon side for custom logging,
-- * while FNAME is only used on the client side. */
-+ * FLOG only goes to the log file, not to the client; FCLIENT is the opposite.
-+ * FNAME is a client-side message when outputting a filename on its own. */
- enum logcode { FERROR=1, FINFO=2, FLOG=3, FCLIENT=4, FNAME=5, FSOCKERR=6 };
- /* Messages types that are sent over the message channel.  The logcode
---- old/rsync.yo
-+++ new/rsync.yo
-@@ -387,6 +387,7 @@ to the detailed description below for a 
-      --progress              show progress during transfer
-  -P                          same as --partial --progress
-  -i, --itemize-changes       output a change-summary for all updates
-+     --log-file=FILE         output what we're doing to a log file
-      --log-format=FORMAT     output filenames using the specified format
-      --password-file=FILE    read password from FILE
-      --list-only             list the files instead of copying them
-@@ -1432,6 +1433,23 @@ the string "*deleting" for each item tha
- you are talking to a recent enough rsync that it logs deletions instead of
- outputting them as a verbose message).
-+dit(bf(--log-file=FILE)) This option causes rsync to log what it is doing
-+to a file.  This is similar to the logging that a daemon does, but can be
-+requested for the client side and/or the server side of a non-daemon
-+transfer.  If specified as a client option, transfer logging will in effect
-+if the bf(--log-format) option was either specified or implied (e.g.
-+bf(--verbose) implies a basic log format).  If explicitly sent to a server
-+via the bf(--rsync-path) option, transfer logging will always occur using
-+the default bf(--itemize-changes) format.
-+
-+Here's a example command that requests the remote side to log what is
-+happening:
-+
-+verb(  rsync -av --rsync-path="path --log-file=/tmp/rlog" src/ dest/)
-+
-+This is very useful if you need to debug why a connection is closing
-+unexpectedly.
-+
- dit(bf(--log-format=FORMAT)) This allows you to specify exactly what the
- rsync client outputs to the user on a per-file basis.  The format is a text
- string containing embedded single-character escape sequences prefixed with
---- old/sender.c
-+++ new/sender.c
-@@ -28,7 +28,7 @@ extern int am_server;
- extern int am_daemon;
- extern int log_before_transfer;
- extern int log_format_has_i;
--extern int daemon_log_format_has_i;
-+extern int logfile_format_has_i;
- extern int csum_length;
- extern int append_mode;
- extern int io_error;
-@@ -218,8 +218,7 @@ void send_files(struct file_list *flist,
-       int phase = 0, max_phase = protocol_version >= 29 ? 2 : 1;
-       struct stats initial_stats;
-       int save_make_backups = make_backups;
--      int itemizing = am_daemon ? daemon_log_format_has_i
--                    : !am_server && log_format_has_i;
-+      int itemizing = am_server ? logfile_format_has_i : log_format_has_i;
-       int f_xfer = write_batch < 0 ? batch_fd : f_out;
-       int i, j;