Improved the mkstemp error message.
[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;
d175d7e1
WD
108int backup_dir_len = 0;
109int backup_suffix_len;
6902ed17 110
d175d7e1 111char *backup_suffix = NULL;
7a6421fa 112char *tmpdir = NULL;
375a4556 113char *compare_dest = NULL;
30e8c8e1 114char *config_file = NULL;
7a6421fa 115char *shell_cmd = NULL;
b6062654 116char *log_format = NULL;
65575e96 117char *password_file = NULL;
41bd28fe 118char *rsync_path = RSYNC_PATH;
66203a98 119char *backup_dir = NULL;
7a6421fa 120int rsync_port = RSYNC_PORT;
59c95e42 121int link_dest = 0;
7a6421fa
AT
122
123int verbose = 0;
b86f0cef 124int quiet = 0;
7a6421fa 125int always_checksum = 0;
f7632fc6 126int list_only = 0;
7a6421fa 127
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,
165 "Copyright (C) 1996-2002 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");
9ef53907 222 rprintf(F," -b, --backup make backups (default %s suffix)\n",BACKUP_SUFFIX);
e20c5e95 223 rprintf(F," --backup-dir make backups into this directory\n");
dfa32483 224 rprintf(F," --suffix=SUFFIX override backup suffix\n");
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");
3d6feada 245 rprintf(F," --ignore-existing ignore files that already exist on the 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");
57df171b 248 rprintf(F," --delete-after delete 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");
255 rprintf(F," -I, --ignore-times don't exclude files that match length and time\n");
f83f0548 256 rprintf(F," --size-only only use file size when determining if a file should be transferred\n");
5b56cc19 257 rprintf(F," --modify-window=NUM Timestamp window (seconds) for file match (default=%d)\n",modify_window);
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
WD
268 rprintf(F," --files-from=FILE read FILE for list of source-file names\n");
269 rprintf(F," -0 --from0 file names we read are separated by nulls, not newlines\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
d175d7e1 297enum {OPT_VERSION = 1000, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
b33b791e
DD
298 OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
299 OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
d853783f 300 OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
59c95e42 301 OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LINK_DEST,
57df171b 302 OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
dfa32483 303 OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
afb6e945 304 OPT_IGNORE_ERRORS, OPT_BWLIMIT,
3d6feada 305 OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_IGNORE_EXISTING};
7a6421fa 306
2855f61f
MP
307static struct poptOption long_options[] = {
308 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
dfa32483 309 {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
d175d7e1 310 {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
8b54f004
MP
311 {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
312 {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
afb6e945
WD
313 {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
314 {"size-only", 0, POPT_ARG_NONE, &size_only, 0, 0, 0 },
8b54f004 315 {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
afb6e945
WD
316 {"one-file-system", 'x', POPT_ARG_NONE, &one_file_system, 0, 0, 0 },
317 {"delete", 0, POPT_ARG_NONE, &delete_mode, 0, 0, 0 },
318 {"existing", 0, POPT_ARG_NONE, &only_existing, 0, 0, 0 },
319 {"ignore-existing", 0, POPT_ARG_NONE, &opt_ignore_existing, 0, 0, 0 },
1de50993 320 {"delete-after", 0, POPT_ARG_NONE, 0, OPT_DELETE_AFTER, 0, 0 },
8b54f004 321 {"delete-excluded", 0, POPT_ARG_NONE, 0, OPT_DELETE_EXCLUDED, 0, 0 },
afb6e945
WD
322 {"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 },
323 {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
8b54f004
MP
324 {"exclude", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE, 0, 0 },
325 {"include", 0, POPT_ARG_STRING, 0, OPT_INCLUDE, 0, 0 },
326 {"exclude-from", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE_FROM, 0, 0 },
327 {"include-from", 0, POPT_ARG_STRING, 0, OPT_INCLUDE_FROM, 0, 0 },
afb6e945 328 {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 },
8b54f004 329 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
afb6e945
WD
330 {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
331 {"dry-run", 'n', POPT_ARG_NONE, &dry_run, 0, 0, 0 },
332 {"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 },
333 {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 },
334 {"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 },
335 {"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 },
336 {"copy-links", 'L', POPT_ARG_NONE, &copy_links, 0, 0, 0 },
337 {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 },
338 {"no-whole-file", 0, POPT_ARG_VAL, &whole_file, 0, 0, 0 },
339 {"copy-unsafe-links", 0, POPT_ARG_NONE, &copy_unsafe_links, 0, 0, 0 },
340 {"perms", 'p', POPT_ARG_NONE, &preserve_perms, 0, 0, 0 },
341 {"owner", 'o', POPT_ARG_NONE, &preserve_uid, 0, 0, 0 },
342 {"group", 'g', POPT_ARG_NONE, &preserve_gid, 0, 0, 0 },
343 {"devices", 'D', POPT_ARG_NONE, &preserve_devices, 0, 0, 0 },
344 {"times", 't', POPT_ARG_NONE, &preserve_times, 0, 0, 0 },
345 {"checksum", 'c', POPT_ARG_NONE, &always_checksum, 0, 0, 0 },
8b54f004
MP
346 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
347 {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
dfa32483 348 {"archive", 'a', POPT_ARG_NONE, &archive_mode, 0, 0, 0 },
afb6e945 349 {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
dfa32483 350 {"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
afb6e945 351 {"recursive", 'r', POPT_ARG_NONE, &recurse, 0, 0, 0 },
ea5164d1
WD
352 {"relative", 'R', POPT_ARG_VAL, &relative_paths, 1, 0, 0 },
353 {"no-relative", 0, POPT_ARG_VAL, &relative_paths, 0, 0, 0 },
afb6e945
WD
354 {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
355 {"block-size", 'B', POPT_ARG_INT, &block_size, 0, 0, 0 },
356 {"max-delete", 0, POPT_ARG_INT, &max_delete, 0, 0, 0 },
357 {"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
358 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
359 {"compare-dest", 0, POPT_ARG_STRING, &compare_dest, 0, 0, 0 },
dfa32483 360 {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
2855f61f 361 /* TODO: Should this take an optional int giving the compression level? */
afb6e945
WD
362 {"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 },
363 {"daemon", 0, POPT_ARG_NONE, &am_daemon, 0, 0, 0 },
364 {"no-detach", 0, POPT_ARG_NONE, &no_detach, 0, 0, 0 },
365 {"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
366 {"progress", 0, POPT_ARG_NONE, &do_progress, 0, 0, 0 },
367 {"partial", 0, POPT_ARG_NONE, &keep_partial, 0, 0, 0 },
368 {"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors, 0, 0, 0 },
369 {"blocking-io", 0, POPT_ARG_VAL, &blocking_io, 1, 0, 0 },
370 {"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 },
dfa32483 371 {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
afb6e945
WD
372 {"config", 0, POPT_ARG_STRING, &config_file, 0, 0, 0 },
373 {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
374 {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
375 {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
8b54f004 376 {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
afb6e945
WD
377 {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
378 {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
dfa32483
WD
379 {"read-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_READ_BATCH, 0, 0 },
380 {"write-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_WRITE_BATCH, 0, 0 },
ea5164d1
WD
381 {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
382 {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
383 {"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 },
06963d0f 384#ifdef INET6
afb6e945
WD
385 {0, '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
386 {0, '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
06963d0f 387#endif
8b54f004 388 {0,0,0,0, 0, 0, 0}
2855f61f 389};
7a6421fa 390
06963d0f 391
cd8185f2
AT
392static char err_buf[100];
393
2855f61f 394
dafe63ca
MP
395/**
396 * Store the option error message, if any, so that we can log the
397 * connection attempt (which requires parsing the options), and then
398 * show the error later on.
399 **/
cd8185f2
AT
400void option_error(void)
401{
402 if (err_buf[0]) {
2855f61f
MP
403 rprintf(FLOG, "%s", err_buf);
404 rprintf(FERROR, "%s: %s", RSYNC_NAME, err_buf);
cd8185f2 405 } else {
add7e8fb
MP
406 rprintf (FERROR, "Error parsing options: "
407 "option may be supported on client but not on server?\n");
408 rprintf (FERROR, RSYNC_NAME ": Error parsing options: "
409 "option may be supported on client but not on server?\n");
cd8185f2 410 }
cd8185f2
AT
411}
412
dafe63ca
MP
413
414/**
415 * Check to see if we should refuse this option
416 **/
cd8185f2
AT
417static int check_refuse_options(char *ref, int opt)
418{
419 int i, len;
420 char *p;
421 const char *name;
422
2855f61f 423 for (i=0; long_options[i].longName; i++) {
cd8185f2
AT
424 if (long_options[i].val == opt) break;
425 }
dfa32483 426
2855f61f 427 if (!long_options[i].longName) return 0;
cd8185f2 428
2855f61f 429 name = long_options[i].longName;
cd8185f2
AT
430 len = strlen(name);
431
432 while ((p = strstr(ref,name))) {
055af776
AT
433 if ((p==ref || p[-1]==' ') &&
434 (p[len] == ' ' || p[len] == 0)) {
8950ac03 435 snprintf(err_buf,sizeof(err_buf),
cd8185f2
AT
436 "The '%s' option is not supported by this server\n", name);
437 return 1;
438 }
439 ref += len;
440 }
441 return 0;
442}
443
444
2855f61f
MP
445static int count_args(char const **argv)
446{
dfa32483 447 int i = 0;
2855f61f 448
dfa32483
WD
449 while (argv[i] != NULL)
450 i++;
451
452 return i;
2855f61f
MP
453}
454
455
dafe63ca
MP
456/**
457 * Process command line arguments. Called on both local and remote.
458 *
459 * @retval 1 if all options are OK; with globals set to appropriate
460 * values
461 *
462 * @retval 0 on error, with err_buf containing an explanation
463 **/
2855f61f 464int parse_arguments(int *argc, const char ***argv, int frommain)
7a6421fa 465{
d853783f 466 int opt;
cd8185f2 467 char *ref = lp_refuse_options(module_id);
dfa32483 468 poptContext pc;
d853783f 469
dfa32483 470 /* TODO: Call poptReadDefaultConfig; handle errors. */
cd8185f2 471
dfa32483
WD
472 /* The context leaks in case of an error, but if there's a
473 * problem we always exit anyhow. */
474 pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
2855f61f
MP
475
476 while ((opt = poptGetNextOpt(pc)) != -1) {
cd8185f2
AT
477 if (ref) {
478 if (check_refuse_options(ref, opt)) return 0;
479 }
480
dfa32483
WD
481 /* most options are handled automatically by popt;
482 * only special cases are returned and listed here. */
2855f61f 483
d853783f
AT
484 switch (opt) {
485 case OPT_VERSION:
dfa32483 486 print_rsync_version(FINFO);
d853783f 487 exit_cleanup(0);
dfa32483 488
5b56cc19 489 case OPT_MODIFY_WINDOW:
dfa32483
WD
490 /* The value has already been set by popt, but
491 * we need to remember that we're using a
492 * non-default setting. */
5b56cc19
AT
493 modify_window_set = 1;
494 break;
1de50993
WD
495
496 case OPT_DELETE_AFTER:
497 delete_after = 1;
498 delete_mode = 1;
499 break;
500
b33b791e
DD
501 case OPT_DELETE_EXCLUDED:
502 delete_excluded = 1;
503 delete_mode = 1;
504 break;
505
d853783f 506 case OPT_EXCLUDE:
8645af1d
WD
507 add_exclude(&exclude_list, poptGetOptArg(pc),
508 ADD_EXCLUDE);
d853783f
AT
509 break;
510
511 case OPT_INCLUDE:
8645af1d
WD
512 add_exclude(&exclude_list, poptGetOptArg(pc),
513 ADD_INCLUDE);
d853783f
AT
514 break;
515
516 case OPT_EXCLUDE_FROM:
8645af1d
WD
517 add_exclude_file(&exclude_list, poptGetOptArg(pc),
518 MISSING_FATAL, ADD_EXCLUDE);
d853783f
AT
519 break;
520
93695764 521 case OPT_INCLUDE_FROM:
8645af1d
WD
522 add_exclude_file(&exclude_list, poptGetOptArg(pc),
523 MISSING_FATAL, ADD_INCLUDE);
93695764
DD
524 break;
525
d853783f
AT
526 case 'h':
527 usage(FINFO);
528 exit_cleanup(0);
529
d853783f 530 case 'H':
7a6421fa 531#if SUPPORT_HARD_LINKS
d853783f 532 preserve_hard_links=1;
2855f61f 533#else
dfa32483
WD
534 /* FIXME: Don't say "server" if this is
535 * happening on the client. */
536 /* FIXME: Why do we have the duplicated
537 * rprintf? Everybody who gets this message
538 * ought to send it to the client and also to
539 * the logs. */
d175d7e1 540 snprintf(err_buf, sizeof err_buf,
dfa32483 541 "hard links are not supported on this %s\n",
2855f61f 542 am_server ? "server" : "client");
d175d7e1 543 rprintf(FERROR, "ERROR: %s", err_buf);
b11ed3b1 544 return 0;
2855f61f 545#endif /* SUPPORT_HARD_LINKS */
d853783f 546 break;
7a6421fa 547
d853783f
AT
548 case 'v':
549 verbose++;
550 break;
7a6421fa 551
b86f0cef
DD
552 case 'q':
553 if (frommain) quiet++;
554 break;
555
d853783f
AT
556 case OPT_SENDER:
557 if (!am_server) {
558 usage(FERROR);
65417579 559 exit_cleanup(RERR_SYNTAX);
d853783f
AT
560 }
561 am_sender = 1;
562 break;
563
d9fcc198
AT
564 case 'P':
565 do_progress = 1;
566 keep_partial = 1;
567 break;
568
088aac85
DD
569 case OPT_WRITE_BATCH:
570 /* popt stores the filename in batch_prefix for us */
571 write_batch = 1;
572 break;
573
76f79ba7 574 case OPT_READ_BATCH:
088aac85 575 /* popt stores the filename in batch_prefix for us */
6902ed17
MP
576 read_batch = 1;
577 break;
ea5164d1 578
59c95e42
DD
579 case OPT_LINK_DEST:
580#if HAVE_LINK
9680f811 581 compare_dest = (char *)poptGetOptArg(pc);
59c95e42
DD
582 link_dest = 1;
583 break;
584#else
d175d7e1 585 snprintf(err_buf, sizeof err_buf,
dfa32483 586 "hard links are not supported on this %s\n",
59c95e42 587 am_server ? "server" : "client");
d175d7e1 588 rprintf(FERROR, "ERROR: %s", err_buf);
59c95e42
DD
589 return 0;
590#endif
591
6902ed17 592
d853783f 593 default:
dfa32483
WD
594 /* FIXME: If --daemon is specified, then errors for later
595 * parameters seem to disappear. */
596 snprintf(err_buf, sizeof(err_buf),
597 "%s%s: %s\n",
598 am_server ? "on remote machine: " : "",
599 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
600 poptStrerror(opt));
601 return 0;
d853783f 602 }
7a6421fa 603 }
2855f61f 604
088aac85 605 if (write_batch && read_batch) {
d175d7e1
WD
606 rprintf(FERROR,
607 "write-batch and read-batch can not be used together\n");
608 exit_cleanup(RERR_SYNTAX);
088aac85
DD
609 }
610
611 if (do_compression && (write_batch || read_batch)) {
d175d7e1
WD
612 rprintf(FERROR,
613 "compress can not be used with write-batch or read-batch\n");
614 exit_cleanup(RERR_SYNTAX);
088aac85
DD
615 }
616
dfa32483 617 if (archive_mode) {
ea5164d1
WD
618 if (!files_from)
619 recurse = 1;
dfa32483
WD
620#if SUPPORT_LINKS
621 preserve_links = 1;
622#endif
623 preserve_perms = 1;
624 preserve_times = 1;
625 preserve_gid = 1;
626 preserve_uid = 1;
627 preserve_devices = 1;
628 }
629
ea5164d1
WD
630 if (relative_paths < 0)
631 relative_paths = files_from? 1 : 0;
632
d175d7e1
WD
633 if (!backup_suffix)
634 backup_suffix = backup_dir? "" : BACKUP_SUFFIX;
635 backup_suffix_len = strlen(backup_suffix);
80ddadb7
WD
636 if (strchr(backup_suffix, '/') != NULL) {
637 rprintf(FERROR, "--suffix cannot contain slashes: %s\n",
638 backup_suffix);
639 exit_cleanup(RERR_SYNTAX);
640 }
d175d7e1
WD
641 if (backup_dir)
642 backup_dir_len = strlen(backup_dir);
643 else if (!backup_suffix_len) {
644 rprintf(FERROR,
645 "--suffix cannot be a null string without --backup-dir\n");
646 exit_cleanup(RERR_SYNTAX);
647 }
648
dfa32483
WD
649 *argv = poptGetArgs(pc);
650 if (*argv)
651 *argc = count_args(*argv);
652 else
653 *argc = 0;
2855f61f 654
ea5164d1
WD
655 if (files_from) {
656 char *colon;
657 if (*argc != 2) {
658 usage(FERROR);
659 exit_cleanup(RERR_SYNTAX);
660 }
661 if (strcmp(files_from, "-") == 0)
662 filesfrom_fd = 0;
663 else if ((colon = find_colon(files_from)) != 0) {
664 if (am_server) {
665 usage(FERROR);
666 exit_cleanup(RERR_SYNTAX);
667 }
668 remote_filesfrom_file = colon+1 + (colon[1] == ':');
669 if (strcmp(remote_filesfrom_file, "-") == 0) {
670 rprintf(FERROR, "Invalid --files-from remote filename\n");
671 exit_cleanup(RERR_SYNTAX);
672 }
673 } else {
674 extern int sanitize_paths;
675 if (sanitize_paths)
676 sanitize_path(strdup(files_from), NULL);
677 filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);
678 if (filesfrom_fd < 0) {
679 rsyserr(FERROR, errno,
680 "failed to open files-from file %s",
681 files_from);
682 exit_cleanup(RERR_FILEIO);
683 }
684 }
685 }
686
b11ed3b1 687 return 1;
7a6421fa
AT
688}
689
690
dafe63ca
MP
691/**
692 * Construct a filtered list of options to pass through from the
693 * client to the server.
694 *
695 * This involves setting options that will tell the server how to
696 * behave, and also filtering out options that are processed only
697 * locally.
698 **/
7a6421fa
AT
699void server_options(char **args,int *argc)
700{
d853783f
AT
701 int ac = *argc;
702 static char argstr[50];
703 static char bsize[30];
704 static char iotime[30];
0b73ca12 705 static char mdelete[30];
5b56cc19 706 static char mwindow[30];
ef5d23eb 707 static char bw[50];
088aac85
DD
708 /* Leave room for ``--(write|read)-batch='' */
709 static char fext[MAXPATHLEN + 15];
ef5d23eb 710
d853783f
AT
711 int i, x;
712
93689aa5
DD
713 if (blocking_io == -1)
714 blocking_io = 0;
715
d853783f
AT
716 args[ac++] = "--server";
717
1312d9fc
WD
718 if (daemon_over_rsh) {
719 args[ac++] = "--daemon";
720 *argc = ac;
721 /* if we're passing --daemon, we're done */
722 return;
723 }
724
d853783f
AT
725 if (!am_sender)
726 args[ac++] = "--sender";
727
728 x = 1;
729 argstr[0] = '-';
730 for (i=0;i<verbose;i++)
731 argstr[x++] = 'v';
f0b36a48 732
b86f0cef 733 /* the -q option is intentionally left out */
d853783f
AT
734 if (make_backups)
735 argstr[x++] = 'b';
736 if (update_only)
737 argstr[x++] = 'u';
738 if (dry_run)
739 argstr[x++] = 'n';
740 if (preserve_links)
741 argstr[x++] = 'l';
742 if (copy_links)
743 argstr[x++] = 'L';
1bfbf40b 744
dfa32483 745 if (whole_file > 0)
d853783f 746 argstr[x++] = 'W';
bceec82f
MP
747 /* We don't need to send --no-whole-file, because it's the
748 * default for remote transfers, and in any case old versions
749 * of rsync will not understand it. */
dfa32483 750
d853783f
AT
751 if (preserve_hard_links)
752 argstr[x++] = 'H';
753 if (preserve_uid)
754 argstr[x++] = 'o';
755 if (preserve_gid)
756 argstr[x++] = 'g';
757 if (preserve_devices)
758 argstr[x++] = 'D';
759 if (preserve_times)
760 argstr[x++] = 't';
761 if (preserve_perms)
762 argstr[x++] = 'p';
763 if (recurse)
764 argstr[x++] = 'r';
765 if (always_checksum)
766 argstr[x++] = 'c';
767 if (cvs_exclude)
768 argstr[x++] = 'C';
769 if (ignore_times)
770 argstr[x++] = 'I';
771 if (relative_paths)
772 argstr[x++] = 'R';
773 if (one_file_system)
774 argstr[x++] = 'x';
775 if (sparse_files)
776 argstr[x++] = 'S';
777 if (do_compression)
778 argstr[x++] = 'z';
f0b36a48 779
dfa32483 780 /* this is a complete hack - blame Rusty
f0b36a48
AT
781
782 this is a hack to make the list_only (remote file list)
783 more useful */
dfa32483 784 if (list_only && !recurse)
f0b36a48
AT
785 argstr[x++] = 'r';
786
d853783f
AT
787 argstr[x] = 0;
788
789 if (x != 1) args[ac++] = argstr;
790
195bd906 791 if (block_size) {
8950ac03 792 snprintf(bsize,sizeof(bsize),"-B%d",block_size);
d853783f 793 args[ac++] = bsize;
dfa32483 794 }
d853783f 795
0b73ca12 796 if (max_delete && am_sender) {
8950ac03 797 snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
0b73ca12 798 args[ac++] = mdelete;
dfa32483
WD
799 }
800
088aac85
DD
801 if (batch_prefix != NULL) {
802 char *fmt = "";
803 if (write_batch)
dfa32483 804 fmt = "--write-batch=%s";
088aac85
DD
805 else
806 if (read_batch)
dfa32483 807 fmt = "--read-batch=%s";
088aac85 808 snprintf(fext,sizeof(fext),fmt,batch_prefix);
6902ed17
MP
809 args[ac++] = fext;
810 }
0b73ca12 811
d853783f 812 if (io_timeout) {
8950ac03 813 snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);
d853783f 814 args[ac++] = iotime;
dfa32483 815 }
d853783f 816
ef5d23eb 817 if (bwlimit) {
8950ac03 818 snprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit);
ef5d23eb
DD
819 args[ac++] = bw;
820 }
821
d175d7e1
WD
822 if (backup_dir) {
823 args[ac++] = "--backup-dir";
824 args[ac++] = backup_dir;
825 }
826
827 /* Only send --suffix if it specifies a non-default value. */
828 if (strcmp(backup_suffix, backup_dir? "" : BACKUP_SUFFIX) != 0) {
191e40da
WD
829 char *s = malloc(9+backup_suffix_len+1);
830 if (!s)
831 out_of_memory("server_options");
832 /* We use the following syntax to avoid weirdness with '~'. */
833 sprintf(s, "--suffix=%s", backup_suffix);
834 args[ac++] = s;
d853783f
AT
835 }
836
b33b791e 837 if (delete_mode && !delete_excluded)
d853783f
AT
838 args[ac++] = "--delete";
839
b33b791e
DD
840 if (delete_excluded)
841 args[ac++] = "--delete-excluded";
842
f83f0548
AT
843 if (size_only)
844 args[ac++] = "--size-only";
845
5b56cc19 846 if (modify_window_set) {
dfa32483 847 snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
5b56cc19
AT
848 modify_window);
849 args[ac++] = mwindow;
850 }
851
d853783f
AT
852 if (keep_partial)
853 args[ac++] = "--partial";
854
855 if (force_delete)
856 args[ac++] = "--force";
857
57df171b
AT
858 if (delete_after)
859 args[ac++] = "--delete-after";
860
ef55c686
AT
861 if (ignore_errors)
862 args[ac++] = "--ignore-errors";
863
b5313607
DD
864 if (copy_unsafe_links)
865 args[ac++] = "--copy-unsafe-links";
866
d853783f
AT
867 if (safe_symlinks)
868 args[ac++] = "--safe-links";
869
870 if (numeric_ids)
871 args[ac++] = "--numeric-ids";
872
0b73ca12 873 if (only_existing && am_sender)
1347d512
AT
874 args[ac++] = "--existing";
875
dfa32483 876 if (opt_ignore_existing && am_sender)
3d6feada
MP
877 args[ac++] = "--ignore-existing";
878
d853783f
AT
879 if (tmpdir) {
880 args[ac++] = "--temp-dir";
881 args[ac++] = tmpdir;
882 }
883
375a4556
DD
884 if (compare_dest && am_sender) {
885 /* the server only needs this option if it is not the sender,
886 * and it may be an older version that doesn't know this
887 * option, so don't send it if client is the sender.
888 */
59c95e42 889 args[ac++] = link_dest ? "--link-dest" : "--compare-dest";
375a4556
DD
890 args[ac++] = compare_dest;
891 }
892
ea5164d1
WD
893 if (files_from && (!am_sender || remote_filesfrom_file)) {
894 if (remote_filesfrom_file) {
895 args[ac++] = "--files-from";
896 args[ac++] = remote_filesfrom_file;
897 if (eol_nulls)
898 args[ac++] = "--from0";
899 } else {
900 args[ac++] = "--files-from=-";
901 args[ac++] = "--from0";
902 }
903 }
904
d853783f 905 *argc = ac;
7a6421fa
AT
906}
907
ea5164d1
WD
908/**
909 * Return the position of a ':' IF it is not part of a filename (i.e. as
910 * long as it doesn't occur after a slash.
911 */
912char *find_colon(char *s)
913{
914 char *p, *p2;
915
916 p = strchr(s,':');
917 if (!p) return NULL;
918
919 /* now check to see if there is a / in the string before the : - if there is then
920 discard the colon on the assumption that the : is part of a filename */
921 p2 = strchr(s,'/');
922 if (p2 && p2 < p) return NULL;
923
924 return p;
925}