blob: a95338c88cda41a681777bb0c1df6943c7fddf8b [file] [log] [blame]
Martin Pool7a24c342000-11-09 09:05:14 +00001/* -*- c-file-style: "linux" -*-
Wayne Davisondfa32482003-03-21 18:58:50 +00002 *
Martin Pooldafe63c2002-04-16 01:38:21 +00003 * Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
4 * Copyright (C) 2000, 2001, 2002 by Martin Pool <mbp@samba.org>
Wayne Davisondfa32482003-03-21 18:58:50 +00005 *
Martin Pooldafe63c2002-04-16 01:38:21 +00006 * 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.
Wayne Davisondfa32482003-03-21 18:58:50 +000010 *
Martin Pooldafe63c2002-04-16 01:38:21 +000011 * 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.
Wayne Davisondfa32482003-03-21 18:58:50 +000015 *
Martin Pooldafe63c2002-04-16 01:38:21 +000016 * 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 */
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000020
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000021#include "rsync.h"
Martin Pool2855f612001-02-23 01:02:31 +000022#include "popt.h"
Wayne Davison854a1aa2005-10-26 16:47:15 +000023#include "zlib/zlib.h"
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000024
Wayne Davison7bc90b32005-01-29 20:48:20 +000025extern int module_id;
Wayne Davison7be73df2004-03-27 09:46:42 +000026extern int sanitize_paths;
Wayne Davison78424182005-01-25 10:39:14 +000027extern struct filter_list_struct filter_list;
28extern struct filter_list_struct server_filter_list;
Wayne Davison8645af12003-07-01 21:45:23 +000029
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000030int make_backups = 0;
Martin Pool1bfbf402002-03-19 03:21:53 +000031
32/**
Wayne Davisondfa32482003-03-21 18:58:50 +000033 * If 1, send the whole file as literal data rather than trying to
Martin Pooldafe63c2002-04-16 01:38:21 +000034 * create an incremental diff.
Martin Pool1bfbf402002-03-19 03:21:53 +000035 *
Wayne Davisondfa32482003-03-21 18:58:50 +000036 * If -1, then look at whether we're local or remote and go by that.
Martin Pooldafe63c2002-04-16 01:38:21 +000037 *
38 * @sa disable_deltas_p()
Martin Pool1bfbf402002-03-19 03:21:53 +000039 **/
Wayne Davisondfa32482003-03-21 18:58:50 +000040int whole_file = -1;
Martin Pool1bfbf402002-03-19 03:21:53 +000041
Wayne Davisona0157882005-07-28 01:46:09 +000042int append_mode = 0;
Wayne Davison716e73d2004-06-05 16:16:30 +000043int keep_dirlinks = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000044int copy_links = 0;
45int preserve_links = 0;
46int preserve_hard_links = 0;
47int preserve_perms = 0;
48int preserve_devices = 0;
49int preserve_uid = 0;
50int preserve_gid = 0;
51int preserve_times = 0;
Wayne Davison20fb7b92005-01-24 00:51:32 +000052int omit_dir_times = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000053int update_only = 0;
54int cvs_exclude = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000055int dry_run = 0;
Wayne Davison11e758a2005-04-09 18:59:47 +000056int do_xfers = 1;
Wayne Davisona5c11132004-02-09 17:45:22 +000057int ignore_times = 0;
58int delete_mode = 0;
Wayne Davisona51b3162005-01-24 01:41:54 +000059int delete_during = 0;
Wayne Davison51d48392005-01-22 22:48:34 +000060int delete_before = 0;
61int delete_after = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000062int delete_excluded = 0;
Wayne Davison07c6ae72005-02-20 01:04:40 +000063int remove_sent_files = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000064int one_file_system = 0;
Wayne Davison4f3e9a02003-09-09 15:58:56 +000065int protocol_version = PROTOCOL_VERSION;
Wayne Davisona5c11132004-02-09 17:45:22 +000066int sparse_files = 0;
67int do_compression = 0;
Wayne Davison854a1aa2005-10-26 16:47:15 +000068int def_compress_level = Z_DEFAULT_COMPRESSION;
Wayne Davisona5c11132004-02-09 17:45:22 +000069int am_root = 0;
Wayne Davison7f2a1f62005-02-25 17:08:31 +000070int am_server = 0;
71int am_sender = 0;
72int am_generator = 0;
73int am_starting_up = 1;
Wayne Davisona5c11132004-02-09 17:45:22 +000074int orig_umask = 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +000075int relative_paths = -1;
76int implied_dirs = 1;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000077int numeric_ids = 0;
78int force_delete = 0;
79int io_timeout = 0;
Wayne Davison9ac756c2005-05-19 08:52:17 +000080int allowed_lull = 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +000081char *files_from = NULL;
82int filesfrom_fd = -1;
Wayne Davison305666b2005-03-01 01:15:57 +000083char *filesfrom_host = NULL;
Wayne Davisonea5164d2003-03-30 23:00:42 +000084int eol_nulls = 0;
Wayne Davison8f14cc42005-11-12 19:53:17 +000085int human_readable = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000086int recurse = 0;
Wayne Davisonb6164932005-08-27 21:01:45 +000087int xfer_dirs = -1;
Wayne Davison1312d9f2002-08-01 00:37:01 +000088int am_daemon = 0;
89int daemon_over_rsh = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000090int do_stats = 0;
91int do_progress = 0;
92int keep_partial = 0;
93int safe_symlinks = 0;
94int copy_unsafe_links = 0;
95int size_only = 0;
Wayne Davison9fb08442004-11-17 19:29:20 +000096int daemon_bwlimit = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000097int bwlimit = 0;
Wayne Davisonc4ed1482005-02-14 02:41:15 +000098int fuzzy_basis = 0;
Wayne Davison3c74c3a2004-05-27 21:51:53 +000099size_t bwlimit_writemax = 0;
Wayne Davisone90aab42005-09-29 18:07:55 +0000100int ignore_existing = 0;
101int ignore_non_existing = 0;
Wayne Davison07c6ae72005-02-20 01:04:40 +0000102int need_messages_from_generator = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +0000103int max_delete = 0;
Wayne Davison7d5acf12004-11-11 01:45:25 +0000104OFF_T max_size = 0;
Wayne Davison74de13d2005-10-14 20:15:18 +0000105OFF_T min_size = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +0000106int ignore_errors = 0;
107int modify_window = 0;
108int blocking_io = -1;
Wayne Davison2289bf62004-02-09 18:32:54 +0000109int checksum_seed = 0;
Wayne Davisona3221d22004-07-16 20:06:24 +0000110int inplace = 0;
Wayne Davisonf06e7082005-01-27 22:46:14 +0000111int delay_updates = 0;
Wayne Davisona06b4192005-01-01 21:08:14 +0000112long block_size = 0; /* "long" because popt can't set an int32. */
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000113
Martin Poolb35d0d82002-04-08 04:10:20 +0000114
Martin Pool13e29992001-12-18 05:54:57 +0000115/** Network address family. **/
Wayne Davison4f5b0752005-02-14 00:53:43 +0000116#ifdef INET6
Martin Pool13e29992001-12-18 05:54:57 +0000117int default_af_hint = 0; /* Any protocol */
David Dykstra6ab6d4b2001-12-14 18:25:51 +0000118#else
Martin Pool13e29992001-12-18 05:54:57 +0000119int default_af_hint = AF_INET; /* Must use IPv4 */
David Dykstra6ab6d4b2001-12-14 18:25:51 +0000120#endif
Martin Pool06963d02001-11-23 07:35:49 +0000121
Martin Pool13e29992001-12-18 05:54:57 +0000122/** Do not go into the background when run as --daemon. Good
123 * for debugging and required for running as a service on W32,
124 * or under Unix process-monitors. **/
Wayne Davison1f35bab2005-02-21 00:31:31 +0000125int no_detach
126#if defined _WIN32 || defined __WIN32__
127 = 1;
128#else
129 = 0;
130#endif
Martin Pool13e29992001-12-18 05:54:57 +0000131
David Dykstra088aac82002-02-06 21:20:48 +0000132int write_batch = 0;
133int read_batch = 0;
Wayne Davisond175d7e2003-08-01 07:58:44 +0000134int backup_dir_len = 0;
135int backup_suffix_len;
Wayne Davisone0391f82004-02-11 04:30:41 +0000136unsigned int backup_dir_remainder;
Martin Pool6902ed12001-08-14 02:04:47 +0000137
Wayne Davisond175d7e2003-08-01 07:58:44 +0000138char *backup_suffix = NULL;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000139char *tmpdir = NULL;
Wayne Davisona7260c42004-07-29 16:06:38 +0000140char *partial_dir = NULL;
Wayne Davisone012f852004-11-27 17:52:51 +0000141char *basis_dir[MAX_BASIS_DIRS+1];
David Dykstra30e8c8e2002-08-30 23:27:26 +0000142char *config_file = NULL;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000143char *shell_cmd = NULL;
Andrew Tridgellb6062651998-11-03 03:48:47 +0000144char *log_format = NULL;
Andrew Tridgell65575e91999-01-08 10:32:56 +0000145char *password_file = NULL;
David Dykstra41bd28f2001-06-12 19:33:41 +0000146char *rsync_path = RSYNC_PATH;
Andrew Tridgell66203a92000-01-24 04:58:53 +0000147char *backup_dir = NULL;
Wayne Davisondd32e2c2005-11-07 04:28:35 +0000148char *chmod_mode = NULL;
Wayne Davisone0391f82004-02-11 04:30:41 +0000149char backup_dir_buf[MAXPATHLEN];
Wayne Davison0c56b1a2004-11-27 18:24:12 +0000150int rsync_port = 0;
Wayne Davisondfd7d542005-01-15 20:54:25 +0000151int compare_dest = 0;
Wayne Davison1de3e992005-03-11 17:35:59 +0000152int copy_dest = 0;
David Dykstra59c95e42002-08-29 14:44:55 +0000153int link_dest = 0;
Wayne Davisonce0b3842005-01-15 21:12:58 +0000154int basis_dir_cnt = 0;
Wayne Davisonf9a9f542005-03-09 18:53:53 +0000155char *dest_option = NULL;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000156
157int verbose = 0;
David Dykstrab86f0ce1999-02-09 17:25:35 +0000158int quiet = 0;
Wayne Davisone7651882005-02-16 08:10:31 +0000159int log_before_transfer = 0;
Wayne Davison684d7582005-02-19 22:16:39 +0000160int log_format_has_i = 0;
Wayne Davison5c5e1592005-02-19 03:54:11 +0000161int log_format_has_o_or_i = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000162int always_checksum = 0;
Andrew Tridgellf7632fc1998-11-02 00:52:01 +0000163int list_only = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000164
Wayne Davison9b3318b2004-07-15 16:27:02 +0000165#define MAX_BATCH_NAME_LEN 256 /* Must be less than MAXPATHLEN-13 */
166char *batch_name = NULL;
Martin Pool6902ed12001-08-14 02:04:47 +0000167
Wayne Davisondd32e2c2005-11-07 04:28:35 +0000168struct chmod_mode_struct *chmod_modes = NULL;
169
Wayne Davisone1add892004-02-01 17:29:41 +0000170static int daemon_opt; /* sets am_daemon after option error-reporting */
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000171static int F_option_cnt = 0;
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000172static int modify_window_set;
Wayne Davison624d6be2005-03-31 00:21:15 +0000173static int itemize_changes = 0;
Wayne Davison854a1aa2005-10-26 16:47:15 +0000174static int refused_delete, refused_archive_part, refused_compress;
Wayne Davison3296f912005-02-15 21:15:58 +0000175static int refused_partial, refused_progress, refused_delete_before;
Wayne Davisona0157882005-07-28 01:46:09 +0000176static int refused_inplace;
Wayne Davison74de13d2005-10-14 20:15:18 +0000177static char *max_size_arg, *min_size_arg;
Wayne Davison36719872005-02-11 10:42:55 +0000178static char partialdir_for_delayupdate[] = ".~tmp~";
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000179
Martin Pool06963d02001-11-23 07:35:49 +0000180/** Local address to bind. As a character string because it's
Wayne Davisonfdf57ed2004-06-20 19:47:05 +0000181 * interpreted by the IPv6 layer: should be a numeric IP4 or IP6
Martin Pool06963d02001-11-23 07:35:49 +0000182 * address, or a hostname. **/
183char *bind_address;
Andrew Tridgell5c9730a1999-10-31 03:21:02 +0000184
Martin Pool7a24c342000-11-09 09:05:14 +0000185
Martin Pool27a12342001-12-05 13:45:51 +0000186static void print_rsync_version(enum logcode f)
Martin Pool7a24c342000-11-09 09:05:14 +0000187{
Wayne Davisondfa32482003-03-21 18:58:50 +0000188 char const *got_socketpair = "no ";
Wayne Davisona3221d22004-07-16 20:06:24 +0000189 char const *have_inplace = "no ";
Wayne Davisondfa32482003-03-21 18:58:50 +0000190 char const *hardlinks = "no ";
191 char const *links = "no ";
Martin Poola3584492001-11-24 04:57:41 +0000192 char const *ipv6 = "no ";
Martin Pool736a6a22002-01-11 07:15:16 +0000193 STRUCT_STAT *dumstat;
Martin Pool0c80cd82000-11-10 03:41:47 +0000194
Wayne Davison4f5b0752005-02-14 00:53:43 +0000195#ifdef HAVE_SOCKETPAIR
Wayne Davisondfa32482003-03-21 18:58:50 +0000196 got_socketpair = "";
Martin Pool0c80cd82000-11-10 03:41:47 +0000197#endif
Martin Pool2855f612001-02-23 01:02:31 +0000198
Wayne Davison4f5b0752005-02-14 00:53:43 +0000199#ifdef HAVE_FTRUNCATE
Wayne Davisona3221d22004-07-16 20:06:24 +0000200 have_inplace = "";
201#endif
202
Wayne Davison4f5b0752005-02-14 00:53:43 +0000203#ifdef SUPPORT_HARD_LINKS
Wayne Davisondfa32482003-03-21 18:58:50 +0000204 hardlinks = "";
Martin Pool2855f612001-02-23 01:02:31 +0000205#endif
206
Wayne Davison4f5b0752005-02-14 00:53:43 +0000207#ifdef SUPPORT_LINKS
Wayne Davisondfa32482003-03-21 18:58:50 +0000208 links = "";
Martin Pool2855f612001-02-23 01:02:31 +0000209#endif
210
Wayne Davison4f5b0752005-02-14 00:53:43 +0000211#ifdef INET6
Martin Poola3584492001-11-24 04:57:41 +0000212 ipv6 = "";
Wayne Davisondfa32482003-03-21 18:58:50 +0000213#endif
Martin Poola3584492001-11-24 04:57:41 +0000214
Wayne Davisondfa32482003-03-21 18:58:50 +0000215 rprintf(f, "%s version %s protocol version %d\n",
216 RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
217 rprintf(f,
Wayne Davison72a90c72005-01-27 21:42:56 +0000218 "Copyright (C) 1996-2005 by Andrew Tridgell and others\n");
Martin Pool3b4b1982001-08-14 02:08:17 +0000219 rprintf(f, "<http://rsync.samba.org/>\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000220 rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
221 "%shard links, %ssymlinks, batchfiles, \n",
Wayne Davisona5c11132004-02-09 17:45:22 +0000222 (int) (sizeof (OFF_T) * 8),
Wayne Davisondfa32482003-03-21 18:58:50 +0000223 got_socketpair, hardlinks, links);
Martin Pool2855f612001-02-23 01:02:31 +0000224
Martin Pool736a6a22002-01-11 07:15:16 +0000225 /* Note that this field may not have type ino_t. It depends
226 * on the complicated interaction between largefile feature
227 * macros. */
Wayne Davisona3221d22004-07-16 20:06:24 +0000228 rprintf(f, " %sinplace, %sIPv6, %d-bit system inums, %d-bit internal inums\n",
229 have_inplace, ipv6,
Wayne Davisona5c11132004-02-09 17:45:22 +0000230 (int) (sizeof dumstat->st_ino * 8),
Wayne Davison14908122005-01-20 22:42:47 +0000231 (int) (sizeof (int64) * 8));
Martin Poolfc0302c2002-04-08 07:36:05 +0000232#ifdef MAINTAINER_MODE
233 rprintf(f, " panic action: \"%s\"\n",
234 get_panic_action());
235#endif
Martin Pool736a6a22002-01-11 07:15:16 +0000236
Wayne Davison031fa9a2005-01-28 06:46:33 +0000237#if SIZEOF_INT64 < 8
238 rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
Martin Pool7a24c342000-11-09 09:05:14 +0000239#endif
Wayne Davisonc561eda2005-01-28 06:51:44 +0000240 if (sizeof (int64) != SIZEOF_INT64) {
241 rprintf(f,
242 "WARNING: size mismatch in SIZEOF_INT64 define (%d != %d)\n",
243 (int) SIZEOF_INT64, (int) sizeof (int64));
244 }
Martin Pool7b329a22002-03-19 05:00:05 +0000245
246 rprintf(f,
247"\n"
248"rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
249"are welcome to redistribute it under certain conditions. See the GNU\n"
250"General Public Licence for details.\n"
251 );
Martin Pool7a24c342000-11-09 09:05:14 +0000252}
253
254
Andrew Tridgell0f3203c2000-01-29 02:49:03 +0000255void usage(enum logcode F)
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000256{
Martin Pool2855f612001-02-23 01:02:31 +0000257 print_rsync_version(F);
Andrew Tridgell704f9081998-06-18 09:31:42 +0000258
Martin Pool3ff984d2002-03-19 05:09:19 +0000259 rprintf(F,"\nrsync is a file transfer program capable of efficient remote update\nvia a fast differencing algorithm.\n\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000260
Wayne Davison868676d2005-09-21 22:39:49 +0000261 rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... DEST\n");
262 rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
David Dykstra9ef53901999-02-10 19:33:05 +0000263 rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
Wayne Davisoneaa4c152002-08-01 17:55:11 +0000264 rprintf(F," or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST\n");
Wayne Davison868676d2005-09-21 22:39:49 +0000265 rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC [DEST]\n");
266 rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
267 rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n");
Wayne Davison08d82b82005-09-13 01:02:54 +0000268 rprintf(F,"The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect\n");
269 rprintf(F,"to an rsync daemon, and require SRC or DEST to start with a module name.\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000270 rprintf(F,"\nOptions\n");
271 rprintf(F," -v, --verbose increase verbosity\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000272 rprintf(F," -q, --quiet suppress non-error messages\n");
273 rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n");
274 rprintf(F," -a, --archive archive mode; same as -rlptgoD (no -H)\n");
Wayne Davison8938d672005-11-15 07:05:55 +0000275 rprintf(F," --no-OPTION turn off an implied OPTION (e.g. --no-D)\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000276 rprintf(F," -r, --recursive recurse into directories\n");
277 rprintf(F," -R, --relative use relative path names\n");
Wayne Davison11bfaf62005-08-27 20:01:45 +0000278 rprintf(F," --no-implied-dirs don't send implied dirs with --relative\n");
Wayne Davison68391402003-12-30 18:16:25 +0000279 rprintf(F," -b, --backup make backups (see --suffix & --backup-dir)\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000280 rprintf(F," --backup-dir=DIR make backups into hierarchy based in DIR\n");
281 rprintf(F," --suffix=SUFFIX set backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
282 rprintf(F," -u, --update skip files that are newer on the receiver\n");
Wayne Davison4ce838e2005-01-17 23:11:18 +0000283 rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n");
Wayne Davisona0157882005-07-28 01:46:09 +0000284 rprintf(F," --append append data onto shorter files\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000285 rprintf(F," -d, --dirs transfer directories without recursing\n");
Martin Pool13e29992001-12-18 05:54:57 +0000286 rprintf(F," -l, --links copy symlinks as symlinks\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000287 rprintf(F," -L, --copy-links transform symlink into referent file/dir\n");
288 rprintf(F," --copy-unsafe-links only \"unsafe\" symlinks are transformed\n");
289 rprintf(F," --safe-links ignore symlinks that point outside the source tree\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000290 rprintf(F," -H, --hard-links preserve hard links\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000291 rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000292 rprintf(F," -p, --perms preserve permissions\n");
293 rprintf(F," -o, --owner preserve owner (root only)\n");
294 rprintf(F," -g, --group preserve group\n");
295 rprintf(F," -D, --devices preserve devices (root only)\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000296 rprintf(F," -t, --times preserve times\n");
Wayne Davison20fb7b92005-01-24 00:51:32 +0000297 rprintf(F," -O, --omit-dir-times omit directories when preserving times\n");
Wayne Davisondd32e2c2005-11-07 04:28:35 +0000298 rprintf(F," --chmod=CHMOD change destination permissions\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000299 rprintf(F," -S, --sparse handle sparse files efficiently\n");
300 rprintf(F," -n, --dry-run show what would have been transferred\n");
Wayne Davison98bf61c2005-02-14 19:09:30 +0000301 rprintf(F," -W, --whole-file copy files whole (without rsync algorithm)\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000302 rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n");
Wayne Davison9cd339e2004-08-03 08:05:20 +0000303 rprintf(F," -B, --block-size=SIZE force a fixed checksum block-size\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000304 rprintf(F," -e, --rsh=COMMAND specify the remote shell to use\n");
Wayne Davison05ee4862005-03-02 09:17:42 +0000305 rprintf(F," --rsync-path=PROGRAM specify the rsync to run on the remote machine\n");
Wayne Davisond2da9152005-12-19 01:59:00 +0000306 rprintf(F," --existing ignore non-existing files on receiving side\n");
Wayne Davison68391402003-12-30 18:16:25 +0000307 rprintf(F," --ignore-existing ignore files that already exist on receiving side\n");
Wayne Davison07c6ae72005-02-20 01:04:40 +0000308 rprintf(F," --remove-sent-files sent files/symlinks are removed from sending side\n");
Wayne Davison3359acb2005-01-25 03:08:58 +0000309 rprintf(F," --del an alias for --delete-during\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000310 rprintf(F," --delete delete files that don't exist on the sending side\n");
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000311 rprintf(F," --delete-before receiver deletes before transfer (default)\n");
Wayne Davison3359acb2005-01-25 03:08:58 +0000312 rprintf(F," --delete-during receiver deletes during transfer, not before\n");
313 rprintf(F," --delete-after receiver deletes after transfer, not before\n");
Wayne Davison51d48392005-01-22 22:48:34 +0000314 rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000315 rprintf(F," --ignore-errors delete even if there are I/O errors\n");
Wayne Davison51d48392005-01-22 22:48:34 +0000316 rprintf(F," --force force deletion of directories even if not empty\n");
Andrew Tridgell0b73ca12000-01-23 11:43:04 +0000317 rprintf(F," --max-delete=NUM don't delete more than NUM files\n");
Wayne Davison7d5acf12004-11-11 01:45:25 +0000318 rprintf(F," --max-size=SIZE don't transfer any file larger than SIZE\n");
Wayne Davison74de13d2005-10-14 20:15:18 +0000319 rprintf(F," --min-size=SIZE don't transfer any file smaller than SIZE\n");
Andrew Tridgellc95da961998-07-01 03:36:03 +0000320 rprintf(F," --partial keep partially transferred files\n");
Wayne Davisona7260c42004-07-29 16:06:38 +0000321 rprintf(F," --partial-dir=DIR put a partially transferred file into DIR\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000322 rprintf(F," --delay-updates put all updated files into place at transfer's end\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000323 rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000324 rprintf(F," --timeout=TIME set I/O timeout in seconds\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000325 rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n");
326 rprintf(F," --size-only skip files that match in size\n");
327 rprintf(F," --modify-window=NUM compare mod-times with reduced accuracy\n");
Wayne Davison4db88e52004-07-22 15:43:28 +0000328 rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n");
Wayne Davisonc4ed1482005-02-14 02:41:15 +0000329 rprintf(F," -y, --fuzzy find similar file for basis if no dest file\n");
David Dykstra375a4551998-10-26 21:42:38 +0000330 rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
Wayne Davison1de3e992005-03-11 17:35:59 +0000331 rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
Wayne Davisone012f852004-11-27 17:52:51 +0000332 rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
Wayne Davisonf9249462005-02-12 22:22:14 +0000333 rprintf(F," -z, --compress compress file data during the transfer\n");
Wayne Davison854a1aa2005-10-26 16:47:15 +0000334 rprintf(F," --compress-level=NUM explicitly set compression level\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000335 rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000336 rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
Wayne Davison9c71f562005-02-13 05:44:29 +0000337 rprintf(F," -F same as --filter='dir-merge /.rsync-filter'\n");
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000338 rprintf(F," repeated: --filter='- .rsync-filter'\n");
David Dykstra2acf81e1998-11-03 21:17:40 +0000339 rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000340 rprintf(F," --exclude-from=FILE read exclude patterns from FILE\n");
David Dykstra2acf81e1998-11-03 21:17:40 +0000341 rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000342 rprintf(F," --include-from=FILE read include patterns from FILE\n");
343 rprintf(F," --files-from=FILE read list of source-file names from FILE\n");
Wayne Davison72316022005-05-02 17:23:08 +0000344 rprintf(F," -0, --from0 all *-from/filter files are delimited by 0s\n");
Wayne Davisonb4ef0bc2005-04-05 05:59:49 +0000345 rprintf(F," --address=ADDRESS bind address for outgoing socket to daemon\n");
Wayne Davisonb4713292004-12-08 17:29:54 +0000346 rprintf(F," --port=PORT specify double-colon alternate port number\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000347 rprintf(F," --blocking-io use blocking I/O for the remote shell\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000348 rprintf(F," --stats give some file-transfer stats\n");
Wayne Davison05724c02005-11-15 06:35:27 +0000349 rprintf(F," -h, --human-readable output numbers in a human-readable format\n");
Wayne Davison8f14cc42005-11-12 19:53:17 +0000350 rprintf(F," --si like human-readable, but use powers of 1000\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000351 rprintf(F," --progress show progress during transfer\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000352 rprintf(F," -P same as --partial --progress\n");
Wayne Davisonb78296c2005-02-15 07:41:13 +0000353 rprintf(F," -i, --itemize-changes output a change-summary for all updates\n");
Wayne Davison4a34c6f2005-05-03 16:46:49 +0000354 rprintf(F," --log-format=FORMAT output filenames using the specified format\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000355 rprintf(F," --password-file=FILE read password from FILE\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000356 rprintf(F," --list-only list the files instead of copying them\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000357 rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
358 rprintf(F," --write-batch=FILE write a batched update to FILE\n");
Wayne Davison11e758a2005-04-09 18:59:47 +0000359 rprintf(F," --only-write-batch=FILE like --write-batch but w/o updating destination\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000360 rprintf(F," --read-batch=FILE read a batched update from FILE\n");
Wayne Davisonda9f5922005-03-28 20:40:25 +0000361 rprintf(F," --protocol=NUM force an older protocol version to be used\n");
Wayne Davison4f5b0752005-02-14 00:53:43 +0000362#ifdef INET6
Wayne Davison4db88e52004-07-22 15:43:28 +0000363 rprintf(F," -4, --ipv4 prefer IPv4\n");
364 rprintf(F," -6, --ipv6 prefer IPv6\n");
Martin Pool06963d02001-11-23 07:35:49 +0000365#endif
Wayne Davison4a34c6f2005-05-03 16:46:49 +0000366 rprintf(F," --version print version number\n");
Wayne Davison05724c02005-11-15 06:35:27 +0000367 rprintf(F," --help show this help screen\n");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000368
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000369 rprintf(F,"\nUse \"rsync --daemon --help\" to see the daemon-mode command-line options.\n");
370 rprintf(F,"Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation.\n");
Martin Pool2855f612001-02-23 01:02:31 +0000371 rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and answers\n");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000372}
373
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000374enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
Wayne Davison05724c02005-11-15 06:35:27 +0000375 OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST, OPT_HELP,
Wayne Davison74de13d2005-10-14 20:15:18 +0000376 OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, OPT_MIN_SIZE,
Wayne Davison9ac756c2005-05-19 08:52:17 +0000377 OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH, OPT_MAX_SIZE,
Wayne Davisonc67d1382004-02-22 08:56:43 +0000378 OPT_REFUSED_BASE = 9000};
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000379
Martin Pool2855f612001-02-23 01:02:31 +0000380static struct poptOption long_options[] = {
381 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
Wayne Davison05724c02005-11-15 06:35:27 +0000382 {"help", 0, POPT_ARG_NONE, 0, OPT_HELP, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000383 {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000384 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000385 {"no-verbose", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
Wayne Davison4afcb702005-08-28 00:43:51 +0000386 {"no-v", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000387 {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
388 {"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
Wayne Davison05724c02005-11-15 06:35:27 +0000389 {"human-readable", 'h', POPT_ARG_VAL, &human_readable, 1, 0, 0},
Wayne Davison8f14cc42005-11-12 19:53:17 +0000390 {"si", 0, POPT_ARG_VAL, &human_readable, 2, 0, 0},
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000391 {"dry-run", 'n', POPT_ARG_NONE, &dry_run, 0, 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000392 {"archive", 'a', POPT_ARG_NONE, 0, 'a', 0, 0 },
393 {"recursive", 'r', POPT_ARG_VAL, &recurse, 2, 0, 0 },
394 {"no-recursive", 0, POPT_ARG_VAL, &recurse, 0, 0, 0 },
395 {"no-r", 0, POPT_ARG_VAL, &recurse, 0, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000396 {"dirs", 'd', POPT_ARG_VAL, &xfer_dirs, 2, 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000397 {"no-dirs", 0, POPT_ARG_VAL, &xfer_dirs, 0, 0, 0 },
398 {"no-d", 0, POPT_ARG_VAL, &xfer_dirs, 0, 0, 0 },
399 {"perms", 'p', POPT_ARG_VAL, &preserve_perms, 1, 0, 0 },
400 {"no-perms", 0, POPT_ARG_VAL, &preserve_perms, 0, 0, 0 },
401 {"no-p", 0, POPT_ARG_VAL, &preserve_perms, 0, 0, 0 },
402 {"times", 't', POPT_ARG_VAL, &preserve_times, 1, 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000403 {"no-times", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 },
404 {"no-t", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 },
Wayne Davison38b91702005-08-27 21:12:44 +0000405 {"omit-dir-times", 'O', POPT_ARG_VAL, &omit_dir_times, 2, 0, 0 },
406 {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000407 {"owner", 'o', POPT_ARG_VAL, &preserve_uid, 1, 0, 0 },
408 {"no-owner", 0, POPT_ARG_VAL, &preserve_uid, 0, 0, 0 },
409 {"no-o", 0, POPT_ARG_VAL, &preserve_uid, 0, 0, 0 },
410 {"group", 'g', POPT_ARG_VAL, &preserve_gid, 1, 0, 0 },
411 {"no-group", 0, POPT_ARG_VAL, &preserve_gid, 0, 0, 0 },
412 {"no-g", 0, POPT_ARG_VAL, &preserve_gid, 0, 0, 0 },
413 {"devices", 'D', POPT_ARG_VAL, &preserve_devices, 1, 0, 0 },
414 {"no-devices", 0, POPT_ARG_VAL, &preserve_devices, 0, 0, 0 },
415 {"no-D", 0, POPT_ARG_VAL, &preserve_devices, 0, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000416 {"links", 'l', POPT_ARG_VAL, &preserve_links, 1, 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000417 {"no-links", 0, POPT_ARG_VAL, &preserve_links, 0, 0, 0 },
418 {"no-l", 0, POPT_ARG_VAL, &preserve_links, 0, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000419 {"copy-links", 'L', POPT_ARG_NONE, &copy_links, 0, 0, 0 },
420 {"copy-unsafe-links",0, POPT_ARG_NONE, &copy_unsafe_links, 0, 0, 0 },
421 {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 },
422 {"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 },
423 {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
424 {"relative", 'R', POPT_ARG_VAL, &relative_paths, 1, 0, 0 },
425 {"no-relative", 0, POPT_ARG_VAL, &relative_paths, 0, 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000426 {"no-R", 0, POPT_ARG_VAL, &relative_paths, 0, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000427 {"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 },
Wayne Davisondd32e2c2005-11-07 04:28:35 +0000428 {"chmod", 0, POPT_ARG_STRING, &chmod_mode, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000429 {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
430 {"size-only", 0, POPT_ARG_NONE, &size_only, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000431 {"one-file-system", 'x', POPT_ARG_NONE, &one_file_system, 0, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000432 {"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 },
Wayne Davisone90aab42005-09-29 18:07:55 +0000433 {"existing", 0, POPT_ARG_NONE, &ignore_non_existing, 0, 0, 0 },
Wayne Davisone90aab42005-09-29 18:07:55 +0000434 {"ignore-non-existing",0,POPT_ARG_NONE, &ignore_non_existing, 0, 0, 0 },
Wayne Davisond2da9152005-12-19 01:59:00 +0000435 {"ignore-existing", 0, POPT_ARG_NONE, &ignore_existing, 0, 0, 0 },
Wayne Davisonaeb213e2005-10-14 18:56:07 +0000436 {"max-size", 0, POPT_ARG_STRING, &max_size_arg, OPT_MAX_SIZE, 0, 0 },
Wayne Davison74de13d2005-10-14 20:15:18 +0000437 {"min-size", 0, POPT_ARG_STRING, &min_size_arg, OPT_MIN_SIZE, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000438 {"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 },
439 {"inplace", 0, POPT_ARG_NONE, &inplace, 0, 0, 0 },
440 {"append", 0, POPT_ARG_VAL, &append_mode, 1, 0, 0 },
Wayne Davison36719872005-02-11 10:42:55 +0000441 {"del", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
Wayne Davison3359acb2005-01-25 03:08:58 +0000442 {"delete", 0, POPT_ARG_NONE, &delete_mode, 0, 0, 0 },
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000443 {"delete-before", 0, POPT_ARG_VAL, &delete_before, 2, 0, 0 },
Wayne Davison3359acb2005-01-25 03:08:58 +0000444 {"delete-during", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
Wayne Davison51d48392005-01-22 22:48:34 +0000445 {"delete-after", 0, POPT_ARG_NONE, &delete_after, 0, 0, 0 },
446 {"delete-excluded", 0, POPT_ARG_NONE, &delete_excluded, 0, 0, 0 },
Wayne Davison07c6ae72005-02-20 01:04:40 +0000447 {"remove-sent-files",0, POPT_ARG_NONE, &remove_sent_files, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000448 {"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000449 {"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors, 0, 0, 0 },
450 {"max-delete", 0, POPT_ARG_INT, &max_delete, 0, 0, 0 },
451 {0, 'F', POPT_ARG_NONE, 0, 'F', 0, 0 },
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000452 {"filter", 'f', POPT_ARG_STRING, 0, OPT_FILTER, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000453 {"exclude", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE, 0, 0 },
454 {"include", 0, POPT_ARG_STRING, 0, OPT_INCLUDE, 0, 0 },
455 {"exclude-from", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE_FROM, 0, 0 },
456 {"include-from", 0, POPT_ARG_STRING, 0, OPT_INCLUDE_FROM, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000457 {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 },
Wayne Davison11bfaf62005-08-27 20:01:45 +0000458 {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 },
459 {"no-whole-file", 0, POPT_ARG_VAL, &whole_file, 0, 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000460 {"no-W", 0, POPT_ARG_VAL, &whole_file, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000461 {"checksum", 'c', POPT_ARG_NONE, &always_checksum, 0, 0, 0 },
Wayne Davisona06b4192005-01-01 21:08:14 +0000462 {"block-size", 'B', POPT_ARG_LONG, &block_size, 0, 0, 0 },
Wayne Davisone012f852004-11-27 17:52:51 +0000463 {"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
Wayne Davison1de3e992005-03-11 17:35:59 +0000464 {"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
Wayne Davisone012f852004-11-27 17:52:51 +0000465 {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
Wayne Davisonc4ed1482005-02-14 02:41:15 +0000466 {"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 },
Wayne Davison854a1aa2005-10-26 16:47:15 +0000467 {"compress", 'z', POPT_ARG_NONE, 0, 'z', 0, 0 },
468 {"compress-level", 0, POPT_ARG_INT, &def_compress_level, 'z', 0, 0 },
Wayne Davison11bfaf62005-08-27 20:01:45 +0000469 {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
Wayne Davisonb6164932005-08-27 21:01:45 +0000470 {"progress", 0, POPT_ARG_VAL, &do_progress, 1, 0, 0 },
471 {"no-progress", 0, POPT_ARG_VAL, &do_progress, 0, 0, 0 },
472 {"partial", 0, POPT_ARG_VAL, &keep_partial, 1, 0, 0 },
473 {"no-partial", 0, POPT_ARG_VAL, &keep_partial, 0, 0, 0 },
Wayne Davisona7260c42004-07-29 16:06:38 +0000474 {"partial-dir", 0, POPT_ARG_STRING, &partial_dir, 0, 0, 0 },
Wayne Davisonf06e7082005-01-27 22:46:14 +0000475 {"delay-updates", 0, POPT_ARG_NONE, &delay_updates, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000476 {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
Wayne Davisonb78296c2005-02-15 07:41:13 +0000477 {"itemize-changes", 'i', POPT_ARG_NONE, &itemize_changes, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000478 {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
Wayne Davison11bfaf62005-08-27 20:01:45 +0000479 {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000480 {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000481 {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
482 {"list-only", 0, POPT_ARG_VAL, &list_only, 2, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000483 {"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 },
484 {"write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 },
Wayne Davison11e758a2005-04-09 18:59:47 +0000485 {"only-write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_ONLY_WRITE_BATCH, 0, 0 },
Wayne Davisonea5164d2003-03-30 23:00:42 +0000486 {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
487 {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000488 {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
489 {"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
490 {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
491 {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
492 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
Wayne Davison4f5b0752005-02-14 00:53:43 +0000493#ifdef INET6
Wayne Davison3dd22902004-05-06 21:08:01 +0000494 {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
495 {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
Martin Pool06963d02001-11-23 07:35:49 +0000496#endif
Wayne Davisone86e2fa2005-08-27 20:43:35 +0000497 {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
498 {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
499 {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
500 {"blocking-io", 0, POPT_ARG_VAL, &blocking_io, 1, 0, 0 },
501 {"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 },
502 {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 },
503 {"checksum-seed", 0, POPT_ARG_INT, &checksum_seed, 0, 0, 0 },
504 {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
505 {"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
506 /* All the following options switch us into daemon-mode option-parsing. */
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000507 {"config", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 },
508 {"daemon", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
Wayne Davison1f35bab2005-02-21 00:31:31 +0000509 {"detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000510 {"no-detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000511 {0,0,0,0, 0, 0, 0}
512};
513
514static void daemon_usage(enum logcode F)
515{
516 print_rsync_version(F);
517
518 rprintf(F,"\nUsage: rsync --daemon [OPTION]...\n");
519 rprintf(F," --address=ADDRESS bind to the specified address\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000520 rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000521 rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
522 rprintf(F," --no-detach do not detach from the parent\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000523 rprintf(F," --port=PORT listen on alternate port number\n");
Wayne Davison1bd9db72005-01-28 17:07:54 +0000524 rprintf(F," -v, --verbose increase verbosity\n");
Wayne Davison4f5b0752005-02-14 00:53:43 +0000525#ifdef INET6
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000526 rprintf(F," -4, --ipv4 prefer IPv4\n");
527 rprintf(F," -6, --ipv6 prefer IPv6\n");
528#endif
Wayne Davison05724c02005-11-15 06:35:27 +0000529 rprintf(F," --help show this help screen\n");
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000530
531 rprintf(F,"\nIf you were not trying to invoke rsync as a daemon, avoid using any of the\n");
532 rprintf(F,"daemon-specific rsync options. See also the rsyncd.conf(5) man page.\n");
533}
534
535static struct poptOption long_daemon_options[] = {
536 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
537 {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
Wayne Davison9fb08442004-11-17 19:29:20 +0000538 {"bwlimit", 0, POPT_ARG_INT, &daemon_bwlimit, 0, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000539 {"config", 0, POPT_ARG_STRING, &config_file, 0, 0, 0 },
540 {"daemon", 0, POPT_ARG_NONE, &daemon_opt, 0, 0, 0 },
Wayne Davison4f5b0752005-02-14 00:53:43 +0000541#ifdef INET6
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000542 {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
543 {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
544#endif
Wayne Davison1f35bab2005-02-21 00:31:31 +0000545 {"detach", 0, POPT_ARG_VAL, &no_detach, 0, 0, 0 },
546 {"no-detach", 0, POPT_ARG_VAL, &no_detach, 1, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000547 {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
548 {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 },
549 {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
Wayne Davisonb8cc3582005-08-30 05:00:56 +0000550 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
Wayne Davison1bd9db72005-01-28 17:07:54 +0000551 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
Wayne Davisonb6e22a42005-08-30 16:13:54 +0000552 {"no-verbose", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
553 {"no-v", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000554 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
Wayne Davisonad715002004-10-14 09:11:12 +0000555 {0,0,0,0, 0, 0, 0}
Martin Pool2855f612001-02-23 01:02:31 +0000556};
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000557
Martin Pool06963d02001-11-23 07:35:49 +0000558
Wayne Davisone51094b2004-05-21 09:41:38 +0000559static char err_buf[200];
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000560
Martin Pool2855f612001-02-23 01:02:31 +0000561
Martin Pooldafe63c2002-04-16 01:38:21 +0000562/**
563 * Store the option error message, if any, so that we can log the
564 * connection attempt (which requires parsing the options), and then
565 * show the error later on.
566 **/
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000567void option_error(void)
568{
Wayne Davisone51094b2004-05-21 09:41:38 +0000569 if (!err_buf[0]) {
570 strcpy(err_buf, "Error parsing options: "
571 "option may be supported on client but not on server?\n");
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000572 }
Wayne Davisone51094b2004-05-21 09:41:38 +0000573
Wayne Davisone51094b2004-05-21 09:41:38 +0000574 rprintf(FERROR, RSYNC_NAME ": %s", err_buf);
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000575}
576
Martin Pooldafe63c2002-04-16 01:38:21 +0000577
578/**
Wayne Davison27ed20f2004-02-21 21:12:49 +0000579 * Tweak the option table to disable all options that the rsyncd.conf
580 * file has told us to refuse.
Martin Pooldafe63c2002-04-16 01:38:21 +0000581 **/
Wayne Davison27ed20f2004-02-21 21:12:49 +0000582static void set_refuse_options(char *bp)
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000583{
Wayne Davison27ed20f2004-02-21 21:12:49 +0000584 struct poptOption *op;
Wayne Davison093e8162004-08-02 07:40:34 +0000585 char *cp, shortname[2];
Wayne Davisond73e7f62004-08-04 21:20:34 +0000586 int is_wild, found_match;
Wayne Davison093e8162004-08-02 07:40:34 +0000587
588 shortname[1] = '\0';
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000589
Wayne Davison27ed20f2004-02-21 21:12:49 +0000590 while (1) {
Wayne Davison06a50542004-08-02 05:00:30 +0000591 while (*bp == ' ') bp++;
592 if (!*bp)
593 break;
Wayne Davison27ed20f2004-02-21 21:12:49 +0000594 if ((cp = strchr(bp, ' ')) != NULL)
595 *cp= '\0';
Wayne Davison093e8162004-08-02 07:40:34 +0000596 is_wild = strpbrk(bp, "*?[") != NULL;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000597 found_match = 0;
Wayne Davison55afbb52004-02-21 21:36:55 +0000598 for (op = long_options; ; op++) {
Wayne Davison093e8162004-08-02 07:40:34 +0000599 *shortname = op->shortName;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000600 if (!op->longName && !*shortname)
601 break;
602 if ((op->longName && wildmatch(bp, op->longName))
Wayne Davison684d7582005-02-19 22:16:39 +0000603 || (*shortname && wildmatch(bp, shortname))) {
Wayne Davisone57211c2005-01-23 01:25:36 +0000604 if (op->argInfo == POPT_ARG_VAL)
605 op->argInfo = POPT_ARG_NONE;
Wayne Davison06a50542004-08-02 05:00:30 +0000606 op->val = (op - long_options) + OPT_REFUSED_BASE;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000607 found_match = 1;
Wayne Davison36719872005-02-11 10:42:55 +0000608 /* These flags are set to let us easily check
609 * an implied option later in the code. */
610 switch (*shortname) {
Wayne Davison36719872005-02-11 10:42:55 +0000611 case 'r': case 'd': case 'l': case 'p':
612 case 't': case 'g': case 'o': case 'D':
613 refused_archive_part = op->val;
614 break;
Wayne Davison854a1aa2005-10-26 16:47:15 +0000615 case 'z':
616 refused_compress = op->val;
617 break;
Wayne Davison36719872005-02-11 10:42:55 +0000618 case '\0':
619 if (wildmatch("delete", op->longName))
620 refused_delete = op->val;
Wayne Davison3296f912005-02-15 21:15:58 +0000621 else if (wildmatch("delete-before", op->longName))
622 refused_delete_before = op->val;
Wayne Davison36719872005-02-11 10:42:55 +0000623 else if (wildmatch("partial", op->longName))
624 refused_partial = op->val;
625 else if (wildmatch("progress", op->longName))
626 refused_progress = op->val;
Wayne Davisona0157882005-07-28 01:46:09 +0000627 else if (wildmatch("inplace", op->longName))
628 refused_inplace = op->val;
Wayne Davison36719872005-02-11 10:42:55 +0000629 break;
630 }
Wayne Davison06a50542004-08-02 05:00:30 +0000631 if (!is_wild)
632 break;
Wayne Davison27ed20f2004-02-21 21:12:49 +0000633 }
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000634 }
Wayne Davisond73e7f62004-08-04 21:20:34 +0000635 if (!found_match) {
636 rprintf(FLOG, "No match for refuse-options string \"%s\"\n",
637 bp);
638 }
Wayne Davison27ed20f2004-02-21 21:12:49 +0000639 if (!cp)
640 break;
641 *cp = ' ';
642 bp = cp + 1;
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000643 }
Wayne Davison684d7582005-02-19 22:16:39 +0000644
645 for (op = long_options; ; op++) {
646 *shortname = op->shortName;
647 if (!op->longName && !*shortname)
648 break;
649 if (op->val == OPT_DAEMON) {
650 if (op->argInfo == POPT_ARG_VAL)
651 op->argInfo = POPT_ARG_NONE;
652 op->val = (op - long_options) + OPT_REFUSED_BASE;
653 }
654 }
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000655}
656
657
Wayne Davison8db7cc22004-10-11 10:43:25 +0000658static int count_args(const char **argv)
Martin Pool2855f612001-02-23 01:02:31 +0000659{
Wayne Davisondfa32482003-03-21 18:58:50 +0000660 int i = 0;
Martin Pool2855f612001-02-23 01:02:31 +0000661
Wayne Davison8db7cc22004-10-11 10:43:25 +0000662 if (argv) {
663 while (argv[i] != NULL)
664 i++;
665 }
Wayne Davisondfa32482003-03-21 18:58:50 +0000666
667 return i;
Martin Pool2855f612001-02-23 01:02:31 +0000668}
669
670
Wayne Davison837d01d2005-10-14 19:48:34 +0000671static OFF_T parse_size_arg(char **size_arg, char def_suf)
Wayne Davison95e107d2005-04-28 16:11:32 +0000672{
Wayne Davison3c19f722005-11-15 17:49:59 +0000673 int reps, mult, make_compatible = 0;
674 const char *arg;
675 OFF_T size = 1;
Wayne Davison95e107d2005-04-28 16:11:32 +0000676
Wayne Davisonaeb213e2005-10-14 18:56:07 +0000677 for (arg = *size_arg; isdigit(*(uchar*)arg); arg++) {}
Wayne Davison95e107d2005-04-28 16:11:32 +0000678 if (*arg == '.')
679 for (arg++; isdigit(*(uchar*)arg); arg++) {}
Wayne Davison3c19f722005-11-15 17:49:59 +0000680 switch (*arg && *arg != '+' && *arg != '-' ? *arg++ : def_suf) {
Wayne Davison837d01d2005-10-14 19:48:34 +0000681 case 'b': case 'B':
Wayne Davison3c19f722005-11-15 17:49:59 +0000682 reps = 0;
Wayne Davison837d01d2005-10-14 19:48:34 +0000683 break;
Wayne Davison95e107d2005-04-28 16:11:32 +0000684 case 'k': case 'K':
Wayne Davison3c19f722005-11-15 17:49:59 +0000685 reps = 1;
Wayne Davison95e107d2005-04-28 16:11:32 +0000686 break;
687 case 'm': case 'M':
Wayne Davison3c19f722005-11-15 17:49:59 +0000688 reps = 2;
Wayne Davison95e107d2005-04-28 16:11:32 +0000689 break;
690 case 'g': case 'G':
Wayne Davison3c19f722005-11-15 17:49:59 +0000691 reps = 3;
Wayne Davison95e107d2005-04-28 16:11:32 +0000692 break;
693 default:
Wayne Davison3c19f722005-11-15 17:49:59 +0000694 return -1;
Wayne Davison95e107d2005-04-28 16:11:32 +0000695 }
Wayne Davison3c19f722005-11-15 17:49:59 +0000696 if (*arg == 'b' || *arg == 'B')
697 mult = 1000, make_compatible = 1, arg++;
698 else if (!*arg || *arg == '+' || *arg == '-')
699 mult = 1024;
700 else if (strncasecmp(arg, "ib", 2) == 0)
701 mult = 1024, arg += 2;
702 else
703 return -1;
704 while (reps--)
705 size *= mult;
706 size *= atof(*size_arg);
707 if ((*arg == '+' || *arg == '-') && arg[1] == '1')
708 size += atoi(arg), make_compatible = 1, arg += 2;
709 if (*arg)
710 return -1;
Wayne Davisonaeb213e2005-10-14 18:56:07 +0000711 if (size > 0 && make_compatible) {
Wayne Davison74de13d2005-10-14 20:15:18 +0000712 /* We convert this manually because we may need %lld precision,
713 * and that's not a portable sprintf() escape. */
Wayne Davison8f14cc42005-11-12 19:53:17 +0000714 char buf[128], *s = buf + sizeof buf - 1;
Wayne Davisonaeb213e2005-10-14 18:56:07 +0000715 OFF_T num = size;
Wayne Davison8f14cc42005-11-12 19:53:17 +0000716 *s = '\0';
Wayne Davisonaeb213e2005-10-14 18:56:07 +0000717 while (num) {
Wayne Davisonaeb213e2005-10-14 18:56:07 +0000718 *--s = (num % 10) + '0';
719 num /= 10;
720 }
721 if (!(*size_arg = strdup(s)))
722 out_of_memory("parse_size_arg");
723 }
Wayne Davison95e107d2005-04-28 16:11:32 +0000724 return size;
725}
726
727
Wayne Davison36719872005-02-11 10:42:55 +0000728static void create_refuse_error(int which)
729{
730 /* The "which" value is the index + OPT_REFUSED_BASE. */
731 struct poptOption *op = &long_options[which - OPT_REFUSED_BASE];
732 int n = snprintf(err_buf, sizeof err_buf,
733 "The server is configured to refuse --%s\n",
734 op->longName) - 1;
735 if (op->shortName) {
736 snprintf(err_buf + n, sizeof err_buf - n,
737 " (-%c)\n", op->shortName);
738 }
739}
740
741
Martin Pooldafe63c2002-04-16 01:38:21 +0000742/**
743 * Process command line arguments. Called on both local and remote.
744 *
745 * @retval 1 if all options are OK; with globals set to appropriate
746 * values
747 *
748 * @retval 0 on error, with err_buf containing an explanation
749 **/
Martin Pool2855f612001-02-23 01:02:31 +0000750int parse_arguments(int *argc, const char ***argv, int frommain)
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000751{
Andrew Tridgelld8537831998-07-17 10:00:43 +0000752 int opt;
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000753 char *ref = lp_refuse_options(module_id);
Wayne Davison7be73df2004-03-27 09:46:42 +0000754 const char *arg;
Wayne Davisondfa32482003-03-21 18:58:50 +0000755 poptContext pc;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000756
Wayne Davison27ed20f2004-02-21 21:12:49 +0000757 if (ref && *ref)
758 set_refuse_options(ref);
759
Wayne Davisondfa32482003-03-21 18:58:50 +0000760 /* TODO: Call poptReadDefaultConfig; handle errors. */
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000761
Wayne Davisondfa32482003-03-21 18:58:50 +0000762 /* The context leaks in case of an error, but if there's a
763 * problem we always exit anyhow. */
764 pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
Wayne Davison9fb08442004-11-17 19:29:20 +0000765 poptReadDefaultConfig(pc, 0);
Martin Pool2855f612001-02-23 01:02:31 +0000766
767 while ((opt = poptGetNextOpt(pc)) != -1) {
Wayne Davisondfa32482003-03-21 18:58:50 +0000768 /* most options are handled automatically by popt;
769 * only special cases are returned and listed here. */
Martin Pool2855f612001-02-23 01:02:31 +0000770
Andrew Tridgelld8537831998-07-17 10:00:43 +0000771 switch (opt) {
772 case OPT_VERSION:
Wayne Davisondfa32482003-03-21 18:58:50 +0000773 print_rsync_version(FINFO);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000774 exit_cleanup(0);
Wayne Davisondfa32482003-03-21 18:58:50 +0000775
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000776 case OPT_DAEMON:
777 if (am_daemon) {
778 strcpy(err_buf, "Attempt to hack rsync thwarted!\n");
779 return 0;
780 }
781 poptFreeContext(pc);
782 pc = poptGetContext(RSYNC_NAME, *argc, *argv,
783 long_daemon_options, 0);
784 while ((opt = poptGetNextOpt(pc)) != -1) {
785 switch (opt) {
786 case 'h':
787 daemon_usage(FINFO);
788 exit_cleanup(0);
789
Wayne Davison1bd9db72005-01-28 17:07:54 +0000790 case 'v':
791 verbose++;
792 break;
793
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000794 default:
795 rprintf(FERROR,
796 "rsync: %s: %s (in daemon mode)\n",
797 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
798 poptStrerror(opt));
799 goto daemon_error;
800 }
801 }
Wayne Davisonb6e22a42005-08-30 16:13:54 +0000802
803 if (tmpdir && strlen(tmpdir) >= MAXPATHLEN - 10) {
804 snprintf(err_buf, sizeof err_buf,
805 "the --temp-dir path is WAY too long.\n");
806 return 0;
807 }
808
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000809 if (!daemon_opt) {
810 rprintf(FERROR, "Daemon option(s) used without --daemon.\n");
811 daemon_error:
812 rprintf(FERROR,
813 "(Type \"rsync --daemon --help\" for assistance with daemon mode.)\n");
814 exit_cleanup(RERR_SYNTAX);
815 }
Wayne Davisonb6e22a42005-08-30 16:13:54 +0000816
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000817 *argv = poptGetArgs(pc);
818 *argc = count_args(*argv);
Wayne Davison7f2a1f62005-02-25 17:08:31 +0000819 am_starting_up = 0;
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000820 daemon_opt = 0;
821 am_daemon = 1;
822 return 1;
823
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000824 case OPT_MODIFY_WINDOW:
Wayne Davisondfa32482003-03-21 18:58:50 +0000825 /* The value has already been set by popt, but
826 * we need to remember that we're using a
827 * non-default setting. */
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000828 modify_window_set = 1;
829 break;
Wayne Davison1de50992002-05-03 22:59:17 +0000830
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000831 case OPT_FILTER:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000832 parse_rule(&filter_list, poptGetOptArg(pc), 0, 0);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000833 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000834
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000835 case OPT_EXCLUDE:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000836 parse_rule(&filter_list, poptGetOptArg(pc),
Wayne Davison0a68f862005-02-03 19:00:17 +0000837 0, XFLG_OLD_PREFIXES);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000838 break;
839
Andrew Tridgelld8537831998-07-17 10:00:43 +0000840 case OPT_INCLUDE:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000841 parse_rule(&filter_list, poptGetOptArg(pc),
Wayne Davison0a68f862005-02-03 19:00:17 +0000842 MATCHFLG_INCLUDE, XFLG_OLD_PREFIXES);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000843 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000844
Andrew Tridgelld8537831998-07-17 10:00:43 +0000845 case OPT_EXCLUDE_FROM:
David Dykstra93695762002-02-27 22:49:57 +0000846 case OPT_INCLUDE_FROM:
Wayne Davison7be73df2004-03-27 09:46:42 +0000847 arg = poptGetOptArg(pc);
Wayne Davisonba3db472004-08-26 17:39:48 +0000848 if (sanitize_paths)
849 arg = sanitize_path(NULL, arg, NULL, 0);
Wayne Davison78424182005-01-25 10:39:14 +0000850 if (server_filter_list.head) {
Wayne Davisonba3db472004-08-26 17:39:48 +0000851 char *cp = (char *)arg;
Wayne Davison36719872005-02-11 10:42:55 +0000852 if (!*cp)
853 goto options_rejected;
Wayne Davisonba3db472004-08-26 17:39:48 +0000854 clean_fname(cp, 1);
Wayne Davison78424182005-01-25 10:39:14 +0000855 if (check_filter(&server_filter_list, cp, 0) < 0)
Wayne Davisonba3db472004-08-26 17:39:48 +0000856 goto options_rejected;
857 }
Wayne Davison3a5e9222005-02-04 21:13:03 +0000858 parse_filter_file(&filter_list, arg,
859 opt == OPT_INCLUDE_FROM ? MATCHFLG_INCLUDE : 0,
860 XFLG_FATAL_ERRORS | XFLG_OLD_PREFIXES);
David Dykstra93695762002-02-27 22:49:57 +0000861 break;
862
Wayne Davisonb6164932005-08-27 21:01:45 +0000863 case 'a':
864 if (refused_archive_part) {
865 create_refuse_error(refused_archive_part);
866 return 0;
867 }
868 if (!recurse) /* preserve recurse == 2 */
869 recurse = 1;
870#ifdef SUPPORT_LINKS
871 preserve_links = 1;
872#endif
873 preserve_perms = 1;
874 preserve_times = 1;
875 preserve_gid = 1;
876 preserve_uid = 1;
877 preserve_devices = 1;
878 break;
879
Wayne Davison05724c02005-11-15 06:35:27 +0000880 case OPT_HELP:
Andrew Tridgelld8537831998-07-17 10:00:43 +0000881 usage(FINFO);
882 exit_cleanup(0);
Andrew Tridgell2b6b4d51998-05-27 11:02:33 +0000883
Andrew Tridgelld8537831998-07-17 10:00:43 +0000884 case 'v':
885 verbose++;
886 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000887
David Dykstrab86f0ce1999-02-09 17:25:35 +0000888 case 'q':
Wayne Davisonf98c60b2004-02-09 18:10:57 +0000889 if (frommain)
890 quiet++;
David Dykstrab86f0ce1999-02-09 17:25:35 +0000891 break;
892
Andrew Tridgelld8537831998-07-17 10:00:43 +0000893 case OPT_SENDER:
894 if (!am_server) {
895 usage(FERROR);
Andrew Tridgell65417571998-11-03 07:08:27 +0000896 exit_cleanup(RERR_SYNTAX);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000897 }
898 am_sender = 1;
899 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000900
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000901 case 'F':
902 switch (++F_option_cnt) {
903 case 1:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000904 parse_rule(&filter_list,": /.rsync-filter",0,0);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000905 break;
906 case 2:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000907 parse_rule(&filter_list,"- .rsync-filter",0,0);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000908 break;
909 }
910 break;
911
Andrew Tridgelld9fcc191999-10-31 02:47:30 +0000912 case 'P':
Wayne Davison36719872005-02-11 10:42:55 +0000913 if (refused_partial || refused_progress) {
914 create_refuse_error(refused_partial
915 ? refused_partial : refused_progress);
916 return 0;
917 }
Andrew Tridgelld9fcc191999-10-31 02:47:30 +0000918 do_progress = 1;
919 keep_partial = 1;
920 break;
921
Wayne Davison854a1aa2005-10-26 16:47:15 +0000922 case 'z':
923 if (def_compress_level < Z_DEFAULT_COMPRESSION
924 || def_compress_level > Z_BEST_COMPRESSION) {
925 snprintf(err_buf, sizeof err_buf,
926 "--compress-level value is invalid: %d\n",
927 def_compress_level);
928 return 0;
929 }
930 do_compression = def_compress_level != Z_NO_COMPRESSION;
931 if (do_compression && refused_compress) {
932 create_refuse_error(refused_compress);
933 return 0;
934 }
935 break;
936
David Dykstra088aac82002-02-06 21:20:48 +0000937 case OPT_WRITE_BATCH:
Wayne Davison9b3318b2004-07-15 16:27:02 +0000938 /* batch_name is already set */
David Dykstra088aac82002-02-06 21:20:48 +0000939 write_batch = 1;
940 break;
941
Wayne Davison11e758a2005-04-09 18:59:47 +0000942 case OPT_ONLY_WRITE_BATCH:
943 /* batch_name is already set */
944 write_batch = -1;
945 break;
946
Martin Pool76f79ba2002-01-23 05:51:06 +0000947 case OPT_READ_BATCH:
Wayne Davison9b3318b2004-07-15 16:27:02 +0000948 /* batch_name is already set */
Martin Pool6902ed12001-08-14 02:04:47 +0000949 read_batch = 1;
950 break;
Wayne Davisonea5164d2003-03-30 23:00:42 +0000951
Wayne Davison7d5acf12004-11-11 01:45:25 +0000952 case OPT_MAX_SIZE:
Wayne Davison837d01d2005-10-14 19:48:34 +0000953 if ((max_size = parse_size_arg(&max_size_arg, 'b')) <= 0) {
Wayne Davisone012f852004-11-27 17:52:51 +0000954 snprintf(err_buf, sizeof err_buf,
Wayne Davison7d5acf12004-11-11 01:45:25 +0000955 "--max-size value is invalid: %s\n",
956 max_size_arg);
Wayne Davisone012f852004-11-27 17:52:51 +0000957 return 0;
Wayne Davison7d5acf12004-11-11 01:45:25 +0000958 }
959 break;
960
Wayne Davison74de13d2005-10-14 20:15:18 +0000961 case OPT_MIN_SIZE:
962 if ((min_size = parse_size_arg(&min_size_arg, 'b')) <= 0) {
963 snprintf(err_buf, sizeof err_buf,
964 "--min-size value is invalid: %s\n",
965 min_size_arg);
966 return 0;
967 }
968 break;
969
David Dykstra59c95e42002-08-29 14:44:55 +0000970 case OPT_LINK_DEST:
Wayne Davison4f5b0752005-02-14 00:53:43 +0000971#ifdef HAVE_LINK
David Dykstra59c95e42002-08-29 14:44:55 +0000972 link_dest = 1;
Wayne Davisone012f852004-11-27 17:52:51 +0000973 dest_option = "--link-dest";
974 goto set_dest_dir;
David Dykstra59c95e42002-08-29 14:44:55 +0000975#else
Wayne Davisond175d7e2003-08-01 07:58:44 +0000976 snprintf(err_buf, sizeof err_buf,
Wayne Davisondfa32482003-03-21 18:58:50 +0000977 "hard links are not supported on this %s\n",
David Dykstra59c95e42002-08-29 14:44:55 +0000978 am_server ? "server" : "client");
David Dykstra59c95e42002-08-29 14:44:55 +0000979 return 0;
980#endif
981
Wayne Davison1de3e992005-03-11 17:35:59 +0000982 case OPT_COPY_DEST:
983 copy_dest = 1;
984 dest_option = "--copy-dest";
985 goto set_dest_dir;
986
Wayne Davisone012f852004-11-27 17:52:51 +0000987 case OPT_COMPARE_DEST:
988 compare_dest = 1;
989 dest_option = "--compare-dest";
990 set_dest_dir:
Wayne Davison3b26bba2005-01-15 21:23:04 +0000991 if (basis_dir_cnt >= MAX_BASIS_DIRS) {
Wayne Davisone012f852004-11-27 17:52:51 +0000992 snprintf(err_buf, sizeof err_buf,
993 "ERROR: at most %d %s args may be specified\n",
994 MAX_BASIS_DIRS, dest_option);
995 return 0;
996 }
997 arg = poptGetOptArg(pc);
998 if (sanitize_paths)
999 arg = sanitize_path(NULL, arg, NULL, 0);
1000 basis_dir[basis_dir_cnt++] = (char *)arg;
1001 break;
1002
Andrew Tridgelld8537831998-07-17 10:00:43 +00001003 default:
Wayne Davison55afbb52004-02-21 21:36:55 +00001004 /* A large opt value means that set_refuse_options()
Wayne Davison36719872005-02-11 10:42:55 +00001005 * turned this option off. */
Wayne Davisonc67d1382004-02-22 08:56:43 +00001006 if (opt >= OPT_REFUSED_BASE) {
Wayne Davison36719872005-02-11 10:42:55 +00001007 create_refuse_error(opt);
1008 return 0;
Wayne Davison27ed20f2004-02-21 21:12:49 +00001009 }
Wayne Davison36719872005-02-11 10:42:55 +00001010 snprintf(err_buf, sizeof err_buf, "%s%s: %s\n",
1011 am_server ? "on remote machine: " : "",
1012 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
1013 poptStrerror(opt));
Wayne Davisondfa32482003-03-21 18:58:50 +00001014 return 0;
Andrew Tridgelld8537831998-07-17 10:00:43 +00001015 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001016 }
Martin Pool2855f612001-02-23 01:02:31 +00001017
Wayne Davison05724c02005-11-15 06:35:27 +00001018 if (human_readable && *argc == 2) {
1019 usage(FINFO);
1020 exit_cleanup(0);
1021 }
1022
Wayne Davison4f5b0752005-02-14 00:53:43 +00001023#ifndef SUPPORT_LINKS
Wayne Davison54e87b42004-02-02 21:33:10 +00001024 if (preserve_links && !am_sender) {
Wayne Davisone1add892004-02-01 17:29:41 +00001025 snprintf(err_buf, sizeof err_buf,
1026 "symlinks are not supported on this %s\n",
1027 am_server ? "server" : "client");
Wayne Davisone1add892004-02-01 17:29:41 +00001028 return 0;
1029 }
1030#endif
1031
Wayne Davison4f5b0752005-02-14 00:53:43 +00001032#ifndef SUPPORT_HARD_LINKS
Wayne Davisone1add892004-02-01 17:29:41 +00001033 if (preserve_hard_links) {
1034 snprintf(err_buf, sizeof err_buf,
1035 "hard links are not supported on this %s\n",
1036 am_server ? "server" : "client");
Wayne Davisone1add892004-02-01 17:29:41 +00001037 return 0;
1038 }
1039#endif
1040
David Dykstra088aac82002-02-06 21:20:48 +00001041 if (write_batch && read_batch) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001042 snprintf(err_buf, sizeof err_buf,
Wayne Davison36119892004-07-21 22:50:11 +00001043 "--write-batch and --read-batch can not be used together\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001044 return 0;
David Dykstra088aac82002-02-06 21:20:48 +00001045 }
Wayne Davison11e758a2005-04-09 18:59:47 +00001046 if (write_batch > 0 || read_batch) {
Wayne Davison94327ff2004-07-15 19:06:32 +00001047 if (am_server) {
1048 rprintf(FINFO,
1049 "ignoring --%s-batch option sent to server\n",
1050 write_batch ? "write" : "read");
1051 /* We don't actually exit_cleanup(), so that we can
1052 * still service older version clients that still send
1053 * batch args to server. */
1054 read_batch = write_batch = 0;
1055 batch_name = NULL;
Wayne Davison254ee3b2005-03-24 16:41:16 +00001056 } else if (dry_run)
1057 write_batch = 0;
Wayne Davisonb9f592f2004-07-15 02:20:08 +00001058 }
Wayne Davison36119892004-07-21 22:50:11 +00001059 if (read_batch && files_from) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001060 snprintf(err_buf, sizeof err_buf,
Wayne Davison36119892004-07-21 22:50:11 +00001061 "--read-batch cannot be used with --files-from\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001062 return 0;
Wayne Davison36119892004-07-21 22:50:11 +00001063 }
Wayne Davison9b3318b2004-07-15 16:27:02 +00001064 if (batch_name && strlen(batch_name) > MAX_BATCH_NAME_LEN) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001065 snprintf(err_buf, sizeof err_buf,
Wayne Davison9b3318b2004-07-15 16:27:02 +00001066 "the batch-file name must be %d characters or less.\n",
1067 MAX_BATCH_NAME_LEN);
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001068 return 0;
Wayne Davisonbeb93682004-01-19 23:33:02 +00001069 }
David Dykstra088aac82002-02-06 21:20:48 +00001070
Wayne Davisonce58b1b2004-01-22 01:20:24 +00001071 if (tmpdir && strlen(tmpdir) >= MAXPATHLEN - 10) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001072 snprintf(err_buf, sizeof err_buf,
1073 "the --temp-dir path is WAY too long.\n");
1074 return 0;
Wayne Davisonce58b1b2004-01-22 01:20:24 +00001075 }
1076
Wayne Davison1de3e992005-03-11 17:35:59 +00001077 if (compare_dest + copy_dest + link_dest > 1) {
Wayne Davisone012f852004-11-27 17:52:51 +00001078 snprintf(err_buf, sizeof err_buf,
Wayne Davison1de3e992005-03-11 17:35:59 +00001079 "You may not mix --compare-dest, --copy-dest, and --link-dest.\n");
Wayne Davisone012f852004-11-27 17:52:51 +00001080 return 0;
1081 }
1082
Wayne Davisonb6164932005-08-27 21:01:45 +00001083 if (files_from) {
1084 if (recurse == 1) /* preserve recurse == 2 */
1085 recurse = 0;
Wayne Davison550d4e22005-09-29 17:27:11 +00001086 if (xfer_dirs < 0)
Wayne Davisonb6164932005-08-27 21:01:45 +00001087 xfer_dirs = 1;
Wayne Davisondfa32482003-03-21 18:58:50 +00001088 }
Wayne Davison51d48392005-01-22 22:48:34 +00001089
Wayne Davisonb6164932005-08-27 21:01:45 +00001090 if (xfer_dirs < 1)
1091 xfer_dirs = recurse || list_only;
Wayne Davisondfa32482003-03-21 18:58:50 +00001092
Wayne Davisonea5164d2003-03-30 23:00:42 +00001093 if (relative_paths < 0)
1094 relative_paths = files_from? 1 : 0;
Wayne Davison89f2a4c2005-07-22 19:05:25 +00001095 if (!relative_paths)
1096 implied_dirs = 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001097
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +00001098 if (!!delete_before + delete_during + delete_after > 1) {
Wayne Davison3359acb2005-01-25 03:08:58 +00001099 snprintf(err_buf, sizeof err_buf,
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +00001100 "You may not combine multiple --delete-WHEN options.\n");
Wayne Davison3359acb2005-01-25 03:08:58 +00001101 return 0;
1102 }
Wayne Davison8d6c1c42005-09-29 07:41:50 +00001103 if (!xfer_dirs) {
Wayne Davison78fc60c2005-01-29 22:35:50 +00001104 delete_before = delete_during = delete_after = 0;
1105 delete_mode = delete_excluded = 0;
1106 } else if (delete_before || delete_during || delete_after)
Wayne Davison51d48392005-01-22 22:48:34 +00001107 delete_mode = 1;
Wayne Davison3296f912005-02-15 21:15:58 +00001108 else if (delete_mode || delete_excluded) {
1109 if (refused_delete_before) {
1110 create_refuse_error(refused_delete_before);
1111 return 0;
1112 }
Wayne Davison3359acb2005-01-25 03:08:58 +00001113 delete_mode = delete_before = 1;
Wayne Davison3296f912005-02-15 21:15:58 +00001114 }
Wayne Davison51d48392005-01-22 22:48:34 +00001115
Wayne Davison36719872005-02-11 10:42:55 +00001116 if (delete_mode && refused_delete) {
1117 create_refuse_error(refused_delete);
1118 return 0;
1119 }
1120
Wayne Davison07c6ae72005-02-20 01:04:40 +00001121 if (remove_sent_files) {
1122 /* We only want to infer this refusal of --remove-sent-files
1123 * via the refusal of "delete", not any of the "delete-FOO"
1124 * options. */
1125 if (refused_delete && am_sender) {
1126 create_refuse_error(refused_delete);
1127 return 0;
1128 }
1129 need_messages_from_generator = 1;
1130 }
1131
Wayne Davison7be73df2004-03-27 09:46:42 +00001132 *argv = poptGetArgs(pc);
Wayne Davison8db7cc22004-10-11 10:43:25 +00001133 *argc = count_args(*argv);
Wayne Davison7be73df2004-03-27 09:46:42 +00001134
1135 if (sanitize_paths) {
1136 int i;
1137 for (i = *argc; i-- > 0; )
Wayne Davison10796f42004-08-11 23:41:03 +00001138 (*argv)[i] = sanitize_path(NULL, (*argv)[i], "", 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001139 if (tmpdir)
Wayne Davison10796f42004-08-11 23:41:03 +00001140 tmpdir = sanitize_path(NULL, tmpdir, NULL, 0);
Wayne Davisona7260c42004-07-29 16:06:38 +00001141 if (partial_dir)
Wayne Davison10796f42004-08-11 23:41:03 +00001142 partial_dir = sanitize_path(NULL, partial_dir, NULL, 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001143 if (backup_dir)
Wayne Davison10796f42004-08-11 23:41:03 +00001144 backup_dir = sanitize_path(NULL, backup_dir, NULL, 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001145 }
Wayne Davison78424182005-01-25 10:39:14 +00001146 if (server_filter_list.head && !am_sender) {
1147 struct filter_list_struct *elp = &server_filter_list;
Wayne Davisone012f852004-11-27 17:52:51 +00001148 int i;
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001149 if (tmpdir) {
Wayne Davison36719872005-02-11 10:42:55 +00001150 if (!*tmpdir)
1151 goto options_rejected;
Wayne Davison58b19992004-08-12 18:20:07 +00001152 clean_fname(tmpdir, 1);
Wayne Davison78424182005-01-25 10:39:14 +00001153 if (check_filter(elp, tmpdir, 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001154 goto options_rejected;
1155 }
Wayne Davison36719872005-02-11 10:42:55 +00001156 if (partial_dir && *partial_dir) {
Wayne Davison58b19992004-08-12 18:20:07 +00001157 clean_fname(partial_dir, 1);
Wayne Davison78424182005-01-25 10:39:14 +00001158 if (check_filter(elp, partial_dir, 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001159 goto options_rejected;
1160 }
Wayne Davisone012f852004-11-27 17:52:51 +00001161 for (i = 0; i < basis_dir_cnt; i++) {
Wayne Davison36719872005-02-11 10:42:55 +00001162 if (!*basis_dir[i])
1163 goto options_rejected;
Wayne Davisone012f852004-11-27 17:52:51 +00001164 clean_fname(basis_dir[i], 1);
Wayne Davison78424182005-01-25 10:39:14 +00001165 if (check_filter(elp, basis_dir[i], 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001166 goto options_rejected;
1167 }
1168 if (backup_dir) {
Wayne Davison36719872005-02-11 10:42:55 +00001169 if (!*backup_dir)
1170 goto options_rejected;
Wayne Davison58b19992004-08-12 18:20:07 +00001171 clean_fname(backup_dir, 1);
Wayne Davison305666b2005-03-01 01:15:57 +00001172 if (check_filter(elp, backup_dir, 1) < 0) {
1173 options_rejected:
1174 snprintf(err_buf, sizeof err_buf,
1175 "Your options have been rejected by the server.\n");
1176 return 0;
1177 }
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001178 }
1179 }
Wayne Davison7be73df2004-03-27 09:46:42 +00001180
Wayne Davisond175d7e2003-08-01 07:58:44 +00001181 if (!backup_suffix)
Wayne Davisone0391f82004-02-11 04:30:41 +00001182 backup_suffix = backup_dir ? "" : BACKUP_SUFFIX;
Wayne Davisond175d7e2003-08-01 07:58:44 +00001183 backup_suffix_len = strlen(backup_suffix);
Wayne Davison80ddadb2003-08-01 19:40:31 +00001184 if (strchr(backup_suffix, '/') != NULL) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001185 snprintf(err_buf, sizeof err_buf,
1186 "--suffix cannot contain slashes: %s\n",
Wayne Davison80ddadb2003-08-01 19:40:31 +00001187 backup_suffix);
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001188 return 0;
Wayne Davison80ddadb2003-08-01 19:40:31 +00001189 }
Wayne Davisone0391f82004-02-11 04:30:41 +00001190 if (backup_dir) {
1191 backup_dir_len = strlcpy(backup_dir_buf, backup_dir, sizeof backup_dir_buf);
1192 backup_dir_remainder = sizeof backup_dir_buf - backup_dir_len;
1193 if (backup_dir_remainder < 32) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001194 snprintf(err_buf, sizeof err_buf,
1195 "the --backup-dir path is WAY too long.\n");
1196 return 0;
Wayne Davisone0391f82004-02-11 04:30:41 +00001197 }
1198 if (backup_dir_buf[backup_dir_len - 1] != '/') {
1199 backup_dir_buf[backup_dir_len++] = '/';
1200 backup_dir_buf[backup_dir_len] = '\0';
1201 }
Wayne Davison0ee6ca92006-01-13 22:06:31 +00001202 if (verbose > 1 && !am_sender)
1203 rprintf(FINFO, "backup_dir is %s\n", backup_dir_buf);
Wayne Davison8dcf9332004-03-31 17:02:22 +00001204 } else if (!backup_suffix_len && (!am_server || !am_sender)) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001205 snprintf(err_buf, sizeof err_buf,
Wayne Davisond175d7e2003-08-01 07:58:44 +00001206 "--suffix cannot be a null string without --backup-dir\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001207 return 0;
Wayne Davisonc2c56822005-12-16 17:18:29 +00001208 } else if (delete_mode && !delete_excluded) {
1209 snprintf(backup_dir_buf, sizeof backup_dir_buf,
1210 "P *%s", backup_suffix);
1211 parse_rule(&filter_list, backup_dir_buf, 0, 0);
Wayne Davisond175d7e2003-08-01 07:58:44 +00001212 }
Wayne Davisond4021b62005-02-21 10:03:23 +00001213 if (make_backups && !backup_dir)
1214 omit_dir_times = 1;
Wayne Davisond175d7e2003-08-01 07:58:44 +00001215
Wayne Davisondd32e2c2005-11-07 04:28:35 +00001216 if (chmod_mode && !(chmod_modes = parse_chmod(chmod_mode))) {
1217 snprintf(err_buf, sizeof err_buf,
Wayne Davison0ee6ca92006-01-13 22:06:31 +00001218 "Invalid argument passed to --chmod\n");
Wayne Davisondd32e2c2005-11-07 04:28:35 +00001219 return 0;
1220 }
1221
Wayne Davisone7651882005-02-16 08:10:31 +00001222 if (log_format) {
Wayne Davison624d6be2005-03-31 00:21:15 +00001223 if (log_format_has(log_format, 'i'))
Wayne Davison684d7582005-02-19 22:16:39 +00001224 log_format_has_i = 1;
Wayne Davison624d6be2005-03-31 00:21:15 +00001225 if (!log_format_has(log_format, 'b')
1226 && !log_format_has(log_format, 'c'))
Wayne Davisone7651882005-02-16 08:10:31 +00001227 log_before_transfer = !am_server;
1228 } else if (itemize_changes) {
1229 log_format = "%i %n%L";
Wayne Davison684d7582005-02-19 22:16:39 +00001230 log_format_has_i = 1;
Wayne Davisone7651882005-02-16 08:10:31 +00001231 log_before_transfer = !am_server;
1232 }
Wayne Davison87383692005-02-16 17:02:08 +00001233
1234 if ((do_progress || dry_run) && !verbose && !log_before_transfer
Wayne Davison702cd152005-02-18 17:36:12 +00001235 && !am_server)
J.W. Schultze2559db2003-08-06 06:45:14 +00001236 verbose = 1;
Wayne Davison87383692005-02-16 17:02:08 +00001237
Wayne Davison11e758a2005-04-09 18:59:47 +00001238 if (dry_run)
1239 do_xfers = 0;
1240
Wayne Davison9ac756c2005-05-19 08:52:17 +00001241 set_io_timeout(io_timeout);
1242
Wayne Davison87383692005-02-16 17:02:08 +00001243 if (verbose && !log_format) {
1244 log_format = "%n%L";
1245 log_before_transfer = !am_server;
Wayne Davison36719872005-02-11 10:42:55 +00001246 }
Wayne Davison624d6be2005-03-31 00:21:15 +00001247 if (log_format_has_i || log_format_has(log_format, 'o'))
Wayne Davison5c5e1592005-02-19 03:54:11 +00001248 log_format_has_o_or_i = 1;
J.W. Schultze2559db2003-08-06 06:45:14 +00001249
Wayne Davison9fb08442004-11-17 19:29:20 +00001250 if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit))
1251 bwlimit = daemon_bwlimit;
Wayne Davison3c74c3a2004-05-27 21:51:53 +00001252 if (bwlimit) {
1253 bwlimit_writemax = (size_t)bwlimit * 128;
1254 if (bwlimit_writemax < 512)
1255 bwlimit_writemax = 512;
1256 }
1257
Wayne Davisoncfce9f62005-08-30 02:57:19 +00001258 if (sparse_files && inplace) {
Wayne Davisonc3851182005-08-30 02:59:30 +00001259 /* Note: we don't check for this below, because --append is
Wayne Davisoncfce9f62005-08-30 02:57:19 +00001260 * OK with --sparse (as long as redos are handled right). */
1261 snprintf(err_buf, sizeof err_buf,
1262 "--sparse cannot be used with --inplace\n");
1263 return 0;
1264 }
1265
Wayne Davisona0157882005-07-28 01:46:09 +00001266 if (append_mode) {
1267 if (whole_file > 0) {
1268 snprintf(err_buf, sizeof err_buf,
1269 "--append cannot be used with --whole-file\n");
1270 return 0;
1271 }
1272 if (refused_inplace) {
1273 create_refuse_error(refused_inplace);
1274 return 0;
1275 }
1276 inplace = 1;
1277 }
1278
Wayne Davisonf06e7082005-01-27 22:46:14 +00001279 if (delay_updates && !partial_dir)
Wayne Davison36719872005-02-11 10:42:55 +00001280 partial_dir = partialdir_for_delayupdate;
Wayne Davisonf06e7082005-01-27 22:46:14 +00001281
Wayne Davisona3221d22004-07-16 20:06:24 +00001282 if (inplace) {
Wayne Davison4f5b0752005-02-14 00:53:43 +00001283#ifdef HAVE_FTRUNCATE
Wayne Davisona7260c42004-07-29 16:06:38 +00001284 if (partial_dir) {
1285 snprintf(err_buf, sizeof err_buf,
Wayne Davisona0157882005-07-28 01:46:09 +00001286 "--%s cannot be used with --%s\n",
1287 append_mode ? "append" : "inplace",
Wayne Davisonf06e7082005-01-27 22:46:14 +00001288 delay_updates ? "delay-updates" : "partial-dir");
Wayne Davisona7260c42004-07-29 16:06:38 +00001289 return 0;
1290 }
Wayne Davison36719872005-02-11 10:42:55 +00001291 /* --inplace implies --partial for refusal purposes, but we
1292 * clear the keep_partial flag for internal logic purposes. */
1293 if (refused_partial) {
1294 create_refuse_error(refused_partial);
1295 return 0;
1296 }
Wayne Davisona3221d22004-07-16 20:06:24 +00001297 keep_partial = 0;
Wayne Davisonded4daf2005-01-15 20:22:54 +00001298#else
1299 snprintf(err_buf, sizeof err_buf,
Wayne Davisona0157882005-07-28 01:46:09 +00001300 "--%s is not supported on this %s\n",
1301 append_mode ? "append" : "inplace",
Wayne Davisonded4daf2005-01-15 20:22:54 +00001302 am_server ? "server" : "client");
1303 return 0;
1304#endif
Wayne Davison075aa182004-09-18 17:34:56 +00001305 } else {
Wayne Davison36719872005-02-11 10:42:55 +00001306 if (keep_partial && !partial_dir) {
1307 if ((arg = getenv("RSYNC_PARTIAL_DIR")) != NULL && *arg)
1308 partial_dir = strdup(arg);
1309 }
Wayne Davison075aa182004-09-18 17:34:56 +00001310 if (partial_dir) {
Wayne Davison36719872005-02-11 10:42:55 +00001311 if (*partial_dir)
1312 clean_fname(partial_dir, 1);
Wayne Davison075aa182004-09-18 17:34:56 +00001313 if (!*partial_dir || strcmp(partial_dir, ".") == 0)
1314 partial_dir = NULL;
Wayne Davison13791b12004-09-22 04:12:13 +00001315 else if (*partial_dir != '/') {
Wayne Davison3a5e9222005-02-04 21:13:03 +00001316 parse_rule(&filter_list, partial_dir,
Wayne Davison0a68f862005-02-03 19:00:17 +00001317 MATCHFLG_NO_PREFIXES|MATCHFLG_DIRECTORY, 0);
Wayne Davison13791b12004-09-22 04:12:13 +00001318 }
Wayne Davison36719872005-02-11 10:42:55 +00001319 if (!partial_dir && refused_partial) {
1320 create_refuse_error(refused_partial);
1321 return 0;
1322 }
Wayne Davison075aa182004-09-18 17:34:56 +00001323 keep_partial = 1;
1324 }
Wayne Davisona3221d22004-07-16 20:06:24 +00001325 }
1326
Wayne Davisonea5164d2003-03-30 23:00:42 +00001327 if (files_from) {
Wayne Davison305666b2005-03-01 01:15:57 +00001328 char *h, *p;
1329 int q;
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001330 if (*argc > 2 || (!am_daemon && *argc == 1)) {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001331 usage(FERROR);
1332 exit_cleanup(RERR_SYNTAX);
1333 }
Wayne Davison63596e12003-12-15 00:53:07 +00001334 if (strcmp(files_from, "-") == 0) {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001335 filesfrom_fd = 0;
Wayne Davison63596e12003-12-15 00:53:07 +00001336 if (am_server)
Wayne Davison305666b2005-03-01 01:15:57 +00001337 filesfrom_host = ""; /* reading from socket */
1338 } else if ((p = check_for_hostspec(files_from, &h, &q)) != 0) {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001339 if (am_server) {
Wayne Davison305666b2005-03-01 01:15:57 +00001340 snprintf(err_buf, sizeof err_buf,
1341 "The --files-from sent to the server cannot specify a host.\n");
1342 return 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001343 }
Wayne Davison305666b2005-03-01 01:15:57 +00001344 files_from = p;
1345 filesfrom_host = h;
1346 if (strcmp(files_from, "-") == 0) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001347 snprintf(err_buf, sizeof err_buf,
1348 "Invalid --files-from remote filename\n");
1349 return 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001350 }
1351 } else {
Wayne Davison305666b2005-03-01 01:15:57 +00001352 if (sanitize_paths)
1353 files_from = sanitize_path(NULL, files_from, NULL, 0);
1354 if (server_filter_list.head) {
1355 if (!*files_from)
1356 goto options_rejected;
1357 clean_fname(files_from, 1);
1358 if (check_filter(&server_filter_list, files_from, 0) < 0)
1359 goto options_rejected;
1360 }
Wayne Davisonea5164d2003-03-30 23:00:42 +00001361 filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);
1362 if (filesfrom_fd < 0) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001363 snprintf(err_buf, sizeof err_buf,
1364 "failed to open files-from file %s: %s\n",
1365 files_from, strerror(errno));
1366 return 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001367 }
1368 }
1369 }
1370
Wayne Davison7f2a1f62005-02-25 17:08:31 +00001371 am_starting_up = 0;
1372
Andrew Tridgellb11ed3b1998-07-19 04:50:48 +00001373 return 1;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001374}
1375
1376
Martin Pooldafe63c2002-04-16 01:38:21 +00001377/**
1378 * Construct a filtered list of options to pass through from the
1379 * client to the server.
1380 *
1381 * This involves setting options that will tell the server how to
1382 * behave, and also filtering out options that are processed only
1383 * locally.
1384 **/
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001385void server_options(char **args,int *argc)
1386{
Wayne Davison74ba98a2005-05-03 17:01:59 +00001387 static char argstr[64];
Andrew Tridgelld8537831998-07-17 10:00:43 +00001388 int ac = *argc;
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001389 char *arg;
David Dykstraef5d23e2000-06-06 21:13:05 +00001390
Andrew Tridgelld8537831998-07-17 10:00:43 +00001391 int i, x;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001392
David Dykstra93689aa2002-02-05 23:05:31 +00001393 if (blocking_io == -1)
1394 blocking_io = 0;
1395
Andrew Tridgelld8537831998-07-17 10:00:43 +00001396 args[ac++] = "--server";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001397
Wayne Davison1312d9f2002-08-01 00:37:01 +00001398 if (daemon_over_rsh) {
1399 args[ac++] = "--daemon";
1400 *argc = ac;
1401 /* if we're passing --daemon, we're done */
1402 return;
1403 }
1404
Andrew Tridgelld8537831998-07-17 10:00:43 +00001405 if (!am_sender)
1406 args[ac++] = "--sender";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001407
Andrew Tridgelld8537831998-07-17 10:00:43 +00001408 x = 1;
1409 argstr[0] = '-';
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001410 for (i = 0; i < verbose; i++)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001411 argstr[x++] = 'v';
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001412
David Dykstrab86f0ce1999-02-09 17:25:35 +00001413 /* the -q option is intentionally left out */
Andrew Tridgelld8537831998-07-17 10:00:43 +00001414 if (make_backups)
1415 argstr[x++] = 'b';
1416 if (update_only)
1417 argstr[x++] = 'u';
Wayne Davison4a34c6f2005-05-03 16:46:49 +00001418 if (!do_xfers) /* NOT "dry_run"! */
Andrew Tridgelld8537831998-07-17 10:00:43 +00001419 argstr[x++] = 'n';
1420 if (preserve_links)
1421 argstr[x++] = 'l';
1422 if (copy_links)
1423 argstr[x++] = 'L';
Wayne Davison65e4cda2005-01-24 00:17:39 +00001424 if (xfer_dirs > 1)
Wayne Davison5454d222005-01-29 21:25:44 +00001425 argstr[x++] = 'd';
Wayne Davison716e73d2004-06-05 16:16:30 +00001426 if (keep_dirlinks && am_sender)
1427 argstr[x++] = 'K';
Martin Pool1bfbf402002-03-19 03:21:53 +00001428
Wayne Davisondfa32482003-03-21 18:58:50 +00001429 if (whole_file > 0)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001430 argstr[x++] = 'W';
Martin Poolbceec822002-03-19 03:39:42 +00001431 /* We don't need to send --no-whole-file, because it's the
1432 * default for remote transfers, and in any case old versions
1433 * of rsync will not understand it. */
Wayne Davisondfa32482003-03-21 18:58:50 +00001434
Andrew Tridgelld8537831998-07-17 10:00:43 +00001435 if (preserve_hard_links)
1436 argstr[x++] = 'H';
1437 if (preserve_uid)
1438 argstr[x++] = 'o';
1439 if (preserve_gid)
1440 argstr[x++] = 'g';
1441 if (preserve_devices)
1442 argstr[x++] = 'D';
1443 if (preserve_times)
1444 argstr[x++] = 't';
Wayne Davisond4021b62005-02-21 10:03:23 +00001445 if (omit_dir_times == 2 && am_sender)
Wayne Davison20fb7b92005-01-24 00:51:32 +00001446 argstr[x++] = 'O';
Andrew Tridgelld8537831998-07-17 10:00:43 +00001447 if (preserve_perms)
1448 argstr[x++] = 'p';
Wayne Davisonaa7a6e82005-03-14 17:30:13 +00001449 if (recurse)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001450 argstr[x++] = 'r';
1451 if (always_checksum)
1452 argstr[x++] = 'c';
1453 if (cvs_exclude)
1454 argstr[x++] = 'C';
1455 if (ignore_times)
1456 argstr[x++] = 'I';
1457 if (relative_paths)
1458 argstr[x++] = 'R';
1459 if (one_file_system)
1460 argstr[x++] = 'x';
1461 if (sparse_files)
1462 argstr[x++] = 'S';
1463 if (do_compression)
1464 argstr[x++] = 'z';
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001465
Wayne Davison51d48392005-01-22 22:48:34 +00001466 /* This is a complete hack - blame Rusty. FIXME!
1467 * This hack is only needed for older rsync versions that
1468 * don't understand the --list-only option. */
Wayne Davisonda2a6c12005-03-17 00:52:33 +00001469 if (list_only == 1 && !recurse)
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001470 argstr[x++] = 'r';
1471
Andrew Tridgelld8537831998-07-17 10:00:43 +00001472 argstr[x] = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001473
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001474 if (x != 1)
1475 args[ac++] = argstr;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001476
Wayne Davison51d48392005-01-22 22:48:34 +00001477 if (list_only > 1)
1478 args[ac++] = "--list-only";
1479
Wayne Davison854a1aa2005-10-26 16:47:15 +00001480 if (do_compression && def_compress_level != Z_DEFAULT_COMPRESSION) {
1481 if (asprintf(&arg, "--compress-level=%d", def_compress_level) < 0)
1482 goto oom;
1483 args[ac++] = arg;
1484 }
1485
Wayne Davison5c5e1592005-02-19 03:54:11 +00001486 /* The server side doesn't use our log-format, but in certain
1487 * circumstances they need to know a little about the option. */
Wayne Davison684d7582005-02-19 22:16:39 +00001488 if (log_format && am_sender) {
1489 if (log_format_has_i)
1490 args[ac++] = "--log-format=%i";
1491 else if (log_format_has_o_or_i)
Wayne Davison5c5e1592005-02-19 03:54:11 +00001492 args[ac++] = "--log-format=%o";
1493 else if (!verbose)
1494 args[ac++] = "--log-format=X";
1495 }
Wayne Davison1f30a672005-02-19 02:39:30 +00001496
J.W. Schultz195bd902003-04-10 02:04:58 +00001497 if (block_size) {
Wayne Davisona06b4192005-01-01 21:08:14 +00001498 if (asprintf(&arg, "-B%lu", block_size) < 0)
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001499 goto oom;
1500 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001501 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001502
Andrew Tridgell0b73ca12000-01-23 11:43:04 +00001503 if (max_delete && am_sender) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001504 if (asprintf(&arg, "--max-delete=%d", max_delete) < 0)
1505 goto oom;
1506 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001507 }
1508
Wayne Davison74de13d2005-10-14 20:15:18 +00001509 if (min_size && am_sender) {
1510 args[ac++] = "--min-size";
1511 args[ac++] = min_size_arg;
1512 }
1513
Wayne Davison7d5acf12004-11-11 01:45:25 +00001514 if (max_size && am_sender) {
1515 args[ac++] = "--max-size";
1516 args[ac++] = max_size_arg;
1517 }
1518
Andrew Tridgelld8537831998-07-17 10:00:43 +00001519 if (io_timeout) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001520 if (asprintf(&arg, "--timeout=%d", io_timeout) < 0)
1521 goto oom;
1522 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001523 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001524
David Dykstraef5d23e2000-06-06 21:13:05 +00001525 if (bwlimit) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001526 if (asprintf(&arg, "--bwlimit=%d", bwlimit) < 0)
1527 goto oom;
1528 args[ac++] = arg;
David Dykstraef5d23e2000-06-06 21:13:05 +00001529 }
1530
Wayne Davisond175d7e2003-08-01 07:58:44 +00001531 if (backup_dir) {
1532 args[ac++] = "--backup-dir";
1533 args[ac++] = backup_dir;
1534 }
1535
1536 /* Only send --suffix if it specifies a non-default value. */
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001537 if (strcmp(backup_suffix, backup_dir ? "" : BACKUP_SUFFIX) != 0) {
Wayne Davison191e40d2003-08-01 20:19:51 +00001538 /* We use the following syntax to avoid weirdness with '~'. */
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001539 if (asprintf(&arg, "--suffix=%s", backup_suffix) < 0)
1540 goto oom;
1541 args[ac++] = arg;
Andrew Tridgelld8537831998-07-17 10:00:43 +00001542 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001543
Wayne Davison06a50542004-08-02 05:00:30 +00001544 if (am_sender) {
1545 if (delete_excluded)
1546 args[ac++] = "--delete-excluded";
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +00001547 else if (delete_before == 1 || delete_after)
Wayne Davison06a50542004-08-02 05:00:30 +00001548 args[ac++] = "--delete";
Wayne Davison57f74bd2005-01-28 07:50:00 +00001549 if (delete_before > 1)
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +00001550 args[ac++] = "--delete-before";
Wayne Davison3359acb2005-01-25 03:08:58 +00001551 if (delete_during)
1552 args[ac++] = "--delete-during";
Wayne Davison06a50542004-08-02 05:00:30 +00001553 if (delete_after)
1554 args[ac++] = "--delete-after";
Wayne Davison06a50542004-08-02 05:00:30 +00001555 if (force_delete)
1556 args[ac++] = "--force";
Wayne Davison11e758a2005-04-09 18:59:47 +00001557 if (write_batch < 0)
1558 args[ac++] = "--only-write-batch=X";
Wayne Davison06a50542004-08-02 05:00:30 +00001559 }
David Dykstrab33b7911999-02-22 19:55:57 +00001560
Andrew Tridgellf83f0541999-02-18 03:48:24 +00001561 if (size_only)
1562 args[ac++] = "--size-only";
1563
Andrew Tridgell5b56cc12000-09-06 02:12:13 +00001564 if (modify_window_set) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001565 if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
1566 goto oom;
1567 args[ac++] = arg;
Andrew Tridgell5b56cc12000-09-06 02:12:13 +00001568 }
1569
Wayne Davisonc8d895d2004-05-21 09:44:32 +00001570 if (checksum_seed) {
Wayne Davison221ddb92004-05-22 06:09:22 +00001571 if (asprintf(&arg, "--checksum-seed=%d", checksum_seed) < 0)
Wayne Davisonc8d895d2004-05-21 09:44:32 +00001572 goto oom;
1573 args[ac++] = arg;
1574 }
1575
Wayne Davisona7260c42004-07-29 16:06:38 +00001576 if (partial_dir && am_sender) {
Wayne Davison36719872005-02-11 10:42:55 +00001577 if (partial_dir != partialdir_for_delayupdate) {
1578 args[ac++] = "--partial-dir";
1579 args[ac++] = partial_dir;
1580 }
Wayne Davisonf06e7082005-01-27 22:46:14 +00001581 if (delay_updates)
1582 args[ac++] = "--delay-updates";
Wayne Davisona7260c42004-07-29 16:06:38 +00001583 } else if (keep_partial)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001584 args[ac++] = "--partial";
Andrew Tridgellc95da961998-07-01 03:36:03 +00001585
Andrew Tridgellef55c682000-03-21 04:06:04 +00001586 if (ignore_errors)
1587 args[ac++] = "--ignore-errors";
1588
David Dykstrab5313601999-02-17 19:34:40 +00001589 if (copy_unsafe_links)
1590 args[ac++] = "--copy-unsafe-links";
1591
Andrew Tridgelld8537831998-07-17 10:00:43 +00001592 if (safe_symlinks)
1593 args[ac++] = "--safe-links";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001594
Andrew Tridgelld8537831998-07-17 10:00:43 +00001595 if (numeric_ids)
1596 args[ac++] = "--numeric-ids";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001597
Wayne Davisone90aab42005-09-29 18:07:55 +00001598 if (ignore_existing && am_sender)
Martin Pool3d6fead2002-01-25 10:42:23 +00001599 args[ac++] = "--ignore-existing";
1600
Wayne Davisone90aab42005-09-29 18:07:55 +00001601 /* Backward compatibility: send --existing, not --ignore-non-existing. */
1602 if (ignore_non_existing && am_sender)
1603 args[ac++] = "--existing";
1604
Wayne Davisona0157882005-07-28 01:46:09 +00001605 if (append_mode)
1606 args[ac++] = "--append";
1607 else if (inplace)
Wayne Davisona3221d22004-07-16 20:06:24 +00001608 args[ac++] = "--inplace";
1609
Andrew Tridgelld8537831998-07-17 10:00:43 +00001610 if (tmpdir) {
1611 args[ac++] = "--temp-dir";
1612 args[ac++] = tmpdir;
1613 }
1614
Wayne Davisone012f852004-11-27 17:52:51 +00001615 if (basis_dir[0] && am_sender) {
David Dykstra375a4551998-10-26 21:42:38 +00001616 /* the server only needs this option if it is not the sender,
1617 * and it may be an older version that doesn't know this
1618 * option, so don't send it if client is the sender.
1619 */
Wayne Davisone012f852004-11-27 17:52:51 +00001620 int i;
1621 for (i = 0; i < basis_dir_cnt; i++) {
1622 args[ac++] = dest_option;
1623 args[ac++] = basis_dir[i];
1624 }
David Dykstra375a4551998-10-26 21:42:38 +00001625 }
1626
Wayne Davisondd32e2c2005-11-07 04:28:35 +00001627 if (chmod_mode && !am_sender) {
1628 args[ac++] = "--chmod";
1629 args[ac++] = chmod_mode;
1630 }
1631
Wayne Davison305666b2005-03-01 01:15:57 +00001632 if (files_from && (!am_sender || filesfrom_host)) {
1633 if (filesfrom_host) {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001634 args[ac++] = "--files-from";
Wayne Davison305666b2005-03-01 01:15:57 +00001635 args[ac++] = files_from;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001636 if (eol_nulls)
1637 args[ac++] = "--from0";
1638 } else {
1639 args[ac++] = "--files-from=-";
1640 args[ac++] = "--from0";
1641 }
Wayne Davisonc0ab28d2004-12-22 09:10:08 +00001642 if (!relative_paths)
1643 args[ac++] = "--no-relative";
Wayne Davisonea5164d2003-03-30 23:00:42 +00001644 }
Wayne Davison89f2a4c2005-07-22 19:05:25 +00001645 if (relative_paths && !implied_dirs && !am_sender)
Wayne Davison3a90ea02005-01-19 00:23:32 +00001646 args[ac++] = "--no-implied-dirs";
Wayne Davisonea5164d2003-03-30 23:00:42 +00001647
Wayne Davisonc4ed1482005-02-14 02:41:15 +00001648 if (fuzzy_basis && am_sender)
1649 args[ac++] = "--fuzzy";
1650
Wayne Davison07c6ae72005-02-20 01:04:40 +00001651 if (remove_sent_files)
1652 args[ac++] = "--remove-sent-files";
1653
Andrew Tridgelld8537831998-07-17 10:00:43 +00001654 *argc = ac;
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001655 return;
1656
1657 oom:
1658 out_of_memory("server_options");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001659}
1660
Wayne Davison305666b2005-03-01 01:15:57 +00001661/* Look for a HOST specfication of the form "HOST:PATH", "HOST::PATH", or
1662 * "rsync://HOST:PORT/PATH". If found, *host_ptr will be set to some allocated
1663 * memory with the HOST. If a daemon-accessing spec was specified, the value
1664 * of *port_ptr will contain a non-0 port number, otherwise it will be set to
1665 * 0. The return value is a pointer to the PATH. Note that the HOST spec can
1666 * be an IPv6 literal address enclosed in '[' and ']' (such as "[::1]" or
1667 * "[::ffff:127.0.0.1]") which is returned without the '[' and ']'. */
1668char *check_for_hostspec(char *s, char **host_ptr, int *port_ptr)
Wayne Davisonea5164d2003-03-30 23:00:42 +00001669{
Wayne Davison305666b2005-03-01 01:15:57 +00001670 char *p;
1671 int not_host;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001672
Wayne Davison305666b2005-03-01 01:15:57 +00001673 if (port_ptr && strncasecmp(URL_PREFIX, s, strlen(URL_PREFIX)) == 0) {
1674 char *path;
1675 int hostlen;
1676 s += strlen(URL_PREFIX);
1677 if ((p = strchr(s, '/')) != NULL) {
1678 hostlen = p - s;
1679 path = p + 1;
1680 } else {
1681 hostlen = strlen(s);
1682 path = "";
1683 }
1684 if (*s == '[' && (p = strchr(s, ']')) != NULL) {
1685 s++;
1686 hostlen = p - s;
Wayne Davisonc60b7052005-03-01 05:49:11 +00001687 if (p[1] == ':')
1688 *port_ptr = atoi(p+2);
Wayne Davison305666b2005-03-01 01:15:57 +00001689 } else {
1690 if ((p = strchr(s, ':')) != NULL) {
1691 hostlen = p - s;
1692 *port_ptr = atoi(p+1);
Wayne Davisonc60b7052005-03-01 05:49:11 +00001693 }
Wayne Davison305666b2005-03-01 01:15:57 +00001694 }
Wayne Davisonc60b7052005-03-01 05:49:11 +00001695 if (!*port_ptr)
1696 *port_ptr = RSYNC_PORT;
Wayne Davison305666b2005-03-01 01:15:57 +00001697 *host_ptr = new_array(char, hostlen + 1);
1698 strlcpy(*host_ptr, s, hostlen + 1);
1699 return path;
1700 }
Wayne Davisonea5164d2003-03-30 23:00:42 +00001701
Wayne Davison305666b2005-03-01 01:15:57 +00001702 if (*s == '[' && (p = strchr(s, ']')) != NULL && p[1] == ':') {
1703 s++;
1704 *p = '\0';
1705 not_host = strchr(s, '/') || !strchr(s, ':');
1706 *p = ']';
1707 if (not_host)
1708 return NULL;
Wayne Davisonc60b7052005-03-01 05:49:11 +00001709 p++;
Wayne Davison305666b2005-03-01 01:15:57 +00001710 } else {
1711 if (!(p = strchr(s, ':')))
1712 return NULL;
1713 *p = '\0';
1714 not_host = strchr(s, '/') != NULL;
1715 *p = ':';
1716 if (not_host)
1717 return NULL;
1718 }
Wayne Davisonea5164d2003-03-30 23:00:42 +00001719
Wayne Davison305666b2005-03-01 01:15:57 +00001720 *host_ptr = new_array(char, p - s + 1);
1721 strlcpy(*host_ptr, s, p - s + 1);
1722
1723 if (p[1] == ':') {
1724 if (port_ptr && !*port_ptr)
1725 *port_ptr = RSYNC_PORT;
1726 return p + 2;
1727 }
1728 if (port_ptr)
1729 *port_ptr = 0;
1730
1731 return p + 1;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001732}