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