Modifications to handle the new server_exclude_list, and to use the
[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=0;
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," --link-dest=DIR create hardlinks to DIR for unchanged files\n");
258 rprintf(F," -P equivalent to --partial --progress\n");
259 rprintf(F," -z, --compress compress file data\n");
260 rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
261 rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n");
262 rprintf(F," --exclude-from=FILE exclude patterns listed in FILE\n");
263 rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
264 rprintf(F," --include-from=FILE don't exclude patterns listed in FILE\n");
265 rprintf(F," --files-from=FILE read FILE for list of source-file names\n");
266 rprintf(F," -0 --from0 file names we read are separated by nulls, not newlines\n");
267 rprintf(F," --version print version number\n");
268 rprintf(F," --daemon run as a rsync daemon\n");
269 rprintf(F," --no-detach do not detach from the parent\n");
270 rprintf(F," --address=ADDRESS bind to the specified address\n");
271 rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
272 rprintf(F," --port=PORT specify alternate rsyncd port number\n");
273 rprintf(F," --blocking-io use blocking IO for the remote shell\n");
274 rprintf(F," --no-blocking-io turn off --blocking-io\n");
275 rprintf(F," --stats give some file transfer stats\n");
276 rprintf(F," --progress show progress during transfer\n");
277 rprintf(F," --log-format=FORMAT log file transfers using specified format\n");
278 rprintf(F," --password-file=FILE get password from FILE\n");
279 rprintf(F," --bwlimit=KBPS limit I/O bandwidth, KBytes per second\n");
280 rprintf(F," --write-batch=PREFIX write batch fileset starting with PREFIX\n");
281 rprintf(F," --read-batch=PREFIX read batch fileset starting with PREFIX\n");
282 rprintf(F," -h, --help show this help screen\n");
283#ifdef INET6
284 rprintf(F," -4 prefer IPv4\n");
285 rprintf(F," -6 prefer IPv6\n");
286#endif
287
288 rprintf(F,"\n");
289
290 rprintf(F,"\nPlease see the rsync(1) and rsyncd.conf(5) man pages for full documentation\n");
291 rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and answers\n");
292}
293
294enum {OPT_VERSION = 1000, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
295 OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
296 OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
297 OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
298 OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LINK_DEST,
299 OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
300 OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
301 OPT_IGNORE_ERRORS, OPT_BWLIMIT,
302 OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_IGNORE_EXISTING};
303
304static struct poptOption long_options[] = {
305 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
306 {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
307 {"suffix", 0, POPT_ARG_STRING, &backup_suffix, OPT_SUFFIX, 0, 0 },
308 {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
309 {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
310 {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
311 {"size-only", 0, POPT_ARG_NONE, &size_only, 0, 0, 0 },
312 {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
313 {"one-file-system", 'x', POPT_ARG_NONE, &one_file_system, 0, 0, 0 },
314 {"delete", 0, POPT_ARG_NONE, &delete_mode, 0, 0, 0 },
315 {"existing", 0, POPT_ARG_NONE, &only_existing, 0, 0, 0 },
316 {"ignore-existing", 0, POPT_ARG_NONE, &opt_ignore_existing, 0, 0, 0 },
317 {"delete-after", 0, POPT_ARG_NONE, 0, OPT_DELETE_AFTER, 0, 0 },
318 {"delete-excluded", 0, POPT_ARG_NONE, 0, OPT_DELETE_EXCLUDED, 0, 0 },
319 {"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 },
320 {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
321 {"exclude", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE, 0, 0 },
322 {"include", 0, POPT_ARG_STRING, 0, OPT_INCLUDE, 0, 0 },
323 {"exclude-from", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE_FROM, 0, 0 },
324 {"include-from", 0, POPT_ARG_STRING, 0, OPT_INCLUDE_FROM, 0, 0 },
325 {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 },
326 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
327 {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
328 {"dry-run", 'n', POPT_ARG_NONE, &dry_run, 0, 0, 0 },
329 {"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 },
330 {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 },
331 {"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 },
332 {"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 },
333 {"copy-links", 'L', POPT_ARG_NONE, &copy_links, 0, 0, 0 },
334 {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 },
335 {"no-whole-file", 0, POPT_ARG_VAL, &whole_file, 0, 0, 0 },
336 {"copy-unsafe-links", 0, POPT_ARG_NONE, &copy_unsafe_links, 0, 0, 0 },
337 {"perms", 'p', POPT_ARG_NONE, &preserve_perms, 0, 0, 0 },
338 {"owner", 'o', POPT_ARG_NONE, &preserve_uid, 0, 0, 0 },
339 {"group", 'g', POPT_ARG_NONE, &preserve_gid, 0, 0, 0 },
340 {"devices", 'D', POPT_ARG_NONE, &preserve_devices, 0, 0, 0 },
341 {"times", 't', POPT_ARG_NONE, &preserve_times, 0, 0, 0 },
342 {"checksum", 'c', POPT_ARG_NONE, &always_checksum, 0, 0, 0 },
343 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
344 {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
345 {"archive", 'a', POPT_ARG_NONE, &archive_mode, 0, 0, 0 },
346 {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
347 {"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
348 {"recursive", 'r', POPT_ARG_NONE, &recurse, 0, 0, 0 },
349 {"relative", 'R', POPT_ARG_VAL, &relative_paths, 1, 0, 0 },
350 {"no-relative", 0, POPT_ARG_VAL, &relative_paths, 0, 0, 0 },
351 {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
352 {"block-size", 'B', POPT_ARG_INT, &block_size, 0, 0, 0 },
353 {"max-delete", 0, POPT_ARG_INT, &max_delete, 0, 0, 0 },
354 {"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
355 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
356 {"compare-dest", 0, POPT_ARG_STRING, &compare_dest, 0, 0, 0 },
357 {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
358 /* TODO: Should this take an optional int giving the compression level? */
359 {"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 },
360 {"daemon", 0, POPT_ARG_NONE, &am_daemon, 0, 0, 0 },
361 {"no-detach", 0, POPT_ARG_NONE, &no_detach, 0, 0, 0 },
362 {"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
363 {"progress", 0, POPT_ARG_NONE, &do_progress, 0, 0, 0 },
364 {"partial", 0, POPT_ARG_NONE, &keep_partial, 0, 0, 0 },
365 {"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors, 0, 0, 0 },
366 {"blocking-io", 0, POPT_ARG_VAL, &blocking_io, 1, 0, 0 },
367 {"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 },
368 {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
369 {"config", 0, POPT_ARG_STRING, &config_file, 0, 0, 0 },
370 {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
371 {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
372 {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
373 {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
374 {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
375 {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
376 {"read-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_READ_BATCH, 0, 0 },
377 {"write-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_WRITE_BATCH, 0, 0 },
378 {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
379 {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
380 {"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 },
381#ifdef INET6
382 {0, '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
383 {0, '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
384#endif
385 {0,0,0,0, 0, 0, 0}
386};
387
388
389static char err_buf[100];
390
391
392/**
393 * Store the option error message, if any, so that we can log the
394 * connection attempt (which requires parsing the options), and then
395 * show the error later on.
396 **/
397void option_error(void)
398{
399 if (err_buf[0]) {
400 rprintf(FLOG, "%s", err_buf);
401 rprintf(FERROR, "%s: %s", RSYNC_NAME, err_buf);
402 } else {
403 rprintf (FERROR, "Error parsing options: "
404 "option may be supported on client but not on server?\n");
405 rprintf (FERROR, RSYNC_NAME ": Error parsing options: "
406 "option may be supported on client but not on server?\n");
407 }
408}
409
410
411/**
412 * Check to see if we should refuse this option
413 **/
414static int check_refuse_options(char *ref, int opt)
415{
416 int i, len;
417 char *p;
418 const char *name;
419
420 for (i=0; long_options[i].longName; i++) {
421 if (long_options[i].val == opt) break;
422 }
423
424 if (!long_options[i].longName) return 0;
425
426 name = long_options[i].longName;
427 len = strlen(name);
428
429 while ((p = strstr(ref,name))) {
430 if ((p==ref || p[-1]==' ') &&
431 (p[len] == ' ' || p[len] == 0)) {
432 snprintf(err_buf,sizeof(err_buf),
433 "The '%s' option is not supported by this server\n", name);
434 return 1;
435 }
436 ref += len;
437 }
438 return 0;
439}
440
441
442static int count_args(char const **argv)
443{
444 int i = 0;
445
446 while (argv[i] != NULL)
447 i++;
448
449 return i;
450}
451
452
453/**
454 * Process command line arguments. Called on both local and remote.
455 *
456 * @retval 1 if all options are OK; with globals set to appropriate
457 * values
458 *
459 * @retval 0 on error, with err_buf containing an explanation
460 **/
461int parse_arguments(int *argc, const char ***argv, int frommain)
462{
463 int opt;
464 char *ref = lp_refuse_options(module_id);
465 poptContext pc;
466
467 /* TODO: Call poptReadDefaultConfig; handle errors. */
468
469 /* The context leaks in case of an error, but if there's a
470 * problem we always exit anyhow. */
471 pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
472
473 while ((opt = poptGetNextOpt(pc)) != -1) {
474 if (ref) {
475 if (check_refuse_options(ref, opt)) return 0;
476 }
477
478 /* most options are handled automatically by popt;
479 * only special cases are returned and listed here. */
480
481 switch (opt) {
482 case OPT_VERSION:
483 print_rsync_version(FINFO);
484 exit_cleanup(0);
485
486 case OPT_SUFFIX:
487 /* The value has already been set by popt, but
488 * we need to remember that a suffix was specified
489 * in case a backup-directory is used. */
490 suffix_specified = 1;
491 break;
492
493 case OPT_MODIFY_WINDOW:
494 /* The value has already been set by popt, but
495 * we need to remember that we're using a
496 * non-default setting. */
497 modify_window_set = 1;
498 break;
499
500 case OPT_DELETE_AFTER:
501 delete_after = 1;
502 delete_mode = 1;
503 break;
504
505 case OPT_DELETE_EXCLUDED:
506 delete_excluded = 1;
507 delete_mode = 1;
508 break;
509
510 case OPT_EXCLUDE:
511 add_exclude(poptGetOptArg(pc), 0);
512 break;
513
514 case OPT_INCLUDE:
515 add_exclude(poptGetOptArg(pc), 1);
516 break;
517
518 case OPT_EXCLUDE_FROM:
519 add_exclude_file(poptGetOptArg(pc), 1, 0);
520 break;
521
522 case OPT_INCLUDE_FROM:
523 add_exclude_file(poptGetOptArg(pc), 1, 1);
524 break;
525
526 case 'h':
527 usage(FINFO);
528 exit_cleanup(0);
529
530 case 'H':
531#if SUPPORT_HARD_LINKS
532 preserve_hard_links=1;
533#else
534 /* FIXME: Don't say "server" if this is
535 * happening on the client. */
536 /* FIXME: Why do we have the duplicated
537 * rprintf? Everybody who gets this message
538 * ought to send it to the client and also to
539 * the logs. */
540 snprintf(err_buf,sizeof(err_buf),
541 "hard links are not supported on this %s\n",
542 am_server ? "server" : "client");
543 rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
544 return 0;
545#endif /* SUPPORT_HARD_LINKS */
546 break;
547
548 case 'v':
549 verbose++;
550 break;
551
552 case 'q':
553 if (frommain) quiet++;
554 break;
555
556 case OPT_SENDER:
557 if (!am_server) {
558 usage(FERROR);
559 exit_cleanup(RERR_SYNTAX);
560 }
561 am_sender = 1;
562 break;
563
564 case 'P':
565 do_progress = 1;
566 keep_partial = 1;
567 break;
568
569 case OPT_WRITE_BATCH:
570 /* popt stores the filename in batch_prefix for us */
571 write_batch = 1;
572 break;
573
574 case OPT_READ_BATCH:
575 /* popt stores the filename in batch_prefix for us */
576 read_batch = 1;
577 break;
578
579 case OPT_LINK_DEST:
580#if HAVE_LINK
581 compare_dest = (char *)poptGetOptArg(pc);
582 link_dest = 1;
583 break;
584#else
585 snprintf(err_buf,sizeof(err_buf),
586 "hard links are not supported on this %s\n",
587 am_server ? "server" : "client");
588 rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
589 return 0;
590#endif
591
592
593 default:
594 /* FIXME: If --daemon is specified, then errors for later
595 * parameters seem to disappear. */
596 snprintf(err_buf, sizeof(err_buf),
597 "%s%s: %s\n",
598 am_server ? "on remote machine: " : "",
599 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
600 poptStrerror(opt));
601 return 0;
602 }
603 }
604
605 if (write_batch && read_batch) {
606 snprintf(err_buf,sizeof(err_buf),
607 "write-batch and read-batch can not be used together\n");
608 rprintf(FERROR,"ERROR: write-batch and read-batch"
609 " can not be used together\n");
610 return 0;
611 }
612
613 if (do_compression && (write_batch || read_batch)) {
614 snprintf(err_buf,sizeof(err_buf),
615 "compress can not be used with write-batch or read-batch\n");
616 rprintf(FERROR,"ERROR: compress can not be used with"
617 " write-batch or read-batch\n");
618 return 0;
619 }
620
621 if (archive_mode) {
622 if (!files_from)
623 recurse = 1;
624#if SUPPORT_LINKS
625 preserve_links = 1;
626#endif
627 preserve_perms = 1;
628 preserve_times = 1;
629 preserve_gid = 1;
630 preserve_uid = 1;
631 preserve_devices = 1;
632 }
633
634 if (relative_paths < 0)
635 relative_paths = files_from? 1 : 0;
636
637 *argv = poptGetArgs(pc);
638 if (*argv)
639 *argc = count_args(*argv);
640 else
641 *argc = 0;
642
643 if (files_from) {
644 char *colon;
645 if (*argc != 2) {
646 usage(FERROR);
647 exit_cleanup(RERR_SYNTAX);
648 }
649 if (strcmp(files_from, "-") == 0)
650 filesfrom_fd = 0;
651 else if ((colon = find_colon(files_from)) != 0) {
652 if (am_server) {
653 usage(FERROR);
654 exit_cleanup(RERR_SYNTAX);
655 }
656 remote_filesfrom_file = colon+1 + (colon[1] == ':');
657 if (strcmp(remote_filesfrom_file, "-") == 0) {
658 rprintf(FERROR, "Invalid --files-from remote filename\n");
659 exit_cleanup(RERR_SYNTAX);
660 }
661 } else {
662 extern int sanitize_paths;
663 if (sanitize_paths)
664 sanitize_path(strdup(files_from), NULL);
665 filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);
666 if (filesfrom_fd < 0) {
667 rsyserr(FERROR, errno,
668 "failed to open files-from file %s",
669 files_from);
670 exit_cleanup(RERR_FILEIO);
671 }
672 }
673 }
674
675 return 1;
676}
677
678
679/**
680 * Construct a filtered list of options to pass through from the
681 * client to the server.
682 *
683 * This involves setting options that will tell the server how to
684 * behave, and also filtering out options that are processed only
685 * locally.
686 **/
687void server_options(char **args,int *argc)
688{
689 int ac = *argc;
690 static char argstr[50];
691 static char bsize[30];
692 static char iotime[30];
693 static char mdelete[30];
694 static char mwindow[30];
695 static char bw[50];
696 /* Leave room for ``--(write|read)-batch='' */
697 static char fext[MAXPATHLEN + 15];
698
699 int i, x;
700
701 if (blocking_io == -1)
702 blocking_io = 0;
703
704 args[ac++] = "--server";
705
706 if (daemon_over_rsh) {
707 args[ac++] = "--daemon";
708 *argc = ac;
709 /* if we're passing --daemon, we're done */
710 return;
711 }
712
713 if (!am_sender)
714 args[ac++] = "--sender";
715
716 x = 1;
717 argstr[0] = '-';
718 for (i=0;i<verbose;i++)
719 argstr[x++] = 'v';
720
721 /* the -q option is intentionally left out */
722 if (make_backups)
723 argstr[x++] = 'b';
724 if (update_only)
725 argstr[x++] = 'u';
726 if (dry_run)
727 argstr[x++] = 'n';
728 if (preserve_links)
729 argstr[x++] = 'l';
730 if (copy_links)
731 argstr[x++] = 'L';
732
733 if (whole_file > 0)
734 argstr[x++] = 'W';
735 /* We don't need to send --no-whole-file, because it's the
736 * default for remote transfers, and in any case old versions
737 * of rsync will not understand it. */
738
739 if (preserve_hard_links)
740 argstr[x++] = 'H';
741 if (preserve_uid)
742 argstr[x++] = 'o';
743 if (preserve_gid)
744 argstr[x++] = 'g';
745 if (preserve_devices)
746 argstr[x++] = 'D';
747 if (preserve_times)
748 argstr[x++] = 't';
749 if (preserve_perms)
750 argstr[x++] = 'p';
751 if (recurse)
752 argstr[x++] = 'r';
753 if (always_checksum)
754 argstr[x++] = 'c';
755 if (cvs_exclude)
756 argstr[x++] = 'C';
757 if (ignore_times)
758 argstr[x++] = 'I';
759 if (relative_paths)
760 argstr[x++] = 'R';
761 if (one_file_system)
762 argstr[x++] = 'x';
763 if (sparse_files)
764 argstr[x++] = 'S';
765 if (do_compression)
766 argstr[x++] = 'z';
767
768 /* this is a complete hack - blame Rusty
769
770 this is a hack to make the list_only (remote file list)
771 more useful */
772 if (list_only && !recurse)
773 argstr[x++] = 'r';
774
775 argstr[x] = 0;
776
777 if (x != 1) args[ac++] = argstr;
778
779 if (block_size) {
780 snprintf(bsize,sizeof(bsize),"-B%d",block_size);
781 args[ac++] = bsize;
782 }
783
784 if (max_delete && am_sender) {
785 snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
786 args[ac++] = mdelete;
787 }
788
789 if (batch_prefix != NULL) {
790 char *fmt = "";
791 if (write_batch)
792 fmt = "--write-batch=%s";
793 else
794 if (read_batch)
795 fmt = "--read-batch=%s";
796 snprintf(fext,sizeof(fext),fmt,batch_prefix);
797 args[ac++] = fext;
798 }
799
800 if (io_timeout) {
801 snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);
802 args[ac++] = iotime;
803 }
804
805 if (bwlimit) {
806 snprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit);
807 args[ac++] = bw;
808 }
809
810 if (strcmp(backup_suffix, BACKUP_SUFFIX)) {
811 args[ac++] = "--suffix";
812 args[ac++] = backup_suffix;
813 }
814
815 if (delete_mode && !delete_excluded)
816 args[ac++] = "--delete";
817
818 if (delete_excluded)
819 args[ac++] = "--delete-excluded";
820
821 if (size_only)
822 args[ac++] = "--size-only";
823
824 if (modify_window_set) {
825 snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
826 modify_window);
827 args[ac++] = mwindow;
828 }
829
830 if (keep_partial)
831 args[ac++] = "--partial";
832
833 if (force_delete)
834 args[ac++] = "--force";
835
836 if (delete_after)
837 args[ac++] = "--delete-after";
838
839 if (ignore_errors)
840 args[ac++] = "--ignore-errors";
841
842 if (copy_unsafe_links)
843 args[ac++] = "--copy-unsafe-links";
844
845 if (safe_symlinks)
846 args[ac++] = "--safe-links";
847
848 if (numeric_ids)
849 args[ac++] = "--numeric-ids";
850
851 if (only_existing && am_sender)
852 args[ac++] = "--existing";
853
854 if (opt_ignore_existing && am_sender)
855 args[ac++] = "--ignore-existing";
856
857 if (tmpdir) {
858 args[ac++] = "--temp-dir";
859 args[ac++] = tmpdir;
860 }
861
862 if (backup_dir && am_sender) {
863 /* only the receiver needs this option, if we are the sender
864 * then we need to send it to the receiver.
865 */
866 args[ac++] = "--backup-dir";
867 args[ac++] = backup_dir;
868 }
869
870 if (compare_dest && am_sender) {
871 /* the server only needs this option if it is not the sender,
872 * and it may be an older version that doesn't know this
873 * option, so don't send it if client is the sender.
874 */
875 args[ac++] = link_dest ? "--link-dest" : "--compare-dest";
876 args[ac++] = compare_dest;
877 }
878
879 if (files_from && (!am_sender || remote_filesfrom_file)) {
880 if (remote_filesfrom_file) {
881 args[ac++] = "--files-from";
882 args[ac++] = remote_filesfrom_file;
883 if (eol_nulls)
884 args[ac++] = "--from0";
885 } else {
886 args[ac++] = "--files-from=-";
887 args[ac++] = "--from0";
888 }
889 }
890
891 *argc = ac;
892}
893
894/**
895 * Return the position of a ':' IF it is not part of a filename (i.e. as
896 * long as it doesn't occur after a slash.
897 */
898char *find_colon(char *s)
899{
900 char *p, *p2;
901
902 p = strchr(s,':');
903 if (!p) return NULL;
904
905 /* now check to see if there is a / in the string before the : - if there is then
906 discard the colon on the assumption that the : is part of a filename */
907 p2 = strchr(s,'/');
908 if (p2 && p2 < p) return NULL;
909
910 return p;
911}
912
913