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