Changed variable "logfile" to "logfile_fp".
[rsync/rsync-patches.git] / log-file.diff
CommitLineData
9d32714e
WD
1This patch allows a non-daemon server and a client rsync to log what they
2are doing, similar to how a daemon logs its actions.
3
4--- old/cleanup.c
5+++ new/cleanup.c
6@@ -21,6 +21,7 @@
7
8 #include "rsync.h"
9
10+extern int am_server;
11 extern int io_error;
12 extern int keep_partial;
13 extern int log_got_error;
14@@ -149,7 +150,7 @@ void _exit_cleanup(int code, const char
15 code = RERR_PARTIAL;
16 }
17
18- if (code)
19+ if (code || am_server)
20 log_exit(code, file, line);
21
22 if (verbose > 2) {
23--- old/clientserver.c
24+++ new/clientserver.c
a56690e2 25@@ -44,11 +44,15 @@ extern int protocol_version;
9d32714e
WD
26 extern int io_timeout;
27 extern int no_detach;
28 extern int default_af_hint;
29+extern int logfile_format_has_i;
30+extern int logfile_format_has_o_or_i;
a56690e2 31 extern int log_initialised;
9d32714e
WD
32 extern mode_t orig_umask;
33 extern char *bind_address;
34 extern char *sockopts;
35 extern char *config_file;
36+extern char *logfile_format;
37+extern char *logfile_name;
38 extern char *files_from;
39 extern char *tmpdir;
40 extern struct chmod_mode_struct *chmod_modes;
a56690e2 41@@ -56,8 +60,6 @@ extern struct filter_list_struct server_
9d32714e
WD
42
43 char *auth_user;
44 int read_only = 0;
45-int daemon_log_format_has_i = 0;
46-int daemon_log_format_has_o_or_i = 0;
47 int module_id = -1;
48 struct chmod_mode_struct *daemon_chmod_modes;
49
a56690e2 50@@ -330,11 +332,12 @@ static int rsync_module(int f_in, int f_
9d32714e
WD
51 read_only = 1;
52
9d32714e
WD
53 if (lp_transfer_logging(i)) {
54- if (log_format_has(lp_log_format(i), 'i'))
55- daemon_log_format_has_i = 1;
56- if (daemon_log_format_has_i
57- || log_format_has(lp_log_format(i), 'o'))
58- daemon_log_format_has_o_or_i = 1;
59+ logfile_format = lp_log_format(i);
60+ if (log_format_has(logfile_format, 'i'))
61+ logfile_format_has_i = 1;
62+ if (logfile_format_has_i
63+ || log_format_has(logfile_format, 'o'))
64+ logfile_format_has_o_or_i = 1;
65 }
66
67 am_root = (MY_UID() == 0);
a56690e2
WD
68@@ -395,6 +398,7 @@ static int rsync_module(int f_in, int f_
69 parse_rule(&server_filter_list, p, MATCHFLG_WORD_SPLIT,
70 XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES);
71
72+ logfile_name = lp_log_file();
73 log_init();
74
75 #ifdef HAVE_PUTENV
76@@ -742,8 +746,10 @@ int start_daemon(int f_in, int f_out)
77 if (!lp_load(config_file, 0))
78 exit_cleanup(RERR_SYNTAX);
79
80- if (!log_initialised)
81+ if (!log_initialised) {
82+ logfile_name = lp_log_file();
83 log_init();
84+ }
85
86 if (!am_server) {
87 set_socket_options(f_in, "SO_KEEPALIVE");
88@@ -842,6 +848,7 @@ int daemon_main(void)
89 if (bind_address == NULL && *lp_bind_address())
90 bind_address = lp_bind_address();
91
92+ logfile_name = lp_log_file();
93 log_init();
94
95 rprintf(FLOG, "rsyncd version %s starting, listening on port %d\n",
9d32714e
WD
96--- old/flist.c
97+++ new/flist.c
98@@ -95,15 +95,15 @@ static int show_filelist_p(void)
99
100 static void start_filelist_progress(char *kind)
101 {
102- rprintf(FINFO, "%s ... ", kind);
103+ rprintf(FCLIENT, "%s ... ", kind);
104 if (verbose > 1 || do_progress)
105- rprintf(FINFO, "\n");
106+ rprintf(FCLIENT, "\n");
107 rflush(FINFO);
108 }
109
110 static void emit_filelist_progress(int count)
111 {
112- rprintf(FINFO, " %d files...\r", count);
113+ rprintf(FCLIENT, " %d files...\r", count);
114 }
115
116 static void maybe_emit_filelist_progress(int count)
117@@ -295,7 +295,7 @@ void flist_expand(struct file_list *flis
118 flist->malloced);
119
120 if (verbose >= 2 && flist->malloced != FLIST_START) {
121- rprintf(FINFO, "[%s] expand file_list to %.0f bytes, did%s move\n",
122+ rprintf(FCLIENT, "[%s] expand file_list to %.0f bytes, did%s move\n",
123 who_am_i(),
124 (double)sizeof flist->files[0] * flist->malloced,
125 (new_ptr == flist->files) ? " not" : "");
126@@ -1077,6 +1077,7 @@ struct file_list *send_file_list(int f,
127 int64 start_write;
128 int use_ff_fd = 0;
129
130+ rprintf(FLOG, "building file list\n");
131 if (show_filelist_p())
132 start_filelist_progress("building file list");
133
134@@ -1343,6 +1344,7 @@ struct file_list *recv_file_list(int f)
135 unsigned short flags;
136 int64 start_read;
137
138+ rprintf(FLOG, "receiving file list\n");
139 if (show_filelist_p())
140 start_filelist_progress("receiving file list");
141
142--- old/generator.c
143+++ new/generator.c
144@@ -27,7 +27,7 @@ extern int verbose;
145 extern int dry_run;
146 extern int do_xfers;
147 extern int log_format_has_i;
148-extern int daemon_log_format_has_i;
149+extern int logfile_format_has_i;
150 extern int am_root;
151 extern int am_server;
152 extern int am_daemon;
153@@ -663,7 +663,7 @@ static int try_dests_reg(struct file_str
154 } else if (itemizing)
155 itemize(file, ndx, 0, stp, 0, 0, NULL);
156 if (verbose > 1 && maybe_ATTRS_REPORT) {
157- code = daemon_log_format_has_i || dry_run
158+ code = logfile_format_has_i || dry_run
159 ? FCLIENT : FINFO;
160 rprintf(code, "%s is uptodate\n", fname);
161 }
162@@ -686,7 +686,7 @@ static int try_dests_reg(struct file_str
163 if (maybe_ATTRS_REPORT
164 && ((!itemizing && verbose && match_level == 2)
165 || (verbose > 1 && match_level == 3))) {
166- code = daemon_log_format_has_i || dry_run
167+ code = logfile_format_has_i || dry_run
168 ? FCLIENT : FINFO;
169 rprintf(code, "%s%s\n", fname,
170 match_level == 3 ? " is uptodate" : "");
171@@ -742,7 +742,7 @@ static int try_dests_non(struct file_str
172 itemize(file, ndx, 0, &st, changes, 0, lp);
173 }
174 if (verbose > 1 && maybe_ATTRS_REPORT) {
175- code = daemon_log_format_has_i || dry_run
176+ code = logfile_format_has_i || dry_run
177 ? FCLIENT : FINFO;
178 rprintf(code, "%s is uptodate\n", fname);
179 }
180@@ -1304,9 +1304,9 @@ void generate_files(int f_out, struct fi
181 if (protocol_version >= 29) {
182 itemizing = 1;
183 maybe_ATTRS_REPORT = log_format_has_i ? 0 : ATTRS_REPORT;
184- code = daemon_log_format_has_i ? 0 : FLOG;
185+ code = logfile_format_has_i ? 0 : FLOG;
186 } else if (am_daemon) {
187- itemizing = daemon_log_format_has_i && do_xfers;
188+ itemizing = logfile_format_has_i && do_xfers;
189 maybe_ATTRS_REPORT = ATTRS_REPORT;
190 code = itemizing || !do_xfers ? FCLIENT : FINFO;
191 } else if (!am_server) {
192--- old/log.c
193+++ new/log.c
31ce435c 194@@ -44,17 +44,18 @@ extern int protocol_version;
9d32714e
WD
195 extern int preserve_times;
196 extern int log_format_has_i;
197 extern int log_format_has_o_or_i;
198-extern int daemon_log_format_has_o_or_i;
199+extern int logfile_format_has_o_or_i;
200 extern mode_t orig_umask;
201 extern char *auth_user;
202 extern char *log_format;
203+extern char *logfile_format;
204+extern char *logfile_name;
205 #if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H
206 extern iconv_t ic_chck;
207 #endif
208
9d32714e
WD
209 static int logfile_was_closed;
210-static char *logfname;
31ce435c
WD
211-static FILE *logfile;
212+static FILE *logfile_fp;
9d32714e
WD
213 struct stats stats;
214
31ce435c
WD
215 int log_got_error = 0;
216@@ -109,10 +110,10 @@ static void logit(int priority, char *bu
217 {
218 if (logfile_was_closed)
219 logfile_reopen();
220- if (logfile) {
221- fprintf(logfile,"%s [%d] %s",
222+ if (logfile_fp) {
223+ fprintf(logfile_fp, "%s [%d] %s",
224 timestring(time(NULL)), (int)getpid(), buf);
225- fflush(logfile);
226+ fflush(logfile_fp);
227 } else {
228 syslog(priority, "%s", buf);
229 }
9d32714e
WD
230@@ -145,14 +146,14 @@ static void syslog_init()
231 static void logfile_open(void)
232 {
233 mode_t old_umask = umask(022 | orig_umask);
234- logfile = fopen(logfname, "a");
31ce435c 235+ logfile_fp = fopen(logfile_name, "a");
9d32714e 236 umask(old_umask);
31ce435c
WD
237- if (!logfile) {
238+ if (!logfile_fp) {
9d32714e
WD
239 int fopen_errno = errno;
240 /* Rsync falls back to using syslog on failure. */
241 syslog_init();
242 rsyserr(FERROR, fopen_errno,
243- "failed to open log-file %s", logfname);
244+ "failed to open log-file %s", logfile_name);
245 rprintf(FINFO, "Ignoring \"log file\" setting.\n");
246 }
247 }
31ce435c 248@@ -172,8 +173,7 @@ void log_init(void)
9d32714e
WD
249 localtime(&t);
250
31ce435c 251 /* optionally use a log file instead of syslog */
9d32714e
WD
252- logfname = lp_log_file();
253- if (logfname && *logfname)
254+ if (logfile_name && *logfile_name)
255 logfile_open();
256 else
257 syslog_init();
31ce435c
WD
258@@ -181,10 +181,10 @@ void log_init(void)
259
260 void logfile_close(void)
261 {
262- if (logfile) {
263+ if (logfile_fp) {
264 logfile_was_closed = 1;
265- fclose(logfile);
266- logfile = NULL;
267+ fclose(logfile_fp);
268+ logfile_fp = NULL;
269 }
270 }
271
272@@ -243,9 +243,9 @@ void rwrite(enum logcode code, char *buf
9d32714e
WD
273
274 if (code == FCLIENT)
275 code = FINFO;
276- else if (am_daemon) {
277+ else if (logfile_name) { /* always non-NULL in the daemon */
278 static int in_block;
279- char msg[2048];
280+ char msg[2048], *s;
281 int priority = code == FERROR ? LOG_WARNING : LOG_INFO;
282
283 if (in_block)
31ce435c 284@@ -254,10 +254,11 @@ void rwrite(enum logcode code, char *buf
9d32714e
WD
285 if (!log_initialised)
286 log_init();
287 strlcpy(msg, buf, MIN((int)sizeof msg, len + 1));
288- logit(priority, msg);
289+ for (s = msg; *s == '\n' && s[1]; s++) {}
290+ logit(priority, s);
291 in_block = 0;
292
293- if (code == FLOG || !am_server)
294+ if (code == FLOG || (am_daemon && !am_server))
295 return;
296 } else if (code == FLOG)
297 return;
31ce435c 298@@ -403,26 +404,14 @@ void rflush(enum logcode code)
9d32714e
WD
299 {
300 FILE *f = NULL;
301
302- if (am_daemon) {
303+ if (am_daemon || code == FLOG)
304 return;
305- }
306
307- if (code == FLOG) {
308- return;
309- }
310-
311- if (code == FERROR) {
312+ if (code == FERROR || am_server)
313 f = stderr;
314- }
315-
316- if (code == FINFO) {
317- if (am_server)
318- f = stderr;
319- else
320- f = stdout;
321- }
322+ else
323+ f = stdout;
324
325- if (!f) exit_cleanup(RERR_MESSAGEIO);
326 fflush(f);
327 }
328
31ce435c 329@@ -695,12 +684,12 @@ void log_item(struct file_struct *file,
9d32714e
WD
330 {
331 char *s_or_r = am_sender ? "send" : "recv";
332
333- if (lp_transfer_logging(module_id)) {
334- log_formatted(FLOG, lp_log_format(module_id), s_or_r,
335- file, initial_stats, iflags, hlink);
336- } else if (log_format && !am_server) {
337+ if (log_format && !am_server) {
338 log_formatted(FNAME, log_format, s_or_r,
339 file, initial_stats, iflags, hlink);
340+ } else if (logfile_format) {
341+ log_formatted(FLOG, logfile_format, s_or_r,
342+ file, initial_stats, iflags, hlink);
343 }
344 }
345
31ce435c 346@@ -712,7 +701,7 @@ void maybe_log_item(struct file_struct *
9d32714e
WD
347 || log_format_has_i > 1 || (verbose > 1 && log_format_has_i));
348 int local_change = iflags & ITEM_LOCAL_CHANGE && significant_flags;
349 if (am_server) {
350- if (am_daemon && !dry_run && see_item)
351+ if (logfile_name && !dry_run && see_item)
352 log_item(file, &stats, iflags, buf);
353 } else if (see_item || local_change || *buf
354 || (S_ISDIR(file->mode) && significant_flags))
31ce435c 355@@ -740,10 +729,10 @@ void log_delete(char *fname, int mode)
9d32714e
WD
356 ITEM_DELETED, NULL);
357 }
358
359- if (!am_daemon || dry_run || !lp_transfer_logging(module_id))
360+ if (!logfile_name || dry_run || !logfile_format)
361 return;
362
363- fmt = daemon_log_format_has_o_or_i ? lp_log_format(module_id) : "deleting %n";
364+ fmt = logfile_format_has_o_or_i ? logfile_format : "deleting %n";
365 log_formatted(FLOG, fmt, "del.", &file, &stats, ITEM_DELETED, NULL);
366 }
367
368--- old/main.c
369+++ new/main.c
370@@ -168,7 +168,6 @@ static void handle_stats(int f)
371 return;
372
373 if (am_daemon) {
374- log_exit(0, __FILE__, __LINE__);
375 if (f == -1 || !am_sender)
376 return;
377 }
378--- old/options.c
379+++ new/options.c
a56690e2 380@@ -146,6 +146,8 @@ char *basis_dir[MAX_BASIS_DIRS+1];
9d32714e
WD
381 char *config_file = NULL;
382 char *shell_cmd = NULL;
383 char *log_format = NULL;
384+char *logfile_name = NULL;
385+char *logfile_format = NULL;
386 char *password_file = NULL;
387 char *rsync_path = RSYNC_PATH;
388 char *backup_dir = NULL;
a56690e2 389@@ -162,7 +164,9 @@ int verbose = 0;
9d32714e
WD
390 int quiet = 0;
391 int log_before_transfer = 0;
392 int log_format_has_i = 0;
393+int logfile_format_has_i = 0;
394 int log_format_has_o_or_i = 0;
395+int logfile_format_has_o_or_i = 0;
396 int always_checksum = 0;
397 int list_only = 0;
398
a56690e2 399@@ -359,6 +363,7 @@ void usage(enum logcode F)
9d32714e
WD
400 rprintf(F," --progress show progress during transfer\n");
401 rprintf(F," -P same as --partial --progress\n");
402 rprintf(F," -i, --itemize-changes output a change-summary for all updates\n");
403+ rprintf(F," --log-file=FILE output what we're doing to a log file\n");
404 rprintf(F," --log-format=FORMAT output filenames using the specified format\n");
405 rprintf(F," --password-file=FILE read password from FILE\n");
406 rprintf(F," --list-only list the files instead of copying them\n");
a56690e2 407@@ -492,6 +497,7 @@ static struct poptOption long_options[]
9d32714e
WD
408 {"partial-dir", 0, POPT_ARG_STRING, &partial_dir, 0, 0, 0 },
409 {"delay-updates", 0, POPT_ARG_NONE, &delay_updates, 0, 0, 0 },
410 {"prune-empty-dirs",'m', POPT_ARG_NONE, &prune_empty_dirs, 0, 0, 0 },
411+ {"log-file", 0, POPT_ARG_STRING, &logfile_name, 0, 0, 0 },
412 {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
413 {"itemize-changes", 'i', POPT_ARG_NONE, 0, 'i', 0, 0 },
414 {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
a56690e2 415@@ -1311,6 +1317,21 @@ int parse_arguments(int *argc, const cha
9d32714e
WD
416 if (log_format_has_i || log_format_has(log_format, 'o'))
417 log_format_has_o_or_i = 1;
418
419+ if (am_daemon)
420+ logfile_name = NULL;
421+ else if (logfile_name) {
422+ if (am_server) {
423+ logfile_format = "%i %n%L";
424+ logfile_format_has_i = logfile_format_has_o_or_i = 1;
425+ } else if (log_format) {
426+ logfile_format = log_format;
427+ logfile_format_has_i = log_format_has_i;
428+ logfile_format_has_o_or_i = log_format_has_o_or_i;
429+ }
430+ log_before_transfer = !am_server;
431+ log_init();
432+ }
433+
434 if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit))
435 bwlimit = daemon_bwlimit;
436 if (bwlimit) {
437--- old/progress.c
438+++ new/progress.c
439@@ -103,7 +103,7 @@ static void rprint_progress(OFF_T ofs, O
440 stats.num_files);
441 } else
442 strcpy(eol, "\r");
443- rprintf(FINFO, "%12s %3d%% %7.2f%s %4d:%02d:%02d%s",
444+ rprintf(FCLIENT, "%12s %3d%% %7.2f%s %4d:%02d:%02d%s",
445 human_num(ofs), pct, rate, units,
446 remain_h, remain_m, remain_s, eol);
447 }
448--- old/receiver.c
449+++ new/receiver.c
450@@ -27,7 +27,7 @@ extern int am_server;
451 extern int do_progress;
452 extern int log_before_transfer;
453 extern int log_format_has_i;
454-extern int daemon_log_format_has_i;
455+extern int logfile_format_has_i;
456 extern int csum_length;
457 extern int read_batch;
458 extern int write_batch;
459@@ -341,8 +341,7 @@ int recv_files(int f_in, struct file_lis
460 struct file_struct *file;
461 struct stats initial_stats;
462 int save_make_backups = make_backups;
463- int itemizing = am_daemon ? daemon_log_format_has_i
464- : !am_server && log_format_has_i;
465+ int itemizing = am_server ? logfile_format_has_i : log_format_has_i;
466 int max_phase = protocol_version >= 29 ? 2 : 1;
467 int i, recv_ok;
468
469--- old/rsync.c
470+++ new/rsync.c
471@@ -32,7 +32,7 @@
472
473 extern int verbose;
474 extern int dry_run;
475-extern int daemon_log_format_has_i;
476+extern int logfile_format_has_i;
477 extern int preserve_perms;
478 extern int preserve_executability;
479 extern int preserve_times;
480@@ -218,7 +218,7 @@ int set_file_attrs(char *fname, struct f
481 #endif
482
483 if (verbose > 1 && flags & ATTRS_REPORT) {
484- enum logcode code = daemon_log_format_has_i || dry_run
485+ enum logcode code = logfile_format_has_i || dry_run
486 ? FCLIENT : FINFO;
487 if (updated)
488 rprintf(code, "%s\n", fname);
489--- old/rsync.h
490+++ new/rsync.h
a56690e2 491@@ -158,8 +158,8 @@
9d32714e
WD
492
493
494 /* Log-message categories. Only FERROR and FINFO get sent over the socket.
495- * FLOG and FCLIENT are only used on the daemon side for custom logging,
496- * while FNAME is only used on the client side. */
497+ * FLOG only goes to the log file, not to the client; FCLIENT is the opposite.
498+ * FNAME is a client-side message when outputting a filename on its own. */
499 enum logcode { FERROR=1, FINFO=2, FLOG=3, FCLIENT=4, FNAME=5, FSOCKERR=6 };
500
501 /* Messages types that are sent over the message channel. The logcode
502--- old/rsync.yo
503+++ new/rsync.yo
504@@ -387,6 +387,7 @@ to the detailed description below for a
505 --progress show progress during transfer
506 -P same as --partial --progress
507 -i, --itemize-changes output a change-summary for all updates
508+ --log-file=FILE output what we're doing to a log file
509 --log-format=FORMAT output filenames using the specified format
510 --password-file=FILE read password from FILE
511 --list-only list the files instead of copying them
512@@ -1423,6 +1424,23 @@ the string "*deleting" for each item tha
513 you are talking to a recent enough rsync that it logs deletions instead of
514 outputting them as a verbose message).
515
516+dit(bf(--log-file=FILE)) This option causes rsync to log what it is doing
517+to a file. This is similar to the logging that a daemon does, but can be
518+requested for the client side and/or the server side of a non-daemon
519+transfer. If specified as a client option, transfer logging will in effect
520+if the bf(--log-format) option was either specified or implied (e.g.
521+bf(--verbose) implies a basic log format). If explicitly sent to a server
522+via the bf(--rsync-path) option, transfer logging will always occur using
523+the default bf(--itemize-changes) format.
524+
525+Here's a example command that requests the remote side to log what is
526+happening:
527+
528+verb( rsync -av --rsync-path="path --log-file=/tmp/rlog" src/ dest/)
529+
530+This is very useful if you need to debug why a connection is closing
531+unexpectedly.
532+
533 dit(bf(--log-format=FORMAT)) This allows you to specify exactly what the
534 rsync client outputs to the user on a per-file basis. The format is a text
535 string containing embedded single-character escape sequences prefixed with
536--- old/sender.c
537+++ new/sender.c
538@@ -25,7 +25,7 @@ extern int am_server;
539 extern int am_daemon;
540 extern int log_before_transfer;
541 extern int log_format_has_i;
542-extern int daemon_log_format_has_i;
543+extern int logfile_format_has_i;
544 extern int csum_length;
545 extern int append_mode;
546 extern int io_error;
547@@ -215,8 +215,7 @@ void send_files(struct file_list *flist,
548 int phase = 0, max_phase = protocol_version >= 29 ? 2 : 1;
549 struct stats initial_stats;
550 int save_make_backups = make_backups;
551- int itemizing = am_daemon ? daemon_log_format_has_i
552- : !am_server && log_format_has_i;
553+ int itemizing = am_server ? logfile_format_has_i : log_format_has_i;
554 int f_xfer = write_batch < 0 ? batch_fd : f_out;
555 int i, j;
556