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