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