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