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