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