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