Handle the new server-daemon via remote-shell mode.
[rsync/rsync.git] / options.c
CommitLineData
7a24c346 1/* -*- c-file-style: "linux" -*-
dafe63ca
MP
2 *
3 * Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
4 * Copyright (C) 2000, 2001, 2002 by Martin Pool <mbp@samba.org>
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 */
7a6421fa 20
7a6421fa 21#include "rsync.h"
2855f61f 22#include "popt.h"
7a6421fa
AT
23
24int make_backups = 0;
1bfbf40b
MP
25
26/**
dafe63ca
MP
27 * If True, send the whole file as literal data rather than trying to
28 * create an incremental diff.
1bfbf40b 29 *
bceec82f
MP
30 * If both are 0, then look at whether we're local or remote and go by
31 * that.
dafe63ca
MP
32 *
33 * @sa disable_deltas_p()
1bfbf40b 34 **/
bceec82f
MP
35int whole_file = 0;
36int no_whole_file = 0;
1bfbf40b 37
7a6421fa
AT
38int copy_links = 0;
39int preserve_links = 0;
40int preserve_hard_links = 0;
41int preserve_perms = 0;
42int preserve_devices = 0;
43int preserve_uid = 0;
44int preserve_gid = 0;
45int preserve_times = 0;
46int update_only = 0;
47int cvs_exclude = 0;
48int dry_run=0;
49int local_server=0;
50int ignore_times=0;
51int delete_mode=0;
b33b791e 52int delete_excluded=0;
7a6421fa
AT
53int one_file_system=0;
54int remote_version=0;
55int sparse_files=0;
56int do_compression=0;
57int am_root=0;
58int orig_umask=0;
59int relative_paths=0;
60int numeric_ids = 0;
61int force_delete = 0;
62int io_timeout = 0;
63int io_error = 0;
64int read_only = 0;
65int module_id = -1;
66int am_server = 0;
30ce7e8a 67int am_sender = 0;
7a6421fa
AT
68int recurse = 0;
69int am_daemon=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;
5b56cc19
AT
83#ifdef _WIN32
84int modify_window=2;
85#else
86int modify_window=0;
87#endif
93689aa5 88int blocking_io=-1;
7a6421fa 89
b35d0d8e 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;
759ac870 105int suffix_specified = 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);
54170a08 234 rprintf(F," -e, --rsh=COMMAND specify the remote shell\n");
704f908e
AT
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 299 {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
759ac870 300 {"suffix", 0, POPT_ARG_STRING, &backup_suffix, OPT_SUFFIX, 0, 0 },
8b54f004
MP
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 },
1de50993 310 {"delete-after", 0, POPT_ARG_NONE, 0, OPT_DELETE_AFTER, 0, 0 },
8b54f004
MP
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
dafe63ca
MP
380/**
381 * Store the option error message, if any, so that we can log the
382 * connection attempt (which requires parsing the options), and then
383 * show the error later on.
384 **/
cd8185f2
AT
385void option_error(void)
386{
387 if (err_buf[0]) {
2855f61f
MP
388 rprintf(FLOG, "%s", err_buf);
389 rprintf(FERROR, "%s: %s", RSYNC_NAME, err_buf);
cd8185f2 390 } else {
add7e8fb
MP
391 rprintf (FERROR, "Error parsing options: "
392 "option may be supported on client but not on server?\n");
393 rprintf (FERROR, RSYNC_NAME ": Error parsing options: "
394 "option may be supported on client but not on server?\n");
cd8185f2 395 }
cd8185f2
AT
396}
397
dafe63ca
MP
398
399/**
400 * Check to see if we should refuse this option
401 **/
cd8185f2
AT
402static int check_refuse_options(char *ref, int opt)
403{
404 int i, len;
405 char *p;
406 const char *name;
407
2855f61f 408 for (i=0; long_options[i].longName; i++) {
cd8185f2
AT
409 if (long_options[i].val == opt) break;
410 }
411
2855f61f 412 if (!long_options[i].longName) return 0;
cd8185f2 413
2855f61f 414 name = long_options[i].longName;
cd8185f2
AT
415 len = strlen(name);
416
417 while ((p = strstr(ref,name))) {
055af776
AT
418 if ((p==ref || p[-1]==' ') &&
419 (p[len] == ' ' || p[len] == 0)) {
8950ac03 420 snprintf(err_buf,sizeof(err_buf),
cd8185f2
AT
421 "The '%s' option is not supported by this server\n", name);
422 return 1;
423 }
424 ref += len;
425 }
426 return 0;
427}
428
429
2855f61f
MP
430static int count_args(char const **argv)
431{
432 int i = 0;
433
434 while (argv[i] != NULL)
435 i++;
436
437 return i;
438}
439
440
dafe63ca
MP
441/**
442 * Process command line arguments. Called on both local and remote.
443 *
444 * @retval 1 if all options are OK; with globals set to appropriate
445 * values
446 *
447 * @retval 0 on error, with err_buf containing an explanation
448 **/
2855f61f 449int parse_arguments(int *argc, const char ***argv, int frommain)
7a6421fa 450{
d853783f 451 int opt;
cd8185f2 452 char *ref = lp_refuse_options(module_id);
2855f61f 453 poptContext pc;
d853783f 454
2855f61f 455 /* TODO: Call poptReadDefaultConfig; handle errors. */
cd8185f2 456
2855f61f
MP
457 /* The context leaks in case of an error, but if there's a
458 * problem we always exit anyhow. */
4db41492 459 pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
2855f61f
MP
460
461 while ((opt = poptGetNextOpt(pc)) != -1) {
cd8185f2
AT
462 if (ref) {
463 if (check_refuse_options(ref, opt)) return 0;
464 }
465
2855f61f
MP
466 /* most options are handled automatically by popt;
467 * only special cases are returned and listed here. */
468
d853783f
AT
469 switch (opt) {
470 case OPT_VERSION:
2855f61f 471 print_rsync_version(FINFO);
d853783f
AT
472 exit_cleanup(0);
473
759ac870
DD
474 case OPT_SUFFIX:
475 /* The value has already been set by popt, but
476 * we need to remember that a suffix was specified
477 * in case a backup-directory is used. */
478 suffix_specified = 1;
479 break;
480
5b56cc19 481 case OPT_MODIFY_WINDOW:
2855f61f
MP
482 /* The value has already been set by popt, but
483 * we need to remember that we're using a
484 * non-default setting. */
5b56cc19
AT
485 modify_window_set = 1;
486 break;
1de50993
WD
487
488 case OPT_DELETE_AFTER:
489 delete_after = 1;
490 delete_mode = 1;
491 break;
492
b33b791e
DD
493 case OPT_DELETE_EXCLUDED:
494 delete_excluded = 1;
495 delete_mode = 1;
496 break;
497
d853783f 498 case OPT_EXCLUDE:
2855f61f 499 add_exclude(poptGetOptArg(pc), 0);
d853783f
AT
500 break;
501
502 case OPT_INCLUDE:
2855f61f 503 add_exclude(poptGetOptArg(pc), 1);
d853783f
AT
504 break;
505
506 case OPT_EXCLUDE_FROM:
2855f61f 507 add_exclude_file(poptGetOptArg(pc), 1, 0);
d853783f
AT
508 break;
509
93695764
DD
510 case OPT_INCLUDE_FROM:
511 add_exclude_file(poptGetOptArg(pc), 1, 1);
512 break;
513
b8709f50
DD
514 case OPT_WHOLE_FILE:
515 whole_file = 1;
516 no_whole_file = 0;
517 break;
518
519 case OPT_NO_WHOLE_FILE:
520 no_whole_file = 1;
521 whole_file = 0;
522 break;
523
93689aa5
DD
524 case OPT_NO_BLOCKING_IO:
525 blocking_io = 0;
d853783f
AT
526 break;
527
528 case 'h':
529 usage(FINFO);
530 exit_cleanup(0);
531
d853783f 532 case 'H':
7a6421fa 533#if SUPPORT_HARD_LINKS
d853783f 534 preserve_hard_links=1;
2855f61f
MP
535#else
536 /* FIXME: Don't say "server" if this is
537 * happening on the client. */
538 /* FIXME: Why do we have the duplicated
539 * rprintf? Everybody who gets this message
540 * ought to send it to the client and also to
541 * the logs. */
8950ac03 542 snprintf(err_buf,sizeof(err_buf),
2855f61f
MP
543 "hard links are not supported on this %s\n",
544 am_server ? "server" : "client");
d853783f 545 rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
b11ed3b1 546 return 0;
2855f61f 547#endif /* SUPPORT_HARD_LINKS */
d853783f 548 break;
7a6421fa 549
d853783f
AT
550 case 'v':
551 verbose++;
552 break;
7a6421fa 553
b86f0cef
DD
554 case 'q':
555 if (frommain) quiet++;
556 break;
557
d853783f
AT
558 case 'a':
559 recurse=1;
7a6421fa 560#if SUPPORT_LINKS
d853783f 561 preserve_links=1;
7a6421fa 562#endif
d853783f
AT
563 preserve_perms=1;
564 preserve_times=1;
565 preserve_gid=1;
e20c5e95
AT
566 preserve_uid=1;
567 preserve_devices=1;
d853783f
AT
568 break;
569
d853783f
AT
570 case OPT_SENDER:
571 if (!am_server) {
572 usage(FERROR);
65417579 573 exit_cleanup(RERR_SYNTAX);
d853783f
AT
574 }
575 am_sender = 1;
576 break;
577
d9fcc198
AT
578 case 'P':
579 do_progress = 1;
580 keep_partial = 1;
581 break;
582
088aac85
DD
583 case OPT_WRITE_BATCH:
584 /* popt stores the filename in batch_prefix for us */
585 write_batch = 1;
586 break;
587
76f79ba7 588 case OPT_READ_BATCH:
088aac85 589 /* popt stores the filename in batch_prefix for us */
6902ed17
MP
590 read_batch = 1;
591 break;
592
d853783f 593 default:
2855f61f
MP
594 /* FIXME: If --daemon is specified, then errors for later
595 * parameters seem to disappear. */
8950ac03 596 snprintf(err_buf, sizeof(err_buf),
2855f61f
MP
597 "%s%s: %s\n",
598 am_server ? "on remote machine: " : "",
599 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
600 poptStrerror(opt));
601 return 0;
d853783f 602 }
7a6421fa 603 }
2855f61f 604
088aac85
DD
605 if (write_batch && read_batch) {
606 snprintf(err_buf,sizeof(err_buf),
607 "write-batch and read-batch can not be used together\n");
608 rprintf(FERROR,"ERROR: write-batch and read-batch"
609 " can not be used together\n");
610 return 0;
611 }
612
613 if (do_compression && (write_batch || read_batch)) {
614 snprintf(err_buf,sizeof(err_buf),
615 "compress can not be used with write-batch or read-batch\n");
616 rprintf(FERROR,"ERROR: compress can not be used with"
617 " write-batch or read-batch\n");
618 return 0;
619 }
620
2855f61f
MP
621 *argv = poptGetArgs(pc);
622 if (*argv)
623 *argc = count_args(*argv);
624 else
625 *argc = 0;
626
b11ed3b1 627 return 1;
7a6421fa
AT
628}
629
630
dafe63ca
MP
631/**
632 * Construct a filtered list of options to pass through from the
633 * client to the server.
634 *
635 * This involves setting options that will tell the server how to
636 * behave, and also filtering out options that are processed only
637 * locally.
638 **/
7a6421fa
AT
639void server_options(char **args,int *argc)
640{
d853783f
AT
641 int ac = *argc;
642 static char argstr[50];
643 static char bsize[30];
644 static char iotime[30];
0b73ca12 645 static char mdelete[30];
5b56cc19 646 static char mwindow[30];
ef5d23eb 647 static char bw[50];
088aac85
DD
648 /* Leave room for ``--(write|read)-batch='' */
649 static char fext[MAXPATHLEN + 15];
ef5d23eb 650
d853783f
AT
651 int i, x;
652
93689aa5
DD
653 if (blocking_io == -1)
654 blocking_io = 0;
655
d853783f
AT
656 args[ac++] = "--server";
657
658 if (!am_sender)
659 args[ac++] = "--sender";
660
661 x = 1;
662 argstr[0] = '-';
663 for (i=0;i<verbose;i++)
664 argstr[x++] = 'v';
f0b36a48 665
b86f0cef 666 /* the -q option is intentionally left out */
d853783f
AT
667 if (make_backups)
668 argstr[x++] = 'b';
669 if (update_only)
670 argstr[x++] = 'u';
671 if (dry_run)
672 argstr[x++] = 'n';
673 if (preserve_links)
674 argstr[x++] = 'l';
675 if (copy_links)
676 argstr[x++] = 'L';
1bfbf40b 677
8469faef 678 assert(whole_file == 0 || whole_file == 1);
d853783f
AT
679 if (whole_file)
680 argstr[x++] = 'W';
bceec82f
MP
681 /* We don't need to send --no-whole-file, because it's the
682 * default for remote transfers, and in any case old versions
683 * of rsync will not understand it. */
1bfbf40b 684
d853783f
AT
685 if (preserve_hard_links)
686 argstr[x++] = 'H';
687 if (preserve_uid)
688 argstr[x++] = 'o';
689 if (preserve_gid)
690 argstr[x++] = 'g';
691 if (preserve_devices)
692 argstr[x++] = 'D';
693 if (preserve_times)
694 argstr[x++] = 't';
695 if (preserve_perms)
696 argstr[x++] = 'p';
697 if (recurse)
698 argstr[x++] = 'r';
699 if (always_checksum)
700 argstr[x++] = 'c';
701 if (cvs_exclude)
702 argstr[x++] = 'C';
703 if (ignore_times)
704 argstr[x++] = 'I';
705 if (relative_paths)
706 argstr[x++] = 'R';
707 if (one_file_system)
708 argstr[x++] = 'x';
709 if (sparse_files)
710 argstr[x++] = 'S';
711 if (do_compression)
712 argstr[x++] = 'z';
f0b36a48
AT
713
714 /* this is a complete hack - blame Rusty
715
716 this is a hack to make the list_only (remote file list)
717 more useful */
718 if (list_only && !recurse)
719 argstr[x++] = 'r';
720
d853783f
AT
721 argstr[x] = 0;
722
723 if (x != 1) args[ac++] = argstr;
724
725 if (block_size != BLOCK_SIZE) {
8950ac03 726 snprintf(bsize,sizeof(bsize),"-B%d",block_size);
d853783f
AT
727 args[ac++] = bsize;
728 }
729
0b73ca12 730 if (max_delete && am_sender) {
8950ac03 731 snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
0b73ca12
AT
732 args[ac++] = mdelete;
733 }
6902ed17 734
088aac85
DD
735 if (batch_prefix != NULL) {
736 char *fmt = "";
737 if (write_batch)
738 fmt = "--write-batch=%s";
739 else
740 if (read_batch)
741 fmt = "--read-batch=%s";
742 snprintf(fext,sizeof(fext),fmt,batch_prefix);
6902ed17
MP
743 args[ac++] = fext;
744 }
0b73ca12 745
d853783f 746 if (io_timeout) {
8950ac03 747 snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);
d853783f
AT
748 args[ac++] = iotime;
749 }
750
ef5d23eb 751 if (bwlimit) {
8950ac03 752 snprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit);
ef5d23eb
DD
753 args[ac++] = bw;
754 }
755
d853783f
AT
756 if (strcmp(backup_suffix, BACKUP_SUFFIX)) {
757 args[ac++] = "--suffix";
758 args[ac++] = backup_suffix;
759 }
760
b33b791e 761 if (delete_mode && !delete_excluded)
d853783f
AT
762 args[ac++] = "--delete";
763
b33b791e
DD
764 if (delete_excluded)
765 args[ac++] = "--delete-excluded";
766
f83f0548
AT
767 if (size_only)
768 args[ac++] = "--size-only";
769
5b56cc19 770 if (modify_window_set) {
8950ac03 771 snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
5b56cc19
AT
772 modify_window);
773 args[ac++] = mwindow;
774 }
775
d853783f
AT
776 if (keep_partial)
777 args[ac++] = "--partial";
778
779 if (force_delete)
780 args[ac++] = "--force";
781
57df171b
AT
782 if (delete_after)
783 args[ac++] = "--delete-after";
784
ef55c686
AT
785 if (ignore_errors)
786 args[ac++] = "--ignore-errors";
787
b5313607
DD
788 if (copy_unsafe_links)
789 args[ac++] = "--copy-unsafe-links";
790
d853783f
AT
791 if (safe_symlinks)
792 args[ac++] = "--safe-links";
793
794 if (numeric_ids)
795 args[ac++] = "--numeric-ids";
796
0b73ca12 797 if (only_existing && am_sender)
1347d512
AT
798 args[ac++] = "--existing";
799
3d6feada
MP
800 if (opt_ignore_existing && am_sender)
801 args[ac++] = "--ignore-existing";
802
d853783f
AT
803 if (tmpdir) {
804 args[ac++] = "--temp-dir";
805 args[ac++] = tmpdir;
806 }
807
66203a98
AT
808 if (backup_dir && am_sender) {
809 /* only the receiver needs this option, if we are the sender
810 * then we need to send it to the receiver.
811 */
812 args[ac++] = "--backup-dir";
813 args[ac++] = backup_dir;
814 }
815
375a4556
DD
816 if (compare_dest && am_sender) {
817 /* the server only needs this option if it is not the sender,
818 * and it may be an older version that doesn't know this
819 * option, so don't send it if client is the sender.
820 */
821 args[ac++] = "--compare-dest";
822 args[ac++] = compare_dest;
823 }
824
d853783f 825 *argc = ac;
7a6421fa
AT
826}
827