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