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