Patch from J.W. Schultz to have --include-from and --exclude-from on
[rsync/rsync.git] / options.c
... / ...
CommitLineData
1/* -*- c-file-style: "linux" -*-
2 *
3 * Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
4 * Copyright (C) 2000, 2001, 2002 by Martin Pool <mbp@samba.org>
5 *
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.
10 *
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.
15 *
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.
19 */
20
21#include "rsync.h"
22#include "popt.h"
23
24int make_backups = 0;
25
26/**
27 * If True, send the whole file as literal data rather than trying to
28 * create an incremental diff.
29 *
30 * If both are 0, then look at whether we're local or remote and go by
31 * that.
32 *
33 * @sa disable_deltas_p()
34 **/
35int whole_file = 0;
36int no_whole_file = 0;
37
38int copy_links = 0;
39int preserve_links = 0;
40int preserve_hard_links = 0;
41int preserve_perms = 0;
42int preserve_devices = 0;
43int preserve_uid = 0;
44int preserve_gid = 0;
45int preserve_times = 0;
46int update_only = 0;
47int cvs_exclude = 0;
48int dry_run=0;
49int local_server=0;
50int ignore_times=0;
51int delete_mode=0;
52int delete_excluded=0;
53int one_file_system=0;
54int remote_version=0;
55int sparse_files=0;
56int do_compression=0;
57int am_root=0;
58int orig_umask=0;
59int relative_paths=0;
60int numeric_ids = 0;
61int force_delete = 0;
62int io_timeout = 0;
63int io_error = 0;
64int read_only = 0;
65int module_id = -1;
66int am_server = 0;
67int am_sender = 0;
68int recurse = 0;
69int am_daemon = 0;
70int daemon_over_rsh = 0;
71int do_stats=0;
72int do_progress=0;
73int keep_partial=0;
74int safe_symlinks=0;
75int copy_unsafe_links=0;
76int block_size=BLOCK_SIZE;
77int size_only=0;
78int bwlimit=0;
79int delete_after=0;
80int only_existing=0;
81int opt_ignore_existing=0;
82int max_delete=0;
83int ignore_errors=0;
84#ifdef _WIN32
85int modify_window=2;
86#else
87int modify_window=0;
88#endif
89int blocking_io=-1;
90
91
92/** Network address family. **/
93#ifdef INET6
94int default_af_hint = 0; /* Any protocol */
95#else
96int default_af_hint = AF_INET; /* Must use IPv4 */
97#endif
98
99/** Do not go into the background when run as --daemon. Good
100 * for debugging and required for running as a service on W32,
101 * or under Unix process-monitors. **/
102int no_detach = 0;
103
104int write_batch = 0;
105int read_batch = 0;
106int suffix_specified = 0;
107
108char *backup_suffix = BACKUP_SUFFIX;
109char *tmpdir = NULL;
110char *compare_dest = NULL;
111char *config_file = RSYNCD_CONF;
112char *shell_cmd = NULL;
113char *log_format = NULL;
114char *password_file = NULL;
115char *rsync_path = RSYNC_PATH;
116char *backup_dir = NULL;
117int rsync_port = RSYNC_PORT;
118
119int verbose = 0;
120int quiet = 0;
121int always_checksum = 0;
122int list_only = 0;
123
124char *batch_prefix = NULL;
125
126static int modify_window_set;
127
128/** Local address to bind. As a character string because it's
129 * interpreted by the IPv6 layer: should be a numeric IP4 or ip6
130 * address, or a hostname. **/
131char *bind_address;
132
133
134static void print_rsync_version(enum logcode f)
135{
136 char const *got_socketpair = "no ";
137 char const *hardlinks = "no ";
138 char const *links = "no ";
139 char const *ipv6 = "no ";
140 STRUCT_STAT *dumstat;
141
142#ifdef HAVE_SOCKETPAIR
143 got_socketpair = "";
144#endif
145
146#if SUPPORT_HARD_LINKS
147 hardlinks = "";
148#endif
149
150#if SUPPORT_LINKS
151 links = "";
152#endif
153
154#if INET6
155 ipv6 = "";
156#endif
157
158 rprintf(f, "%s version %s protocol version %d\n",
159 RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
160 rprintf(f,
161 "Copyright (C) 1996-2002 by Andrew Tridgell and others\n");
162 rprintf(f, "<http://rsync.samba.org/>\n");
163 rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
164 "%shard links, %ssymlinks, batchfiles, \n",
165 (int) (sizeof(OFF_T) * 8),
166 got_socketpair, hardlinks, links);
167
168 /* Note that this field may not have type ino_t. It depends
169 * on the complicated interaction between largefile feature
170 * macros. */
171 rprintf(f, " %sIPv6, %d-bit system inums, %d-bit internal inums\n",
172 ipv6,
173 (int) (sizeof(dumstat->st_ino) * 8),
174 (int) (sizeof(INO64_T) * 8));
175#ifdef MAINTAINER_MODE
176 rprintf(f, " panic action: \"%s\"\n",
177 get_panic_action());
178#endif
179
180#ifdef NO_INT64
181 rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
182#endif
183
184 rprintf(f,
185"\n"
186"rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
187"are welcome to redistribute it under certain conditions. See the GNU\n"
188"General Public Licence for details.\n"
189 );
190}
191
192
193void usage(enum logcode F)
194{
195 print_rsync_version(F);
196
197 rprintf(F,"\nrsync is a file transfer program capable of efficient remote update\nvia a fast differencing algorithm.\n\n");
198
199 rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
200 rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC DEST\n");
201 rprintf(F," or rsync [OPTION]... SRC [SRC]... DEST\n");
202 rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
203 rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
204 rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n");
205 rprintf(F," or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST\n");
206 rprintf(F,"SRC on single-colon remote HOST will be expanded by remote shell\n");
207 rprintf(F,"SRC on server remote HOST may contain shell wildcards or multiple\n");
208 rprintf(F," sources separated by space as long as they have same top-level\n");
209 rprintf(F,"\nOptions\n");
210 rprintf(F," -v, --verbose increase verbosity\n");
211 rprintf(F," -q, --quiet decrease verbosity\n");
212 rprintf(F," -c, --checksum always checksum\n");
213 rprintf(F," -a, --archive archive mode\n");
214 rprintf(F," -r, --recursive recurse into directories\n");
215 rprintf(F," -R, --relative use relative path names\n");
216 rprintf(F," -b, --backup make backups (default %s suffix)\n",BACKUP_SUFFIX);
217 rprintf(F," --backup-dir make backups into this directory\n");
218 rprintf(F," --suffix=SUFFIX override backup suffix\n");
219 rprintf(F," -u, --update update only (don't overwrite newer files)\n");
220 rprintf(F," -l, --links copy symlinks as symlinks\n");
221 rprintf(F," -L, --copy-links copy the referent of symlinks\n");
222 rprintf(F," --copy-unsafe-links copy links outside the source tree\n");
223 rprintf(F," --safe-links ignore links outside the destination tree\n");
224 rprintf(F," -H, --hard-links preserve hard links\n");
225 rprintf(F," -p, --perms preserve permissions\n");
226 rprintf(F," -o, --owner preserve owner (root only)\n");
227 rprintf(F," -g, --group preserve group\n");
228 rprintf(F," -D, --devices preserve devices (root only)\n");
229 rprintf(F," -t, --times preserve times\n");
230 rprintf(F," -S, --sparse handle sparse files efficiently\n");
231 rprintf(F," -n, --dry-run show what would have been transferred\n");
232 rprintf(F," -W, --whole-file copy whole files, no incremental checks\n");
233 rprintf(F," --no-whole-file turn off --whole-file\n");
234 rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n");
235 rprintf(F," -B, --block-size=SIZE checksum blocking size (default %d)\n",BLOCK_SIZE);
236 rprintf(F," -e, --rsh=COMMAND specify the remote shell\n");
237 rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
238 rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
239 rprintf(F," --existing only update files that already exist\n");
240 rprintf(F," --ignore-existing ignore files that already exist on the receiving side\n");
241 rprintf(F," --delete delete files that don't exist on the sending side\n");
242 rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
243 rprintf(F," --delete-after delete after transferring, not before\n");
244 rprintf(F," --ignore-errors delete even if there are IO errors\n");
245 rprintf(F," --max-delete=NUM don't delete more than NUM files\n");
246 rprintf(F," --partial keep partially transferred files\n");
247 rprintf(F," --force force deletion of directories even if not empty\n");
248 rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
249 rprintf(F," --timeout=TIME set IO timeout in seconds\n");
250 rprintf(F," -I, --ignore-times don't exclude files that match length and time\n");
251 rprintf(F," --size-only only use file size when determining if a file should be transferred\n");
252 rprintf(F," --modify-window=NUM Timestamp window (seconds) for file match (default=%d)\n",modify_window);
253 rprintf(F," -T --temp-dir=DIR create temporary files in directory DIR\n");
254 rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
255 rprintf(F," -P equivalent to --partial --progress\n");
256 rprintf(F," -z, --compress compress file data\n");
257 rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n");
258 rprintf(F," --exclude-from=FILE exclude patterns listed in FILE\n");
259 rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
260 rprintf(F," --include-from=FILE don't exclude patterns listed in FILE\n");
261 rprintf(F," --version print version number\n");
262 rprintf(F," --daemon run as a rsync daemon\n");
263 rprintf(F," --no-detach do not detach from the parent\n");
264 rprintf(F," --address=ADDRESS bind to the specified address\n");
265 rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
266 rprintf(F," --port=PORT specify alternate rsyncd port number\n");
267 rprintf(F," --blocking-io use blocking IO for the remote shell\n");
268 rprintf(F," --no-blocking-io turn off --blocking-io\n");
269 rprintf(F," --stats give some file transfer stats\n");
270 rprintf(F," --progress show progress during transfer\n");
271 rprintf(F," --log-format=FORMAT log file transfers using specified format\n");
272 rprintf(F," --password-file=FILE get password from FILE\n");
273 rprintf(F," --bwlimit=KBPS limit I/O bandwidth, KBytes per second\n");
274 rprintf(F," --write-batch=PREFIX write batch fileset starting with PREFIX\n");
275 rprintf(F," --read-batch=PREFIX read batch fileset starting with PREFIX\n");
276 rprintf(F," -h, --help show this help screen\n");
277#ifdef INET6
278 rprintf(F," -4 prefer IPv4\n");
279 rprintf(F," -6 prefer IPv6\n");
280#endif
281
282 rprintf(F,"\n");
283
284 rprintf(F,"\nPlease see the rsync(1) and rsyncd.conf(5) man pages for full documentation\n");
285 rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and answers\n");
286}
287
288enum {OPT_VERSION = 1000, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
289 OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
290 OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
291 OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
292 OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST,
293 OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
294 OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
295 OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO,
296 OPT_NO_BLOCKING_IO, OPT_WHOLE_FILE, OPT_NO_WHOLE_FILE,
297 OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_IGNORE_EXISTING};
298
299static struct poptOption long_options[] = {
300 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
301 {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
302 {"suffix", 0, POPT_ARG_STRING, &backup_suffix, OPT_SUFFIX, 0, 0 },
303 {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
304 {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
305 {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times , 0, 0, 0 },
306 {"size-only", 0, POPT_ARG_NONE, &size_only , 0, 0, 0 },
307 {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
308 {"one-file-system", 'x', POPT_ARG_NONE, &one_file_system , 0, 0, 0 },
309 {"delete", 0, POPT_ARG_NONE, &delete_mode , 0, 0, 0 },
310 {"existing", 0, POPT_ARG_NONE, &only_existing , 0, 0, 0 },
311 {"ignore-existing", 0, POPT_ARG_NONE, &opt_ignore_existing , 0, 0, 0 },
312 {"delete-after", 0, POPT_ARG_NONE, 0, OPT_DELETE_AFTER, 0, 0 },
313 {"delete-excluded", 0, POPT_ARG_NONE, 0, OPT_DELETE_EXCLUDED, 0, 0 },
314 {"force", 0, POPT_ARG_NONE, &force_delete , 0, 0, 0 },
315 {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids , 0, 0, 0 },
316 {"exclude", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE, 0, 0 },
317 {"include", 0, POPT_ARG_STRING, 0, OPT_INCLUDE, 0, 0 },
318 {"exclude-from", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE_FROM, 0, 0 },
319 {"include-from", 0, POPT_ARG_STRING, 0, OPT_INCLUDE_FROM, 0, 0 },
320 {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks , 0, 0, 0 },
321 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
322 {"backup", 'b', POPT_ARG_NONE, &make_backups , 0, 0, 0 },
323 {"dry-run", 'n', POPT_ARG_NONE, &dry_run , 0, 0, 0 },
324 {"sparse", 'S', POPT_ARG_NONE, &sparse_files , 0, 0, 0 },
325 {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude , 0, 0, 0 },
326 {"update", 'u', POPT_ARG_NONE, &update_only , 0, 0, 0 },
327 {"links", 'l', POPT_ARG_NONE, &preserve_links , 0, 0, 0 },
328 {"copy-links", 'L', POPT_ARG_NONE, &copy_links , 0, 0, 0 },
329 {"whole-file", 'W', POPT_ARG_NONE, 0, OPT_WHOLE_FILE, 0, 0 },
330 {"no-whole-file", 0, POPT_ARG_NONE, 0, OPT_NO_WHOLE_FILE, 0, 0 },
331 {"copy-unsafe-links", 0, POPT_ARG_NONE, &copy_unsafe_links , 0, 0, 0 },
332 {"perms", 'p', POPT_ARG_NONE, &preserve_perms , 0, 0, 0 },
333 {"owner", 'o', POPT_ARG_NONE, &preserve_uid , 0, 0, 0 },
334 {"group", 'g', POPT_ARG_NONE, &preserve_gid , 0, 0, 0 },
335 {"devices", 'D', POPT_ARG_NONE, &preserve_devices , 0, 0, 0 },
336 {"times", 't', POPT_ARG_NONE, &preserve_times , 0, 0, 0 },
337 {"checksum", 'c', POPT_ARG_NONE, &always_checksum , 0, 0, 0 },
338 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
339 {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
340 {"archive", 'a', POPT_ARG_NONE, 0, 'a', 0, 0 },
341 {"server", 0, POPT_ARG_NONE, &am_server , 0, 0, 0 },
342 {"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
343 {"recursive", 'r', POPT_ARG_NONE, &recurse , 0, 0, 0 },
344 {"relative", 'R', POPT_ARG_NONE, &relative_paths , 0, 0, 0 },
345 {"rsh", 'e', POPT_ARG_STRING, &shell_cmd , 0, 0, 0 },
346 {"block-size", 'B', POPT_ARG_INT, &block_size , 0, 0, 0 },
347 {"max-delete", 0, POPT_ARG_INT, &max_delete , 0, 0, 0 },
348 {"timeout", 0, POPT_ARG_INT, &io_timeout , 0, 0, 0 },
349 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir , 0, 0, 0 },
350 {"compare-dest", 0, POPT_ARG_STRING, &compare_dest , 0, 0, 0 },
351 /* TODO: Should this take an optional int giving the compression level? */
352 {"compress", 'z', POPT_ARG_NONE, &do_compression , 0, 0, 0 },
353 {"daemon", 0, POPT_ARG_NONE, &am_daemon , 0, 0, 0 },
354 {"no-detach", 0, POPT_ARG_NONE, &no_detach , 0, 0, 0 },
355 {"stats", 0, POPT_ARG_NONE, &do_stats , 0, 0, 0 },
356 {"progress", 0, POPT_ARG_NONE, &do_progress , 0, 0, 0 },
357 {"partial", 0, POPT_ARG_NONE, &keep_partial , 0, 0, 0 },
358 {"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors , 0, 0, 0 },
359 {"blocking-io", 0, POPT_ARG_NONE, &blocking_io , 0, 0, 0 },
360 {"no-blocking-io", 0, POPT_ARG_NONE, 0, OPT_NO_BLOCKING_IO, 0, 0 },
361 {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
362 {"config", 0, POPT_ARG_STRING, &config_file , 0, 0, 0 },
363 {"port", 0, POPT_ARG_INT, &rsync_port , 0, 0, 0 },
364 {"log-format", 0, POPT_ARG_STRING, &log_format , 0, 0, 0 },
365 {"bwlimit", 0, POPT_ARG_INT, &bwlimit , 0, 0, 0 },
366 {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
367 {"backup-dir", 0, POPT_ARG_STRING, &backup_dir , 0, 0, 0 },
368 {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links , 0, 0, 0 },
369 {"read-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_READ_BATCH, 0, 0 },
370 {"write-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_WRITE_BATCH, 0, 0 },
371#ifdef INET6
372 {0, '4', POPT_ARG_VAL, &default_af_hint, AF_INET , 0, 0 },
373 {0, '6', POPT_ARG_VAL, &default_af_hint, AF_INET6 , 0, 0 },
374#endif
375 {0,0,0,0, 0, 0, 0}
376};
377
378
379static char err_buf[100];
380
381
382/**
383 * Store the option error message, if any, so that we can log the
384 * connection attempt (which requires parsing the options), and then
385 * show the error later on.
386 **/
387void option_error(void)
388{
389 if (err_buf[0]) {
390 rprintf(FLOG, "%s", err_buf);
391 rprintf(FERROR, "%s: %s", RSYNC_NAME, err_buf);
392 } else {
393 rprintf (FERROR, "Error parsing options: "
394 "option may be supported on client but not on server?\n");
395 rprintf (FERROR, RSYNC_NAME ": Error parsing options: "
396 "option may be supported on client but not on server?\n");
397 }
398}
399
400
401/**
402 * Check to see if we should refuse this option
403 **/
404static int check_refuse_options(char *ref, int opt)
405{
406 int i, len;
407 char *p;
408 const char *name;
409
410 for (i=0; long_options[i].longName; i++) {
411 if (long_options[i].val == opt) break;
412 }
413
414 if (!long_options[i].longName) return 0;
415
416 name = long_options[i].longName;
417 len = strlen(name);
418
419 while ((p = strstr(ref,name))) {
420 if ((p==ref || p[-1]==' ') &&
421 (p[len] == ' ' || p[len] == 0)) {
422 snprintf(err_buf,sizeof(err_buf),
423 "The '%s' option is not supported by this server\n", name);
424 return 1;
425 }
426 ref += len;
427 }
428 return 0;
429}
430
431
432static int count_args(char const **argv)
433{
434 int i = 0;
435
436 while (argv[i] != NULL)
437 i++;
438
439 return i;
440}
441
442
443/**
444 * Process command line arguments. Called on both local and remote.
445 *
446 * @retval 1 if all options are OK; with globals set to appropriate
447 * values
448 *
449 * @retval 0 on error, with err_buf containing an explanation
450 **/
451int parse_arguments(int *argc, const char ***argv, int frommain)
452{
453 int opt;
454 char *ref = lp_refuse_options(module_id);
455 poptContext pc;
456
457 /* TODO: Call poptReadDefaultConfig; handle errors. */
458
459 /* The context leaks in case of an error, but if there's a
460 * problem we always exit anyhow. */
461 pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
462
463 while ((opt = poptGetNextOpt(pc)) != -1) {
464 if (ref) {
465 if (check_refuse_options(ref, opt)) return 0;
466 }
467
468 /* most options are handled automatically by popt;
469 * only special cases are returned and listed here. */
470
471 switch (opt) {
472 case OPT_VERSION:
473 print_rsync_version(FINFO);
474 exit_cleanup(0);
475
476 case OPT_SUFFIX:
477 /* The value has already been set by popt, but
478 * we need to remember that a suffix was specified
479 * in case a backup-directory is used. */
480 suffix_specified = 1;
481 break;
482
483 case OPT_MODIFY_WINDOW:
484 /* The value has already been set by popt, but
485 * we need to remember that we're using a
486 * non-default setting. */
487 modify_window_set = 1;
488 break;
489
490 case OPT_DELETE_AFTER:
491 delete_after = 1;
492 delete_mode = 1;
493 break;
494
495 case OPT_DELETE_EXCLUDED:
496 delete_excluded = 1;
497 delete_mode = 1;
498 break;
499
500 case OPT_EXCLUDE:
501 add_exclude(poptGetOptArg(pc), 0);
502 break;
503
504 case OPT_INCLUDE:
505 add_exclude(poptGetOptArg(pc), 1);
506 break;
507
508 case OPT_EXCLUDE_FROM:
509 add_exclude_file(poptGetOptArg(pc), 1, 0);
510 break;
511
512 case OPT_INCLUDE_FROM:
513 add_exclude_file(poptGetOptArg(pc), 1, 1);
514 break;
515
516 case OPT_WHOLE_FILE:
517 whole_file = 1;
518 no_whole_file = 0;
519 break;
520
521 case OPT_NO_WHOLE_FILE:
522 no_whole_file = 1;
523 whole_file = 0;
524 break;
525
526 case OPT_NO_BLOCKING_IO:
527 blocking_io = 0;
528 break;
529
530 case 'h':
531 usage(FINFO);
532 exit_cleanup(0);
533
534 case 'H':
535#if SUPPORT_HARD_LINKS
536 preserve_hard_links=1;
537#else
538 /* FIXME: Don't say "server" if this is
539 * happening on the client. */
540 /* FIXME: Why do we have the duplicated
541 * rprintf? Everybody who gets this message
542 * ought to send it to the client and also to
543 * the logs. */
544 snprintf(err_buf,sizeof(err_buf),
545 "hard links are not supported on this %s\n",
546 am_server ? "server" : "client");
547 rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
548 return 0;
549#endif /* SUPPORT_HARD_LINKS */
550 break;
551
552 case 'v':
553 verbose++;
554 break;
555
556 case 'q':
557 if (frommain) quiet++;
558 break;
559
560 case 'a':
561 recurse=1;
562#if SUPPORT_LINKS
563 preserve_links=1;
564#endif
565 preserve_perms=1;
566 preserve_times=1;
567 preserve_gid=1;
568 preserve_uid=1;
569 preserve_devices=1;
570 break;
571
572 case OPT_SENDER:
573 if (!am_server) {
574 usage(FERROR);
575 exit_cleanup(RERR_SYNTAX);
576 }
577 am_sender = 1;
578 break;
579
580 case 'P':
581 do_progress = 1;
582 keep_partial = 1;
583 break;
584
585 case OPT_WRITE_BATCH:
586 /* popt stores the filename in batch_prefix for us */
587 write_batch = 1;
588 break;
589
590 case OPT_READ_BATCH:
591 /* popt stores the filename in batch_prefix for us */
592 read_batch = 1;
593 break;
594
595 default:
596 /* FIXME: If --daemon is specified, then errors for later
597 * parameters seem to disappear. */
598 snprintf(err_buf, sizeof(err_buf),
599 "%s%s: %s\n",
600 am_server ? "on remote machine: " : "",
601 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
602 poptStrerror(opt));
603 return 0;
604 }
605 }
606
607 if (write_batch && read_batch) {
608 snprintf(err_buf,sizeof(err_buf),
609 "write-batch and read-batch can not be used together\n");
610 rprintf(FERROR,"ERROR: write-batch and read-batch"
611 " can not be used together\n");
612 return 0;
613 }
614
615 if (do_compression && (write_batch || read_batch)) {
616 snprintf(err_buf,sizeof(err_buf),
617 "compress can not be used with write-batch or read-batch\n");
618 rprintf(FERROR,"ERROR: compress can not be used with"
619 " write-batch or read-batch\n");
620 return 0;
621 }
622
623 *argv = poptGetArgs(pc);
624 if (*argv)
625 *argc = count_args(*argv);
626 else
627 *argc = 0;
628
629 return 1;
630}
631
632
633/**
634 * Construct a filtered list of options to pass through from the
635 * client to the server.
636 *
637 * This involves setting options that will tell the server how to
638 * behave, and also filtering out options that are processed only
639 * locally.
640 **/
641void server_options(char **args,int *argc)
642{
643 int ac = *argc;
644 static char argstr[50];
645 static char bsize[30];
646 static char iotime[30];
647 static char mdelete[30];
648 static char mwindow[30];
649 static char bw[50];
650 /* Leave room for ``--(write|read)-batch='' */
651 static char fext[MAXPATHLEN + 15];
652
653 int i, x;
654
655 if (blocking_io == -1)
656 blocking_io = 0;
657
658 args[ac++] = "--server";
659
660 if (daemon_over_rsh) {
661 args[ac++] = "--daemon";
662 *argc = ac;
663 /* if we're passing --daemon, we're done */
664 return;
665 }
666
667 if (!am_sender)
668 args[ac++] = "--sender";
669
670 x = 1;
671 argstr[0] = '-';
672 for (i=0;i<verbose;i++)
673 argstr[x++] = 'v';
674
675 /* the -q option is intentionally left out */
676 if (make_backups)
677 argstr[x++] = 'b';
678 if (update_only)
679 argstr[x++] = 'u';
680 if (dry_run)
681 argstr[x++] = 'n';
682 if (preserve_links)
683 argstr[x++] = 'l';
684 if (copy_links)
685 argstr[x++] = 'L';
686
687 assert(whole_file == 0 || whole_file == 1);
688 if (whole_file)
689 argstr[x++] = 'W';
690 /* We don't need to send --no-whole-file, because it's the
691 * default for remote transfers, and in any case old versions
692 * of rsync will not understand it. */
693
694 if (preserve_hard_links)
695 argstr[x++] = 'H';
696 if (preserve_uid)
697 argstr[x++] = 'o';
698 if (preserve_gid)
699 argstr[x++] = 'g';
700 if (preserve_devices)
701 argstr[x++] = 'D';
702 if (preserve_times)
703 argstr[x++] = 't';
704 if (preserve_perms)
705 argstr[x++] = 'p';
706 if (recurse)
707 argstr[x++] = 'r';
708 if (always_checksum)
709 argstr[x++] = 'c';
710 if (cvs_exclude)
711 argstr[x++] = 'C';
712 if (ignore_times)
713 argstr[x++] = 'I';
714 if (relative_paths)
715 argstr[x++] = 'R';
716 if (one_file_system)
717 argstr[x++] = 'x';
718 if (sparse_files)
719 argstr[x++] = 'S';
720 if (do_compression)
721 argstr[x++] = 'z';
722
723 /* this is a complete hack - blame Rusty
724
725 this is a hack to make the list_only (remote file list)
726 more useful */
727 if (list_only && !recurse)
728 argstr[x++] = 'r';
729
730 argstr[x] = 0;
731
732 if (x != 1) args[ac++] = argstr;
733
734 if (block_size != BLOCK_SIZE) {
735 snprintf(bsize,sizeof(bsize),"-B%d",block_size);
736 args[ac++] = bsize;
737 }
738
739 if (max_delete && am_sender) {
740 snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
741 args[ac++] = mdelete;
742 }
743
744 if (batch_prefix != NULL) {
745 char *fmt = "";
746 if (write_batch)
747 fmt = "--write-batch=%s";
748 else
749 if (read_batch)
750 fmt = "--read-batch=%s";
751 snprintf(fext,sizeof(fext),fmt,batch_prefix);
752 args[ac++] = fext;
753 }
754
755 if (io_timeout) {
756 snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);
757 args[ac++] = iotime;
758 }
759
760 if (bwlimit) {
761 snprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit);
762 args[ac++] = bw;
763 }
764
765 if (strcmp(backup_suffix, BACKUP_SUFFIX)) {
766 args[ac++] = "--suffix";
767 args[ac++] = backup_suffix;
768 }
769
770 if (delete_mode && !delete_excluded)
771 args[ac++] = "--delete";
772
773 if (delete_excluded)
774 args[ac++] = "--delete-excluded";
775
776 if (size_only)
777 args[ac++] = "--size-only";
778
779 if (modify_window_set) {
780 snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
781 modify_window);
782 args[ac++] = mwindow;
783 }
784
785 if (keep_partial)
786 args[ac++] = "--partial";
787
788 if (force_delete)
789 args[ac++] = "--force";
790
791 if (delete_after)
792 args[ac++] = "--delete-after";
793
794 if (ignore_errors)
795 args[ac++] = "--ignore-errors";
796
797 if (copy_unsafe_links)
798 args[ac++] = "--copy-unsafe-links";
799
800 if (safe_symlinks)
801 args[ac++] = "--safe-links";
802
803 if (numeric_ids)
804 args[ac++] = "--numeric-ids";
805
806 if (only_existing && am_sender)
807 args[ac++] = "--existing";
808
809 if (opt_ignore_existing && am_sender)
810 args[ac++] = "--ignore-existing";
811
812 if (tmpdir) {
813 args[ac++] = "--temp-dir";
814 args[ac++] = tmpdir;
815 }
816
817 if (backup_dir && am_sender) {
818 /* only the receiver needs this option, if we are the sender
819 * then we need to send it to the receiver.
820 */
821 args[ac++] = "--backup-dir";
822 args[ac++] = backup_dir;
823 }
824
825 if (compare_dest && am_sender) {
826 /* the server only needs this option if it is not the sender,
827 * and it may be an older version that doesn't know this
828 * option, so don't send it if client is the sender.
829 */
830 args[ac++] = "--compare-dest";
831 args[ac++] = compare_dest;
832 }
833
834 *argc = ac;
835}
836