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