1 /* -*- c-file-style: "linux" -*-
3 * Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
4 * Copyright (C) 2000, 2001, 2002 by Martin Pool <mbp@samba.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 * If 1, send the whole file as literal data rather than trying to
28 * create an incremental diff.
30 * If -1, then look at whether we're local or remote and go by that.
32 * @sa disable_deltas_p()
38 int preserve_links = 0;
39 int preserve_hard_links = 0;
40 int preserve_perms = 0;
41 int preserve_devices = 0;
44 int preserve_times = 0;
51 int delete_excluded=0;
52 int one_file_system=0;
69 int daemon_over_rsh = 0;
74 int copy_unsafe_links=0;
75 int block_size=BLOCK_SIZE;
80 int opt_ignore_existing=0;
87 /** Network address family. **/
89 int default_af_hint = 0; /* Any protocol */
91 int default_af_hint = AF_INET; /* Must use IPv4 */
94 /** Do not go into the background when run as --daemon. Good
95 * for debugging and required for running as a service on W32,
96 * or under Unix process-monitors. **/
101 int suffix_specified = 0;
103 char *backup_suffix = BACKUP_SUFFIX;
105 char *compare_dest = NULL;
106 char *config_file = NULL;
107 char *shell_cmd = NULL;
108 char *log_format = NULL;
109 char *password_file = NULL;
110 char *rsync_path = RSYNC_PATH;
111 char *backup_dir = NULL;
112 int rsync_port = RSYNC_PORT;
117 int always_checksum = 0;
120 char *batch_prefix = NULL;
122 static int modify_window_set;
124 /** Local address to bind. As a character string because it's
125 * interpreted by the IPv6 layer: should be a numeric IP4 or ip6
126 * address, or a hostname. **/
130 static void print_rsync_version(enum logcode f)
132 char const *got_socketpair = "no ";
133 char const *hardlinks = "no ";
134 char const *links = "no ";
135 char const *ipv6 = "no ";
136 STRUCT_STAT *dumstat;
138 #ifdef HAVE_SOCKETPAIR
142 #if SUPPORT_HARD_LINKS
154 rprintf(f, "%s version %s protocol version %d\n",
155 RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
157 "Copyright (C) 1996-2002 by Andrew Tridgell and others\n");
158 rprintf(f, "<http://rsync.samba.org/>\n");
159 rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
160 "%shard links, %ssymlinks, batchfiles, \n",
161 (int) (sizeof(OFF_T) * 8),
162 got_socketpair, hardlinks, links);
164 /* Note that this field may not have type ino_t. It depends
165 * on the complicated interaction between largefile feature
167 rprintf(f, " %sIPv6, %d-bit system inums, %d-bit internal inums\n",
169 (int) (sizeof(dumstat->st_ino) * 8),
170 (int) (sizeof(INO64_T) * 8));
171 #ifdef MAINTAINER_MODE
172 rprintf(f, " panic action: \"%s\"\n",
177 rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
182 "rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
183 "are welcome to redistribute it under certain conditions. See the GNU\n"
184 "General Public Licence for details.\n"
189 void usage(enum logcode F)
191 print_rsync_version(F);
193 rprintf(F,"\nrsync is a file transfer program capable of efficient remote update\nvia a fast differencing algorithm.\n\n");
195 rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
196 rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC DEST\n");
197 rprintf(F," or rsync [OPTION]... SRC [SRC]... DEST\n");
198 rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
199 rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
200 rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n");
201 rprintf(F," or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST\n");
202 rprintf(F,"SRC on single-colon remote HOST will be expanded by remote shell\n");
203 rprintf(F,"SRC on server remote HOST may contain shell wildcards or multiple\n");
204 rprintf(F," sources separated by space as long as they have same top-level\n");
205 rprintf(F,"\nOptions\n");
206 rprintf(F," -v, --verbose increase verbosity\n");
207 rprintf(F," -q, --quiet decrease verbosity\n");
208 rprintf(F," -c, --checksum always checksum\n");
209 rprintf(F," -a, --archive archive mode, equivalent to -rlptgoD\n");
210 rprintf(F," -r, --recursive recurse into directories\n");
211 rprintf(F," -R, --relative use relative path names\n");
212 rprintf(F," -b, --backup make backups (default %s suffix)\n",BACKUP_SUFFIX);
213 rprintf(F," --backup-dir make backups into this directory\n");
214 rprintf(F," --suffix=SUFFIX override backup suffix\n");
215 rprintf(F," -u, --update update only (don't overwrite newer files)\n");
216 rprintf(F," -l, --links copy symlinks as symlinks\n");
217 rprintf(F," -L, --copy-links copy the referent of symlinks\n");
218 rprintf(F," --copy-unsafe-links copy links outside the source tree\n");
219 rprintf(F," --safe-links ignore links outside the destination tree\n");
220 rprintf(F," -H, --hard-links preserve hard links\n");
221 rprintf(F," -p, --perms preserve permissions\n");
222 rprintf(F," -o, --owner preserve owner (root only)\n");
223 rprintf(F," -g, --group preserve group\n");
224 rprintf(F," -D, --devices preserve devices (root only)\n");
225 rprintf(F," -t, --times preserve times\n");
226 rprintf(F," -S, --sparse handle sparse files efficiently\n");
227 rprintf(F," -n, --dry-run show what would have been transferred\n");
228 rprintf(F," -W, --whole-file copy whole files, no incremental checks\n");
229 rprintf(F," --no-whole-file turn off --whole-file\n");
230 rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n");
231 rprintf(F," -B, --block-size=SIZE checksum blocking size (default %d)\n",BLOCK_SIZE);
232 rprintf(F," -e, --rsh=COMMAND specify the remote shell\n");
233 rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
234 rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
235 rprintf(F," --existing only update files that already exist\n");
236 rprintf(F," --ignore-existing ignore files that already exist on the receiving side\n");
237 rprintf(F," --delete delete files that don't exist on the sending side\n");
238 rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
239 rprintf(F," --delete-after delete after transferring, not before\n");
240 rprintf(F," --ignore-errors delete even if there are IO errors\n");
241 rprintf(F," --max-delete=NUM don't delete more than NUM files\n");
242 rprintf(F," --partial keep partially transferred files\n");
243 rprintf(F," --force force deletion of directories even if not empty\n");
244 rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
245 rprintf(F," --timeout=TIME set IO timeout in seconds\n");
246 rprintf(F," -I, --ignore-times don't exclude files that match length and time\n");
247 rprintf(F," --size-only only use file size when determining if a file should be transferred\n");
248 rprintf(F," --modify-window=NUM Timestamp window (seconds) for file match (default=%d)\n",modify_window);
249 rprintf(F," -T --temp-dir=DIR create temporary files in directory DIR\n");
250 rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
251 rprintf(F," -P equivalent to --partial --progress\n");
252 rprintf(F," -z, --compress compress file data\n");
253 rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n");
254 rprintf(F," --exclude-from=FILE exclude patterns listed in FILE\n");
255 rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
256 rprintf(F," --include-from=FILE don't exclude patterns listed in FILE\n");
257 rprintf(F," --version print version number\n");
258 rprintf(F," --daemon run as a rsync daemon\n");
259 rprintf(F," --no-detach do not detach from the parent\n");
260 rprintf(F," --address=ADDRESS bind to the specified address\n");
261 rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
262 rprintf(F," --port=PORT specify alternate rsyncd port number\n");
263 rprintf(F," --blocking-io use blocking IO for the remote shell\n");
264 rprintf(F," --no-blocking-io turn off --blocking-io\n");
265 rprintf(F," --stats give some file transfer stats\n");
266 rprintf(F," --progress show progress during transfer\n");
267 rprintf(F," --log-format=FORMAT log file transfers using specified format\n");
268 rprintf(F," --password-file=FILE get password from FILE\n");
269 rprintf(F," --bwlimit=KBPS limit I/O bandwidth, KBytes per second\n");
270 rprintf(F," --write-batch=PREFIX write batch fileset starting with PREFIX\n");
271 rprintf(F," --read-batch=PREFIX read batch fileset starting with PREFIX\n");
272 rprintf(F," -h, --help show this help screen\n");
274 rprintf(F," -4 prefer IPv4\n");
275 rprintf(F," -6 prefer IPv6\n");
280 rprintf(F,"\nPlease see the rsync(1) and rsyncd.conf(5) man pages for full documentation\n");
281 rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and answers\n");
284 enum {OPT_VERSION = 1000, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
285 OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
286 OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
287 OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
288 OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LINK_DEST,
289 OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
290 OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
291 OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_NO_BLOCKING_IO, OPT_NO_WHOLE_FILE,
292 OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_IGNORE_EXISTING};
294 static struct poptOption long_options[] = {
295 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
296 {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
297 {"suffix", 0, POPT_ARG_STRING, &backup_suffix, OPT_SUFFIX, 0, 0 },
298 {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
299 {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
300 {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times , 0, 0, 0 },
301 {"size-only", 0, POPT_ARG_NONE, &size_only , 0, 0, 0 },
302 {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
303 {"one-file-system", 'x', POPT_ARG_NONE, &one_file_system , 0, 0, 0 },
304 {"delete", 0, POPT_ARG_NONE, &delete_mode , 0, 0, 0 },
305 {"existing", 0, POPT_ARG_NONE, &only_existing , 0, 0, 0 },
306 {"ignore-existing", 0, POPT_ARG_NONE, &opt_ignore_existing , 0, 0, 0 },
307 {"delete-after", 0, POPT_ARG_NONE, 0, OPT_DELETE_AFTER, 0, 0 },
308 {"delete-excluded", 0, POPT_ARG_NONE, 0, OPT_DELETE_EXCLUDED, 0, 0 },
309 {"force", 0, POPT_ARG_NONE, &force_delete , 0, 0, 0 },
310 {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids , 0, 0, 0 },
311 {"exclude", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE, 0, 0 },
312 {"include", 0, POPT_ARG_STRING, 0, OPT_INCLUDE, 0, 0 },
313 {"exclude-from", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE_FROM, 0, 0 },
314 {"include-from", 0, POPT_ARG_STRING, 0, OPT_INCLUDE_FROM, 0, 0 },
315 {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks , 0, 0, 0 },
316 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
317 {"backup", 'b', POPT_ARG_NONE, &make_backups , 0, 0, 0 },
318 {"dry-run", 'n', POPT_ARG_NONE, &dry_run , 0, 0, 0 },
319 {"sparse", 'S', POPT_ARG_NONE, &sparse_files , 0, 0, 0 },
320 {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude , 0, 0, 0 },
321 {"update", 'u', POPT_ARG_NONE, &update_only , 0, 0, 0 },
322 {"links", 'l', POPT_ARG_NONE, &preserve_links , 0, 0, 0 },
323 {"copy-links", 'L', POPT_ARG_NONE, ©_links , 0, 0, 0 },
324 {"whole-file", 'W', POPT_ARG_NONE, &whole_file, 0, 0, 0 },
325 {"no-whole-file", 0, POPT_ARG_NONE, 0, OPT_NO_WHOLE_FILE, 0, 0 },
326 {"copy-unsafe-links", 0, POPT_ARG_NONE, ©_unsafe_links , 0, 0, 0 },
327 {"perms", 'p', POPT_ARG_NONE, &preserve_perms , 0, 0, 0 },
328 {"owner", 'o', POPT_ARG_NONE, &preserve_uid , 0, 0, 0 },
329 {"group", 'g', POPT_ARG_NONE, &preserve_gid , 0, 0, 0 },
330 {"devices", 'D', POPT_ARG_NONE, &preserve_devices , 0, 0, 0 },
331 {"times", 't', POPT_ARG_NONE, &preserve_times , 0, 0, 0 },
332 {"checksum", 'c', POPT_ARG_NONE, &always_checksum , 0, 0, 0 },
333 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
334 {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
335 {"archive", 'a', POPT_ARG_NONE, &archive_mode, 0, 0, 0 },
336 {"server", 0, POPT_ARG_NONE, &am_server , 0, 0, 0 },
337 {"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
338 {"recursive", 'r', POPT_ARG_NONE, &recurse , 0, 0, 0 },
339 {"relative", 'R', POPT_ARG_NONE, &relative_paths , 0, 0, 0 },
340 {"rsh", 'e', POPT_ARG_STRING, &shell_cmd , 0, 0, 0 },
341 {"block-size", 'B', POPT_ARG_INT, &block_size , 0, 0, 0 },
342 {"max-delete", 0, POPT_ARG_INT, &max_delete , 0, 0, 0 },
343 {"timeout", 0, POPT_ARG_INT, &io_timeout , 0, 0, 0 },
344 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir , 0, 0, 0 },
345 {"compare-dest", 0, POPT_ARG_STRING, &compare_dest , 0, 0, 0 },
346 {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
347 /* TODO: Should this take an optional int giving the compression level? */
348 {"compress", 'z', POPT_ARG_NONE, &do_compression , 0, 0, 0 },
349 {"daemon", 0, POPT_ARG_NONE, &am_daemon , 0, 0, 0 },
350 {"no-detach", 0, POPT_ARG_NONE, &no_detach , 0, 0, 0 },
351 {"stats", 0, POPT_ARG_NONE, &do_stats , 0, 0, 0 },
352 {"progress", 0, POPT_ARG_NONE, &do_progress , 0, 0, 0 },
353 {"partial", 0, POPT_ARG_NONE, &keep_partial , 0, 0, 0 },
354 {"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors , 0, 0, 0 },
355 {"blocking-io", 0, POPT_ARG_NONE, &blocking_io , 0, 0, 0 },
356 {"no-blocking-io", 0, POPT_ARG_NONE, 0, OPT_NO_BLOCKING_IO, 0, 0 },
357 {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
358 {"config", 0, POPT_ARG_STRING, &config_file , 0, 0, 0 },
359 {"port", 0, POPT_ARG_INT, &rsync_port , 0, 0, 0 },
360 {"log-format", 0, POPT_ARG_STRING, &log_format , 0, 0, 0 },
361 {"bwlimit", 0, POPT_ARG_INT, &bwlimit , 0, 0, 0 },
362 {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
363 {"backup-dir", 0, POPT_ARG_STRING, &backup_dir , 0, 0, 0 },
364 {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links , 0, 0, 0 },
365 {"read-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_READ_BATCH, 0, 0 },
366 {"write-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_WRITE_BATCH, 0, 0 },
368 {0, '4', POPT_ARG_VAL, &default_af_hint, AF_INET , 0, 0 },
369 {0, '6', POPT_ARG_VAL, &default_af_hint, AF_INET6 , 0, 0 },
375 static char err_buf[100];
379 * Store the option error message, if any, so that we can log the
380 * connection attempt (which requires parsing the options), and then
381 * show the error later on.
383 void option_error(void)
386 rprintf(FLOG, "%s", err_buf);
387 rprintf(FERROR, "%s: %s", RSYNC_NAME, err_buf);
389 rprintf (FERROR, "Error parsing options: "
390 "option may be supported on client but not on server?\n");
391 rprintf (FERROR, RSYNC_NAME ": Error parsing options: "
392 "option may be supported on client but not on server?\n");
398 * Check to see if we should refuse this option
400 static int check_refuse_options(char *ref, int opt)
406 for (i=0; long_options[i].longName; i++) {
407 if (long_options[i].val == opt) break;
410 if (!long_options[i].longName) return 0;
412 name = long_options[i].longName;
415 while ((p = strstr(ref,name))) {
416 if ((p==ref || p[-1]==' ') &&
417 (p[len] == ' ' || p[len] == 0)) {
418 snprintf(err_buf,sizeof(err_buf),
419 "The '%s' option is not supported by this server\n", name);
428 static int count_args(char const **argv)
432 while (argv[i] != NULL)
440 * Process command line arguments. Called on both local and remote.
442 * @retval 1 if all options are OK; with globals set to appropriate
445 * @retval 0 on error, with err_buf containing an explanation
447 int parse_arguments(int *argc, const char ***argv, int frommain)
450 char *ref = lp_refuse_options(module_id);
453 /* TODO: Call poptReadDefaultConfig; handle errors. */
455 /* The context leaks in case of an error, but if there's a
456 * problem we always exit anyhow. */
457 pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
459 while ((opt = poptGetNextOpt(pc)) != -1) {
461 if (check_refuse_options(ref, opt)) return 0;
464 /* most options are handled automatically by popt;
465 * only special cases are returned and listed here. */
469 print_rsync_version(FINFO);
473 /* The value has already been set by popt, but
474 * we need to remember that a suffix was specified
475 * in case a backup-directory is used. */
476 suffix_specified = 1;
479 case OPT_MODIFY_WINDOW:
480 /* The value has already been set by popt, but
481 * we need to remember that we're using a
482 * non-default setting. */
483 modify_window_set = 1;
486 case OPT_DELETE_AFTER:
491 case OPT_DELETE_EXCLUDED:
497 add_exclude(poptGetOptArg(pc), 0);
501 add_exclude(poptGetOptArg(pc), 1);
504 case OPT_EXCLUDE_FROM:
505 add_exclude_file(poptGetOptArg(pc), 1, 0);
508 case OPT_INCLUDE_FROM:
509 add_exclude_file(poptGetOptArg(pc), 1, 1);
512 case OPT_NO_WHOLE_FILE:
516 case OPT_NO_BLOCKING_IO:
525 #if SUPPORT_HARD_LINKS
526 preserve_hard_links=1;
528 /* FIXME: Don't say "server" if this is
529 * happening on the client. */
530 /* FIXME: Why do we have the duplicated
531 * rprintf? Everybody who gets this message
532 * ought to send it to the client and also to
534 snprintf(err_buf,sizeof(err_buf),
535 "hard links are not supported on this %s\n",
536 am_server ? "server" : "client");
537 rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
539 #endif /* SUPPORT_HARD_LINKS */
547 if (frommain) quiet++;
553 exit_cleanup(RERR_SYNTAX);
563 case OPT_WRITE_BATCH:
564 /* popt stores the filename in batch_prefix for us */
569 /* popt stores the filename in batch_prefix for us */
574 compare_dest = (char *)poptGetOptArg(pc);
578 snprintf(err_buf,sizeof(err_buf),
579 "hard links are not supported on this %s\n",
580 am_server ? "server" : "client");
581 rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
587 /* FIXME: If --daemon is specified, then errors for later
588 * parameters seem to disappear. */
589 snprintf(err_buf, sizeof(err_buf),
591 am_server ? "on remote machine: " : "",
592 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
598 if (write_batch && read_batch) {
599 snprintf(err_buf,sizeof(err_buf),
600 "write-batch and read-batch can not be used together\n");
601 rprintf(FERROR,"ERROR: write-batch and read-batch"
602 " can not be used together\n");
606 if (do_compression && (write_batch || read_batch)) {
607 snprintf(err_buf,sizeof(err_buf),
608 "compress can not be used with write-batch or read-batch\n");
609 rprintf(FERROR,"ERROR: compress can not be used with"
610 " write-batch or read-batch\n");
623 preserve_devices = 1;
626 *argv = poptGetArgs(pc);
628 *argc = count_args(*argv);
637 * Construct a filtered list of options to pass through from the
638 * client to the server.
640 * This involves setting options that will tell the server how to
641 * behave, and also filtering out options that are processed only
644 void server_options(char **args,int *argc)
647 static char argstr[50];
648 static char bsize[30];
649 static char iotime[30];
650 static char mdelete[30];
651 static char mwindow[30];
653 /* Leave room for ``--(write|read)-batch='' */
654 static char fext[MAXPATHLEN + 15];
658 if (blocking_io == -1)
661 args[ac++] = "--server";
663 if (daemon_over_rsh) {
664 args[ac++] = "--daemon";
666 /* if we're passing --daemon, we're done */
671 args[ac++] = "--sender";
675 for (i=0;i<verbose;i++)
678 /* the -q option is intentionally left out */
692 /* We don't need to send --no-whole-file, because it's the
693 * default for remote transfers, and in any case old versions
694 * of rsync will not understand it. */
696 if (preserve_hard_links)
702 if (preserve_devices)
725 /* this is a complete hack - blame Rusty
727 this is a hack to make the list_only (remote file list)
729 if (list_only && !recurse)
734 if (x != 1) args[ac++] = argstr;
736 if (block_size != BLOCK_SIZE) {
737 snprintf(bsize,sizeof(bsize),"-B%d",block_size);
741 if (max_delete && am_sender) {
742 snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
743 args[ac++] = mdelete;
746 if (batch_prefix != NULL) {
749 fmt = "--write-batch=%s";
752 fmt = "--read-batch=%s";
753 snprintf(fext,sizeof(fext),fmt,batch_prefix);
758 snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);
763 snprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit);
767 if (strcmp(backup_suffix, BACKUP_SUFFIX)) {
768 args[ac++] = "--suffix";
769 args[ac++] = backup_suffix;
772 if (delete_mode && !delete_excluded)
773 args[ac++] = "--delete";
776 args[ac++] = "--delete-excluded";
779 args[ac++] = "--size-only";
781 if (modify_window_set) {
782 snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
784 args[ac++] = mwindow;
788 args[ac++] = "--partial";
791 args[ac++] = "--force";
794 args[ac++] = "--delete-after";
797 args[ac++] = "--ignore-errors";
799 if (copy_unsafe_links)
800 args[ac++] = "--copy-unsafe-links";
803 args[ac++] = "--safe-links";
806 args[ac++] = "--numeric-ids";
808 if (only_existing && am_sender)
809 args[ac++] = "--existing";
811 if (opt_ignore_existing && am_sender)
812 args[ac++] = "--ignore-existing";
815 args[ac++] = "--temp-dir";
819 if (backup_dir && am_sender) {
820 /* only the receiver needs this option, if we are the sender
821 * then we need to send it to the receiver.
823 args[ac++] = "--backup-dir";
824 args[ac++] = backup_dir;
827 if (compare_dest && am_sender) {
828 /* the server only needs this option if it is not the sender,
829 * and it may be an older version that doesn't know this
830 * option, so don't send it if client is the sender.
832 args[ac++] = link_dest ? "--link-dest" : "--compare-dest";
833 args[ac++] = compare_dest;