blob: cb9bbafe7261664256c76e2a666099e387ac1b87 [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"
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000023
Wayne Davison7bc90b32005-01-29 20:48:20 +000024extern int module_id;
Wayne Davison7be73df2004-03-27 09:46:42 +000025extern int sanitize_paths;
Wayne Davison99218d82004-06-06 19:02:40 +000026extern int select_timeout;
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 Davisondfa32482003-03-21 18:58:50 +000042int archive_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 Davisona5c11132004-02-09 17:45:22 +000056int ignore_times = 0;
57int delete_mode = 0;
Wayne Davisona51b3162005-01-24 01:41:54 +000058int delete_during = 0;
Wayne Davison51d48392005-01-22 22:48:34 +000059int delete_before = 0;
60int delete_after = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000061int delete_excluded = 0;
Wayne Davison07c6ae72005-02-20 01:04:40 +000062int remove_sent_files = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000063int one_file_system = 0;
Wayne Davison4f3e9a02003-09-09 15:58:56 +000064int protocol_version = PROTOCOL_VERSION;
Wayne Davisona5c11132004-02-09 17:45:22 +000065int sparse_files = 0;
66int do_compression = 0;
67int am_root = 0;
Wayne Davison7f2a1f62005-02-25 17:08:31 +000068int am_server = 0;
69int am_sender = 0;
70int am_generator = 0;
71int am_starting_up = 1;
Wayne Davisona5c11132004-02-09 17:45:22 +000072int orig_umask = 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +000073int relative_paths = -1;
74int implied_dirs = 1;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000075int numeric_ids = 0;
76int force_delete = 0;
77int io_timeout = 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +000078char *files_from = NULL;
79int filesfrom_fd = -1;
Wayne Davison305666b2005-03-01 01:15:57 +000080char *filesfrom_host = NULL;
Wayne Davisonea5164d2003-03-30 23:00:42 +000081int eol_nulls = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000082int recurse = 0;
Wayne Davison65e4cda2005-01-24 00:17:39 +000083int xfer_dirs = 0;
Wayne Davison1312d9f2002-08-01 00:37:01 +000084int am_daemon = 0;
85int daemon_over_rsh = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000086int do_stats = 0;
87int do_progress = 0;
88int keep_partial = 0;
89int safe_symlinks = 0;
90int copy_unsafe_links = 0;
91int size_only = 0;
Wayne Davison9fb08442004-11-17 19:29:20 +000092int daemon_bwlimit = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000093int bwlimit = 0;
Wayne Davisonc4ed1482005-02-14 02:41:15 +000094int fuzzy_basis = 0;
Wayne Davison3c74c3a2004-05-27 21:51:53 +000095size_t bwlimit_writemax = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000096int only_existing = 0;
97int opt_ignore_existing = 0;
Wayne Davison07c6ae72005-02-20 01:04:40 +000098int need_messages_from_generator = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000099int max_delete = 0;
Wayne Davison7d5acf12004-11-11 01:45:25 +0000100OFF_T max_size = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +0000101int ignore_errors = 0;
102int modify_window = 0;
103int blocking_io = -1;
Wayne Davison2289bf62004-02-09 18:32:54 +0000104int checksum_seed = 0;
Wayne Davisona3221d22004-07-16 20:06:24 +0000105int inplace = 0;
Wayne Davisonf06e7082005-01-27 22:46:14 +0000106int delay_updates = 0;
Wayne Davisona06b4192005-01-01 21:08:14 +0000107long block_size = 0; /* "long" because popt can't set an int32. */
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000108
Martin Poolb35d0d82002-04-08 04:10:20 +0000109
Martin Pool13e29992001-12-18 05:54:57 +0000110/** Network address family. **/
Wayne Davison4f5b0752005-02-14 00:53:43 +0000111#ifdef INET6
Martin Pool13e29992001-12-18 05:54:57 +0000112int default_af_hint = 0; /* Any protocol */
David Dykstra6ab6d4b2001-12-14 18:25:51 +0000113#else
Martin Pool13e29992001-12-18 05:54:57 +0000114int default_af_hint = AF_INET; /* Must use IPv4 */
David Dykstra6ab6d4b2001-12-14 18:25:51 +0000115#endif
Martin Pool06963d02001-11-23 07:35:49 +0000116
Martin Pool13e29992001-12-18 05:54:57 +0000117/** Do not go into the background when run as --daemon. Good
118 * for debugging and required for running as a service on W32,
119 * or under Unix process-monitors. **/
Wayne Davison1f35bab2005-02-21 00:31:31 +0000120int no_detach
121#if defined _WIN32 || defined __WIN32__
122 = 1;
123#else
124 = 0;
125#endif
Martin Pool13e29992001-12-18 05:54:57 +0000126
David Dykstra088aac82002-02-06 21:20:48 +0000127int write_batch = 0;
128int read_batch = 0;
Wayne Davisond175d7e2003-08-01 07:58:44 +0000129int backup_dir_len = 0;
130int backup_suffix_len;
Wayne Davisone0391f82004-02-11 04:30:41 +0000131unsigned int backup_dir_remainder;
Martin Pool6902ed12001-08-14 02:04:47 +0000132
Wayne Davisond175d7e2003-08-01 07:58:44 +0000133char *backup_suffix = NULL;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000134char *tmpdir = NULL;
Wayne Davisona7260c42004-07-29 16:06:38 +0000135char *partial_dir = NULL;
Wayne Davisone012f852004-11-27 17:52:51 +0000136char *basis_dir[MAX_BASIS_DIRS+1];
David Dykstra30e8c8e2002-08-30 23:27:26 +0000137char *config_file = NULL;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000138char *shell_cmd = NULL;
Andrew Tridgellb6062651998-11-03 03:48:47 +0000139char *log_format = NULL;
Andrew Tridgell65575e91999-01-08 10:32:56 +0000140char *password_file = NULL;
David Dykstra41bd28f2001-06-12 19:33:41 +0000141char *rsync_path = RSYNC_PATH;
Andrew Tridgell66203a92000-01-24 04:58:53 +0000142char *backup_dir = NULL;
Wayne Davisone0391f82004-02-11 04:30:41 +0000143char backup_dir_buf[MAXPATHLEN];
Wayne Davison0c56b1a2004-11-27 18:24:12 +0000144int rsync_port = 0;
Wayne Davisondfd7d542005-01-15 20:54:25 +0000145int compare_dest = 0;
Wayne Davison1de3e992005-03-11 17:35:59 +0000146int copy_dest = 0;
David Dykstra59c95e42002-08-29 14:44:55 +0000147int link_dest = 0;
Wayne Davisonce0b3842005-01-15 21:12:58 +0000148int basis_dir_cnt = 0;
Wayne Davisonf9a9f542005-03-09 18:53:53 +0000149char *dest_option = NULL;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000150
151int verbose = 0;
David Dykstrab86f0ce1999-02-09 17:25:35 +0000152int quiet = 0;
Wayne Davisonb78296c2005-02-15 07:41:13 +0000153int itemize_changes = 0;
Wayne Davisone7651882005-02-16 08:10:31 +0000154int log_before_transfer = 0;
Wayne Davison684d7582005-02-19 22:16:39 +0000155int log_format_has_i = 0;
Wayne Davison5c5e1592005-02-19 03:54:11 +0000156int log_format_has_o_or_i = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000157int always_checksum = 0;
Andrew Tridgellf7632fc1998-11-02 00:52:01 +0000158int list_only = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000159
Wayne Davison9b3318b2004-07-15 16:27:02 +0000160#define MAX_BATCH_NAME_LEN 256 /* Must be less than MAXPATHLEN-13 */
161char *batch_name = NULL;
Martin Pool6902ed12001-08-14 02:04:47 +0000162
Wayne Davisone1add892004-02-01 17:29:41 +0000163static int daemon_opt; /* sets am_daemon after option error-reporting */
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000164static int F_option_cnt = 0;
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000165static int modify_window_set;
Wayne Davison702cd152005-02-18 17:36:12 +0000166static int refused_delete, refused_archive_part;
Wayne Davison3296f912005-02-15 21:15:58 +0000167static int refused_partial, refused_progress, refused_delete_before;
Wayne Davison7d5acf12004-11-11 01:45:25 +0000168static char *max_size_arg;
Wayne Davison36719872005-02-11 10:42:55 +0000169static char partialdir_for_delayupdate[] = ".~tmp~";
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000170
Martin Pool06963d02001-11-23 07:35:49 +0000171/** Local address to bind. As a character string because it's
Wayne Davisonfdf57ed2004-06-20 19:47:05 +0000172 * interpreted by the IPv6 layer: should be a numeric IP4 or IP6
Martin Pool06963d02001-11-23 07:35:49 +0000173 * address, or a hostname. **/
174char *bind_address;
Andrew Tridgell5c9730a1999-10-31 03:21:02 +0000175
Martin Pool7a24c342000-11-09 09:05:14 +0000176
Martin Pool27a12342001-12-05 13:45:51 +0000177static void print_rsync_version(enum logcode f)
Martin Pool7a24c342000-11-09 09:05:14 +0000178{
Wayne Davisondfa32482003-03-21 18:58:50 +0000179 char const *got_socketpair = "no ";
Wayne Davisona3221d22004-07-16 20:06:24 +0000180 char const *have_inplace = "no ";
Wayne Davisondfa32482003-03-21 18:58:50 +0000181 char const *hardlinks = "no ";
182 char const *links = "no ";
Martin Poola3584492001-11-24 04:57:41 +0000183 char const *ipv6 = "no ";
Martin Pool736a6a22002-01-11 07:15:16 +0000184 STRUCT_STAT *dumstat;
Martin Pool0c80cd82000-11-10 03:41:47 +0000185
Wayne Davison4f5b0752005-02-14 00:53:43 +0000186#ifdef HAVE_SOCKETPAIR
Wayne Davisondfa32482003-03-21 18:58:50 +0000187 got_socketpair = "";
Martin Pool0c80cd82000-11-10 03:41:47 +0000188#endif
Martin Pool2855f612001-02-23 01:02:31 +0000189
Wayne Davison4f5b0752005-02-14 00:53:43 +0000190#ifdef HAVE_FTRUNCATE
Wayne Davisona3221d22004-07-16 20:06:24 +0000191 have_inplace = "";
192#endif
193
Wayne Davison4f5b0752005-02-14 00:53:43 +0000194#ifdef SUPPORT_HARD_LINKS
Wayne Davisondfa32482003-03-21 18:58:50 +0000195 hardlinks = "";
Martin Pool2855f612001-02-23 01:02:31 +0000196#endif
197
Wayne Davison4f5b0752005-02-14 00:53:43 +0000198#ifdef SUPPORT_LINKS
Wayne Davisondfa32482003-03-21 18:58:50 +0000199 links = "";
Martin Pool2855f612001-02-23 01:02:31 +0000200#endif
201
Wayne Davison4f5b0752005-02-14 00:53:43 +0000202#ifdef INET6
Martin Poola3584492001-11-24 04:57:41 +0000203 ipv6 = "";
Wayne Davisondfa32482003-03-21 18:58:50 +0000204#endif
Martin Poola3584492001-11-24 04:57:41 +0000205
Wayne Davisondfa32482003-03-21 18:58:50 +0000206 rprintf(f, "%s version %s protocol version %d\n",
207 RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
208 rprintf(f,
Wayne Davison72a90c72005-01-27 21:42:56 +0000209 "Copyright (C) 1996-2005 by Andrew Tridgell and others\n");
Martin Pool3b4b1982001-08-14 02:08:17 +0000210 rprintf(f, "<http://rsync.samba.org/>\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000211 rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
212 "%shard links, %ssymlinks, batchfiles, \n",
Wayne Davisona5c11132004-02-09 17:45:22 +0000213 (int) (sizeof (OFF_T) * 8),
Wayne Davisondfa32482003-03-21 18:58:50 +0000214 got_socketpair, hardlinks, links);
Martin Pool2855f612001-02-23 01:02:31 +0000215
Martin Pool736a6a22002-01-11 07:15:16 +0000216 /* Note that this field may not have type ino_t. It depends
217 * on the complicated interaction between largefile feature
218 * macros. */
Wayne Davisona3221d22004-07-16 20:06:24 +0000219 rprintf(f, " %sinplace, %sIPv6, %d-bit system inums, %d-bit internal inums\n",
220 have_inplace, ipv6,
Wayne Davisona5c11132004-02-09 17:45:22 +0000221 (int) (sizeof dumstat->st_ino * 8),
Wayne Davison14908122005-01-20 22:42:47 +0000222 (int) (sizeof (int64) * 8));
Martin Poolfc0302c2002-04-08 07:36:05 +0000223#ifdef MAINTAINER_MODE
224 rprintf(f, " panic action: \"%s\"\n",
225 get_panic_action());
226#endif
Martin Pool736a6a22002-01-11 07:15:16 +0000227
Wayne Davison031fa9a2005-01-28 06:46:33 +0000228#if SIZEOF_INT64 < 8
229 rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
Martin Pool7a24c342000-11-09 09:05:14 +0000230#endif
Wayne Davisonc561eda2005-01-28 06:51:44 +0000231 if (sizeof (int64) != SIZEOF_INT64) {
232 rprintf(f,
233 "WARNING: size mismatch in SIZEOF_INT64 define (%d != %d)\n",
234 (int) SIZEOF_INT64, (int) sizeof (int64));
235 }
Martin Pool7b329a22002-03-19 05:00:05 +0000236
237 rprintf(f,
238"\n"
239"rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
240"are welcome to redistribute it under certain conditions. See the GNU\n"
241"General Public Licence for details.\n"
242 );
Martin Pool7a24c342000-11-09 09:05:14 +0000243}
244
245
Andrew Tridgell0f3203c2000-01-29 02:49:03 +0000246void usage(enum logcode F)
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000247{
Martin Pool2855f612001-02-23 01:02:31 +0000248 print_rsync_version(F);
Andrew Tridgell704f9081998-06-18 09:31:42 +0000249
Martin Pool3ff984d2002-03-19 05:09:19 +0000250 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 +0000251
David Dykstra9ef53901999-02-10 19:33:05 +0000252 rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000253 rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC DEST\n");
David Dykstra9ef53901999-02-10 19:33:05 +0000254 rprintf(F," or rsync [OPTION]... SRC [SRC]... DEST\n");
David Dykstra14d43f11998-11-18 17:36:36 +0000255 rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
David Dykstra9ef53901999-02-10 19:33:05 +0000256 rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
David Dykstra14d43f11998-11-18 17:36:36 +0000257 rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n");
Wayne Davisoneaa4c152002-08-01 17:55:11 +0000258 rprintf(F," or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST\n");
David Dykstra9ef53901999-02-10 19:33:05 +0000259 rprintf(F,"SRC on single-colon remote HOST will be expanded by remote shell\n");
260 rprintf(F,"SRC on server remote HOST may contain shell wildcards or multiple\n");
261 rprintf(F," sources separated by space as long as they have same top-level\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000262 rprintf(F,"\nOptions\n");
263 rprintf(F," -v, --verbose increase verbosity\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000264 rprintf(F," -q, --quiet suppress non-error messages\n");
265 rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n");
266 rprintf(F," -a, --archive archive mode; same as -rlptgoD (no -H)\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000267 rprintf(F," -r, --recursive recurse into directories\n");
268 rprintf(F," -R, --relative use relative path names\n");
Wayne Davisonea5164d2003-03-30 23:00:42 +0000269 rprintf(F," --no-relative turn off --relative\n");
270 rprintf(F," --no-implied-dirs don't send implied dirs with -R\n");
Wayne Davison68391402003-12-30 18:16:25 +0000271 rprintf(F," -b, --backup make backups (see --suffix & --backup-dir)\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000272 rprintf(F," --backup-dir=DIR make backups into hierarchy based in DIR\n");
273 rprintf(F," --suffix=SUFFIX set backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
274 rprintf(F," -u, --update skip files that are newer on the receiver\n");
Wayne Davison4ce838e2005-01-17 23:11:18 +0000275 rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000276 rprintf(F," -d, --dirs transfer directories without recursing\n");
Martin Pool13e29992001-12-18 05:54:57 +0000277 rprintf(F," -l, --links copy symlinks as symlinks\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000278 rprintf(F," -L, --copy-links transform symlink into referent file/dir\n");
279 rprintf(F," --copy-unsafe-links only \"unsafe\" symlinks are transformed\n");
280 rprintf(F," --safe-links ignore symlinks that point outside the source tree\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000281 rprintf(F," -H, --hard-links preserve hard links\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000282 rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000283 rprintf(F," -p, --perms preserve permissions\n");
284 rprintf(F," -o, --owner preserve owner (root only)\n");
285 rprintf(F," -g, --group preserve group\n");
286 rprintf(F," -D, --devices preserve devices (root only)\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000287 rprintf(F," -t, --times preserve times\n");
Wayne Davison20fb7b92005-01-24 00:51:32 +0000288 rprintf(F," -O, --omit-dir-times omit directories when preserving times\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000289 rprintf(F," -S, --sparse handle sparse files efficiently\n");
290 rprintf(F," -n, --dry-run show what would have been transferred\n");
Wayne Davison98bf61c2005-02-14 19:09:30 +0000291 rprintf(F," -W, --whole-file copy files whole (without rsync algorithm)\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000292 rprintf(F," --no-whole-file always use incremental rsync algorithm\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000293 rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n");
Wayne Davison9cd339e2004-08-03 08:05:20 +0000294 rprintf(F," -B, --block-size=SIZE force a fixed checksum block-size\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000295 rprintf(F," -e, --rsh=COMMAND specify the remote shell to use\n");
Wayne Davison05ee4862005-03-02 09:17:42 +0000296 rprintf(F," --rsync-path=PROGRAM specify the rsync to run on the remote machine\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000297 rprintf(F," --existing only update files that already exist on receiver\n");
Wayne Davison68391402003-12-30 18:16:25 +0000298 rprintf(F," --ignore-existing ignore files that already exist on receiving side\n");
Wayne Davison07c6ae72005-02-20 01:04:40 +0000299 rprintf(F," --remove-sent-files sent files/symlinks are removed from sending side\n");
Wayne Davison3359acb2005-01-25 03:08:58 +0000300 rprintf(F," --del an alias for --delete-during\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000301 rprintf(F," --delete delete files that don't exist on the sending side\n");
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000302 rprintf(F," --delete-before receiver deletes before transfer (default)\n");
Wayne Davison3359acb2005-01-25 03:08:58 +0000303 rprintf(F," --delete-during receiver deletes during transfer, not before\n");
304 rprintf(F," --delete-after receiver deletes after transfer, not before\n");
Wayne Davison51d48392005-01-22 22:48:34 +0000305 rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000306 rprintf(F," --ignore-errors delete even if there are I/O errors\n");
Wayne Davison51d48392005-01-22 22:48:34 +0000307 rprintf(F," --force force deletion of directories even if not empty\n");
Andrew Tridgell0b73ca12000-01-23 11:43:04 +0000308 rprintf(F," --max-delete=NUM don't delete more than NUM files\n");
Wayne Davison7d5acf12004-11-11 01:45:25 +0000309 rprintf(F," --max-size=SIZE don't transfer any file larger than SIZE\n");
Andrew Tridgellc95da961998-07-01 03:36:03 +0000310 rprintf(F," --partial keep partially transferred files\n");
Wayne Davisona7260c42004-07-29 16:06:38 +0000311 rprintf(F," --partial-dir=DIR put a partially transferred file into DIR\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000312 rprintf(F," --delay-updates put all updated files into place at transfer's end\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000313 rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000314 rprintf(F," --timeout=TIME set I/O timeout in seconds\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000315 rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n");
316 rprintf(F," --size-only skip files that match in size\n");
317 rprintf(F," --modify-window=NUM compare mod-times with reduced accuracy\n");
Wayne Davison4db88e52004-07-22 15:43:28 +0000318 rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n");
Wayne Davisonc4ed1482005-02-14 02:41:15 +0000319 rprintf(F," -y, --fuzzy find similar file for basis if no dest file\n");
David Dykstra375a4551998-10-26 21:42:38 +0000320 rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
Wayne Davison1de3e992005-03-11 17:35:59 +0000321 rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
Wayne Davisone012f852004-11-27 17:52:51 +0000322 rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
Wayne Davisonf9249462005-02-12 22:22:14 +0000323 rprintf(F," -z, --compress compress file data during the transfer\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000324 rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000325 rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
Wayne Davison9c71f562005-02-13 05:44:29 +0000326 rprintf(F," -F same as --filter='dir-merge /.rsync-filter'\n");
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000327 rprintf(F," repeated: --filter='- .rsync-filter'\n");
David Dykstra2acf81e1998-11-03 21:17:40 +0000328 rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000329 rprintf(F," --exclude-from=FILE read exclude patterns from FILE\n");
David Dykstra2acf81e1998-11-03 21:17:40 +0000330 rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000331 rprintf(F," --include-from=FILE read include patterns from FILE\n");
332 rprintf(F," --files-from=FILE read list of source-file names from FILE\n");
Wayne Davison4db88e52004-07-22 15:43:28 +0000333 rprintf(F," -0, --from0 all *-from file lists are delimited by nulls\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000334 rprintf(F," --version print version number\n");
Wayne Davisonb4713292004-12-08 17:29:54 +0000335 rprintf(F," --port=PORT specify double-colon alternate port number\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000336 rprintf(F," --blocking-io use blocking I/O for the remote shell\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000337 rprintf(F," --no-blocking-io turn off blocking I/O when it is the default\n");
338 rprintf(F," --stats give some file-transfer stats\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000339 rprintf(F," --progress show progress during transfer\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000340 rprintf(F," -P same as --partial --progress\n");
Wayne Davisonb78296c2005-02-15 07:41:13 +0000341 rprintf(F," -i, --itemize-changes output a change-summary for all updates\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000342 rprintf(F," --log-format=FORMAT log file-transfers using specified format\n");
343 rprintf(F," --password-file=FILE read password from FILE\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000344 rprintf(F," --list-only list the files instead of copying them\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000345 rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
346 rprintf(F," --write-batch=FILE write a batched update to FILE\n");
347 rprintf(F," --read-batch=FILE read a batched update from FILE\n");
Wayne Davison4f5b0752005-02-14 00:53:43 +0000348#ifdef INET6
Wayne Davison4db88e52004-07-22 15:43:28 +0000349 rprintf(F," -4, --ipv4 prefer IPv4\n");
350 rprintf(F," -6, --ipv6 prefer IPv6\n");
Martin Pool06963d02001-11-23 07:35:49 +0000351#endif
Wayne Davison3dd22902004-05-06 21:08:01 +0000352 rprintf(F," -h, --help show this help screen\n");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000353
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000354 rprintf(F,"\nUse \"rsync --daemon --help\" to see the daemon-mode command-line options.\n");
355 rprintf(F,"Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation.\n");
Martin Pool2855f612001-02-23 01:02:31 +0000356 rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and answers\n");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000357}
358
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000359enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
Wayne Davison1de3e992005-03-11 17:35:59 +0000360 OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST,
Wayne Davison1f3d6cd2003-08-05 17:56:54 +0000361 OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
Wayne Davison7d5acf12004-11-11 01:45:25 +0000362 OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE,
Wayne Davisonc67d1382004-02-22 08:56:43 +0000363 OPT_REFUSED_BASE = 9000};
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000364
Martin Pool2855f612001-02-23 01:02:31 +0000365static struct poptOption long_options[] = {
366 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
Wayne Davison8db7cc22004-10-11 10:43:25 +0000367 {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
Wayne Davisond175d7e2003-08-01 07:58:44 +0000368 {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
Wayne Davison3dd22902004-05-06 21:08:01 +0000369 {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
370 {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000371 {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
372 {"size-only", 0, POPT_ARG_NONE, &size_only, 0, 0, 0 },
Martin Pool8b54f002002-03-19 04:10:07 +0000373 {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000374 {"one-file-system", 'x', POPT_ARG_NONE, &one_file_system, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000375 {"existing", 0, POPT_ARG_NONE, &only_existing, 0, 0, 0 },
376 {"ignore-existing", 0, POPT_ARG_NONE, &opt_ignore_existing, 0, 0, 0 },
Wayne Davison36719872005-02-11 10:42:55 +0000377 {"del", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
Wayne Davison3359acb2005-01-25 03:08:58 +0000378 {"delete", 0, POPT_ARG_NONE, &delete_mode, 0, 0, 0 },
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000379 {"delete-before", 0, POPT_ARG_VAL, &delete_before, 2, 0, 0 },
Wayne Davison3359acb2005-01-25 03:08:58 +0000380 {"delete-during", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
Wayne Davison51d48392005-01-22 22:48:34 +0000381 {"delete-after", 0, POPT_ARG_NONE, &delete_after, 0, 0, 0 },
382 {"delete-excluded", 0, POPT_ARG_NONE, &delete_excluded, 0, 0, 0 },
Wayne Davison07c6ae72005-02-20 01:04:40 +0000383 {"remove-sent-files",0, POPT_ARG_NONE, &remove_sent_files, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000384 {"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 },
385 {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000386 {"filter", 'f', POPT_ARG_STRING, 0, OPT_FILTER, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000387 {"exclude", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE, 0, 0 },
388 {"include", 0, POPT_ARG_STRING, 0, OPT_INCLUDE, 0, 0 },
389 {"exclude-from", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE_FROM, 0, 0 },
390 {"include-from", 0, POPT_ARG_STRING, 0, OPT_INCLUDE_FROM, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000391 {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000392 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000393 {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
394 {"dry-run", 'n', POPT_ARG_NONE, &dry_run, 0, 0, 0 },
395 {"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 },
396 {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 },
397 {"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 },
Wayne Davisona3221d22004-07-16 20:06:24 +0000398 {"inplace", 0, POPT_ARG_NONE, &inplace, 0, 0, 0 },
Wayne Davison65e4cda2005-01-24 00:17:39 +0000399 {"dirs", 'd', POPT_ARG_VAL, &xfer_dirs, 2, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000400 {"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 },
401 {"copy-links", 'L', POPT_ARG_NONE, &copy_links, 0, 0, 0 },
Wayne Davison65e4cda2005-01-24 00:17:39 +0000402 {"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000403 {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 },
404 {"no-whole-file", 0, POPT_ARG_VAL, &whole_file, 0, 0, 0 },
Wayne Davisonb78296c2005-02-15 07:41:13 +0000405 {"copy-unsafe-links",0, POPT_ARG_NONE, &copy_unsafe_links, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000406 {"perms", 'p', POPT_ARG_NONE, &preserve_perms, 0, 0, 0 },
407 {"owner", 'o', POPT_ARG_NONE, &preserve_uid, 0, 0, 0 },
408 {"group", 'g', POPT_ARG_NONE, &preserve_gid, 0, 0, 0 },
409 {"devices", 'D', POPT_ARG_NONE, &preserve_devices, 0, 0, 0 },
410 {"times", 't', POPT_ARG_NONE, &preserve_times, 0, 0, 0 },
Wayne Davisond4021b62005-02-21 10:03:23 +0000411 {"omit-dir-times", 'O', POPT_ARG_VAL, &omit_dir_times, 2, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000412 {"checksum", 'c', POPT_ARG_NONE, &always_checksum, 0, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000413 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
414 {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
Wayne Davisondfa32482003-03-21 18:58:50 +0000415 {"archive", 'a', POPT_ARG_NONE, &archive_mode, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000416 {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000417 {"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
Wayne Davison51d48392005-01-22 22:48:34 +0000418 {"recursive", 'r', POPT_ARG_VAL, &recurse, -1, 0, 0 },
419 {"list-only", 0, POPT_ARG_VAL, &list_only, 2, 0, 0 },
Wayne Davisonea5164d2003-03-30 23:00:42 +0000420 {"relative", 'R', POPT_ARG_VAL, &relative_paths, 1, 0, 0 },
421 {"no-relative", 0, POPT_ARG_VAL, &relative_paths, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000422 {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
Wayne Davisona06b4192005-01-01 21:08:14 +0000423 {"block-size", 'B', POPT_ARG_LONG, &block_size, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000424 {"max-delete", 0, POPT_ARG_INT, &max_delete, 0, 0, 0 },
Wayne Davison7d5acf12004-11-11 01:45:25 +0000425 {"max-size", 0, POPT_ARG_STRING, &max_size_arg, OPT_MAX_SIZE, 0, 0 },
Wayne Davison99218d82004-06-06 19:02:40 +0000426 {"timeout", 0, POPT_ARG_INT, &io_timeout, OPT_TIMEOUT, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000427 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
Wayne Davisone012f852004-11-27 17:52:51 +0000428 {"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
Wayne Davison1de3e992005-03-11 17:35:59 +0000429 {"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
Wayne Davisone012f852004-11-27 17:52:51 +0000430 {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
Wayne Davisonc4ed1482005-02-14 02:41:15 +0000431 {"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 },
Martin Pool2855f612001-02-23 01:02:31 +0000432 /* TODO: Should this take an optional int giving the compression level? */
Wayne Davisonafb6e942003-03-21 19:17:23 +0000433 {"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000434 {"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
435 {"progress", 0, POPT_ARG_NONE, &do_progress, 0, 0, 0 },
436 {"partial", 0, POPT_ARG_NONE, &keep_partial, 0, 0, 0 },
Wayne Davisona7260c42004-07-29 16:06:38 +0000437 {"partial-dir", 0, POPT_ARG_STRING, &partial_dir, 0, 0, 0 },
Wayne Davisonf06e7082005-01-27 22:46:14 +0000438 {"delay-updates", 0, POPT_ARG_NONE, &delay_updates, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000439 {"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors, 0, 0, 0 },
440 {"blocking-io", 0, POPT_ARG_VAL, &blocking_io, 1, 0, 0 },
441 {"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 },
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000442 {0, 'F', POPT_ARG_NONE, 0, 'F', 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000443 {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
Wayne Davisonb4713292004-12-08 17:29:54 +0000444 {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000445 {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
Wayne Davisonb78296c2005-02-15 07:41:13 +0000446 {"itemize-changes", 'i', POPT_ARG_NONE, &itemize_changes, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000447 {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000448 {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
449 {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000450 {"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 },
451 {"write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 },
Wayne Davisonea5164d2003-03-30 23:00:42 +0000452 {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
453 {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
454 {"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 },
Wayne Davison4f3e9a02003-09-09 15:58:56 +0000455 {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 },
Wayne Davisonc8d895d2004-05-21 09:44:32 +0000456 {"checksum-seed", 0, POPT_ARG_INT, &checksum_seed, 0, 0, 0 },
Wayne Davison4f5b0752005-02-14 00:53:43 +0000457#ifdef INET6
Wayne Davison3dd22902004-05-06 21:08:01 +0000458 {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
459 {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
Martin Pool06963d02001-11-23 07:35:49 +0000460#endif
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000461 /* All these options switch us into daemon-mode option-parsing. */
462 {"address", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 },
463 {"config", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 },
464 {"daemon", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
Wayne Davison1f35bab2005-02-21 00:31:31 +0000465 {"detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000466 {"no-detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000467 {0,0,0,0, 0, 0, 0}
468};
469
470static void daemon_usage(enum logcode F)
471{
472 print_rsync_version(F);
473
474 rprintf(F,"\nUsage: rsync --daemon [OPTION]...\n");
475 rprintf(F," --address=ADDRESS bind to the specified address\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000476 rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000477 rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
478 rprintf(F," --no-detach do not detach from the parent\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000479 rprintf(F," --port=PORT listen on alternate port number\n");
Wayne Davison1bd9db72005-01-28 17:07:54 +0000480 rprintf(F," -v, --verbose increase verbosity\n");
Wayne Davison4f5b0752005-02-14 00:53:43 +0000481#ifdef INET6
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000482 rprintf(F," -4, --ipv4 prefer IPv4\n");
483 rprintf(F," -6, --ipv6 prefer IPv6\n");
484#endif
485 rprintf(F," -h, --help show this help screen\n");
486
487 rprintf(F,"\nIf you were not trying to invoke rsync as a daemon, avoid using any of the\n");
488 rprintf(F,"daemon-specific rsync options. See also the rsyncd.conf(5) man page.\n");
489}
490
491static struct poptOption long_daemon_options[] = {
492 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
493 {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
Wayne Davison9fb08442004-11-17 19:29:20 +0000494 {"bwlimit", 0, POPT_ARG_INT, &daemon_bwlimit, 0, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000495 {"config", 0, POPT_ARG_STRING, &config_file, 0, 0, 0 },
496 {"daemon", 0, POPT_ARG_NONE, &daemon_opt, 0, 0, 0 },
Wayne Davison4f5b0752005-02-14 00:53:43 +0000497#ifdef INET6
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000498 {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
499 {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
500#endif
Wayne Davison1f35bab2005-02-21 00:31:31 +0000501 {"detach", 0, POPT_ARG_VAL, &no_detach, 0, 0, 0 },
502 {"no-detach", 0, POPT_ARG_VAL, &no_detach, 1, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000503 {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
504 {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 },
505 {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
Wayne Davison1bd9db72005-01-28 17:07:54 +0000506 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000507 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
Wayne Davisonad715002004-10-14 09:11:12 +0000508 {0,0,0,0, 0, 0, 0}
Martin Pool2855f612001-02-23 01:02:31 +0000509};
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000510
Martin Pool06963d02001-11-23 07:35:49 +0000511
Wayne Davisone51094b2004-05-21 09:41:38 +0000512static char err_buf[200];
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000513
Martin Pool2855f612001-02-23 01:02:31 +0000514
Martin Pooldafe63c2002-04-16 01:38:21 +0000515/**
516 * Store the option error message, if any, so that we can log the
517 * connection attempt (which requires parsing the options), and then
518 * show the error later on.
519 **/
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000520void option_error(void)
521{
Wayne Davisone51094b2004-05-21 09:41:38 +0000522 if (!err_buf[0]) {
523 strcpy(err_buf, "Error parsing options: "
524 "option may be supported on client but not on server?\n");
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000525 }
Wayne Davisone51094b2004-05-21 09:41:38 +0000526
Wayne Davisone51094b2004-05-21 09:41:38 +0000527 rprintf(FERROR, RSYNC_NAME ": %s", err_buf);
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000528}
529
Martin Pooldafe63c2002-04-16 01:38:21 +0000530
531/**
Wayne Davison27ed20f2004-02-21 21:12:49 +0000532 * Tweak the option table to disable all options that the rsyncd.conf
533 * file has told us to refuse.
Martin Pooldafe63c2002-04-16 01:38:21 +0000534 **/
Wayne Davison27ed20f2004-02-21 21:12:49 +0000535static void set_refuse_options(char *bp)
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000536{
Wayne Davison27ed20f2004-02-21 21:12:49 +0000537 struct poptOption *op;
Wayne Davison093e8162004-08-02 07:40:34 +0000538 char *cp, shortname[2];
Wayne Davisond73e7f62004-08-04 21:20:34 +0000539 int is_wild, found_match;
Wayne Davison093e8162004-08-02 07:40:34 +0000540
541 shortname[1] = '\0';
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000542
Wayne Davison27ed20f2004-02-21 21:12:49 +0000543 while (1) {
Wayne Davison06a50542004-08-02 05:00:30 +0000544 while (*bp == ' ') bp++;
545 if (!*bp)
546 break;
Wayne Davison27ed20f2004-02-21 21:12:49 +0000547 if ((cp = strchr(bp, ' ')) != NULL)
548 *cp= '\0';
Wayne Davison093e8162004-08-02 07:40:34 +0000549 is_wild = strpbrk(bp, "*?[") != NULL;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000550 found_match = 0;
Wayne Davison55afbb52004-02-21 21:36:55 +0000551 for (op = long_options; ; op++) {
Wayne Davison093e8162004-08-02 07:40:34 +0000552 *shortname = op->shortName;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000553 if (!op->longName && !*shortname)
554 break;
555 if ((op->longName && wildmatch(bp, op->longName))
Wayne Davison684d7582005-02-19 22:16:39 +0000556 || (*shortname && wildmatch(bp, shortname))) {
Wayne Davisone57211c2005-01-23 01:25:36 +0000557 if (op->argInfo == POPT_ARG_VAL)
558 op->argInfo = POPT_ARG_NONE;
Wayne Davison06a50542004-08-02 05:00:30 +0000559 op->val = (op - long_options) + OPT_REFUSED_BASE;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000560 found_match = 1;
Wayne Davison36719872005-02-11 10:42:55 +0000561 /* These flags are set to let us easily check
562 * an implied option later in the code. */
563 switch (*shortname) {
Wayne Davison36719872005-02-11 10:42:55 +0000564 case 'r': case 'd': case 'l': case 'p':
565 case 't': case 'g': case 'o': case 'D':
566 refused_archive_part = op->val;
567 break;
568 case '\0':
569 if (wildmatch("delete", op->longName))
570 refused_delete = op->val;
Wayne Davison3296f912005-02-15 21:15:58 +0000571 else if (wildmatch("delete-before", op->longName))
572 refused_delete_before = op->val;
Wayne Davison36719872005-02-11 10:42:55 +0000573 else if (wildmatch("partial", op->longName))
574 refused_partial = op->val;
575 else if (wildmatch("progress", op->longName))
576 refused_progress = op->val;
577 break;
578 }
Wayne Davison06a50542004-08-02 05:00:30 +0000579 if (!is_wild)
580 break;
Wayne Davison27ed20f2004-02-21 21:12:49 +0000581 }
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000582 }
Wayne Davisond73e7f62004-08-04 21:20:34 +0000583 if (!found_match) {
584 rprintf(FLOG, "No match for refuse-options string \"%s\"\n",
585 bp);
586 }
Wayne Davison27ed20f2004-02-21 21:12:49 +0000587 if (!cp)
588 break;
589 *cp = ' ';
590 bp = cp + 1;
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000591 }
Wayne Davison684d7582005-02-19 22:16:39 +0000592
593 for (op = long_options; ; op++) {
594 *shortname = op->shortName;
595 if (!op->longName && !*shortname)
596 break;
597 if (op->val == OPT_DAEMON) {
598 if (op->argInfo == POPT_ARG_VAL)
599 op->argInfo = POPT_ARG_NONE;
600 op->val = (op - long_options) + OPT_REFUSED_BASE;
601 }
602 }
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000603}
604
605
Wayne Davison8db7cc22004-10-11 10:43:25 +0000606static int count_args(const char **argv)
Martin Pool2855f612001-02-23 01:02:31 +0000607{
Wayne Davisondfa32482003-03-21 18:58:50 +0000608 int i = 0;
Martin Pool2855f612001-02-23 01:02:31 +0000609
Wayne Davison8db7cc22004-10-11 10:43:25 +0000610 if (argv) {
611 while (argv[i] != NULL)
612 i++;
613 }
Wayne Davisondfa32482003-03-21 18:58:50 +0000614
615 return i;
Martin Pool2855f612001-02-23 01:02:31 +0000616}
617
618
Wayne Davison36719872005-02-11 10:42:55 +0000619static void create_refuse_error(int which)
620{
621 /* The "which" value is the index + OPT_REFUSED_BASE. */
622 struct poptOption *op = &long_options[which - OPT_REFUSED_BASE];
623 int n = snprintf(err_buf, sizeof err_buf,
624 "The server is configured to refuse --%s\n",
625 op->longName) - 1;
626 if (op->shortName) {
627 snprintf(err_buf + n, sizeof err_buf - n,
628 " (-%c)\n", op->shortName);
629 }
630}
631
632
Martin Pooldafe63c2002-04-16 01:38:21 +0000633/**
634 * Process command line arguments. Called on both local and remote.
635 *
636 * @retval 1 if all options are OK; with globals set to appropriate
637 * values
638 *
639 * @retval 0 on error, with err_buf containing an explanation
640 **/
Martin Pool2855f612001-02-23 01:02:31 +0000641int parse_arguments(int *argc, const char ***argv, int frommain)
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000642{
Andrew Tridgelld8537831998-07-17 10:00:43 +0000643 int opt;
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000644 char *ref = lp_refuse_options(module_id);
Wayne Davison7be73df2004-03-27 09:46:42 +0000645 const char *arg;
Wayne Davisondfa32482003-03-21 18:58:50 +0000646 poptContext pc;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000647
Wayne Davison27ed20f2004-02-21 21:12:49 +0000648 if (ref && *ref)
649 set_refuse_options(ref);
650
Wayne Davisondfa32482003-03-21 18:58:50 +0000651 /* TODO: Call poptReadDefaultConfig; handle errors. */
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000652
Wayne Davisondfa32482003-03-21 18:58:50 +0000653 /* The context leaks in case of an error, but if there's a
654 * problem we always exit anyhow. */
655 pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
Wayne Davison9fb08442004-11-17 19:29:20 +0000656 poptReadDefaultConfig(pc, 0);
Martin Pool2855f612001-02-23 01:02:31 +0000657
658 while ((opt = poptGetNextOpt(pc)) != -1) {
Wayne Davisondfa32482003-03-21 18:58:50 +0000659 /* most options are handled automatically by popt;
660 * only special cases are returned and listed here. */
Martin Pool2855f612001-02-23 01:02:31 +0000661
Andrew Tridgelld8537831998-07-17 10:00:43 +0000662 switch (opt) {
663 case OPT_VERSION:
Wayne Davisondfa32482003-03-21 18:58:50 +0000664 print_rsync_version(FINFO);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000665 exit_cleanup(0);
Wayne Davisondfa32482003-03-21 18:58:50 +0000666
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000667 case OPT_DAEMON:
668 if (am_daemon) {
669 strcpy(err_buf, "Attempt to hack rsync thwarted!\n");
670 return 0;
671 }
672 poptFreeContext(pc);
673 pc = poptGetContext(RSYNC_NAME, *argc, *argv,
674 long_daemon_options, 0);
675 while ((opt = poptGetNextOpt(pc)) != -1) {
676 switch (opt) {
677 case 'h':
678 daemon_usage(FINFO);
679 exit_cleanup(0);
680
Wayne Davison1bd9db72005-01-28 17:07:54 +0000681 case 'v':
682 verbose++;
683 break;
684
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000685 default:
686 rprintf(FERROR,
687 "rsync: %s: %s (in daemon mode)\n",
688 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
689 poptStrerror(opt));
690 goto daemon_error;
691 }
692 }
693 if (!daemon_opt) {
694 rprintf(FERROR, "Daemon option(s) used without --daemon.\n");
695 daemon_error:
696 rprintf(FERROR,
697 "(Type \"rsync --daemon --help\" for assistance with daemon mode.)\n");
698 exit_cleanup(RERR_SYNTAX);
699 }
700 *argv = poptGetArgs(pc);
701 *argc = count_args(*argv);
Wayne Davison7f2a1f62005-02-25 17:08:31 +0000702 am_starting_up = 0;
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000703 daemon_opt = 0;
704 am_daemon = 1;
705 return 1;
706
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000707 case OPT_MODIFY_WINDOW:
Wayne Davisondfa32482003-03-21 18:58:50 +0000708 /* The value has already been set by popt, but
709 * we need to remember that we're using a
710 * non-default setting. */
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000711 modify_window_set = 1;
712 break;
Wayne Davison1de50992002-05-03 22:59:17 +0000713
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000714 case OPT_FILTER:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000715 parse_rule(&filter_list, poptGetOptArg(pc), 0, 0);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000716 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000717
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000718 case OPT_EXCLUDE:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000719 parse_rule(&filter_list, poptGetOptArg(pc),
Wayne Davison0a68f862005-02-03 19:00:17 +0000720 0, XFLG_OLD_PREFIXES);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000721 break;
722
Andrew Tridgelld8537831998-07-17 10:00:43 +0000723 case OPT_INCLUDE:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000724 parse_rule(&filter_list, poptGetOptArg(pc),
Wayne Davison0a68f862005-02-03 19:00:17 +0000725 MATCHFLG_INCLUDE, XFLG_OLD_PREFIXES);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000726 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000727
Andrew Tridgelld8537831998-07-17 10:00:43 +0000728 case OPT_EXCLUDE_FROM:
David Dykstra93695762002-02-27 22:49:57 +0000729 case OPT_INCLUDE_FROM:
Wayne Davison7be73df2004-03-27 09:46:42 +0000730 arg = poptGetOptArg(pc);
Wayne Davisonba3db472004-08-26 17:39:48 +0000731 if (sanitize_paths)
732 arg = sanitize_path(NULL, arg, NULL, 0);
Wayne Davison78424182005-01-25 10:39:14 +0000733 if (server_filter_list.head) {
Wayne Davisonba3db472004-08-26 17:39:48 +0000734 char *cp = (char *)arg;
Wayne Davison36719872005-02-11 10:42:55 +0000735 if (!*cp)
736 goto options_rejected;
Wayne Davisonba3db472004-08-26 17:39:48 +0000737 clean_fname(cp, 1);
Wayne Davison78424182005-01-25 10:39:14 +0000738 if (check_filter(&server_filter_list, cp, 0) < 0)
Wayne Davisonba3db472004-08-26 17:39:48 +0000739 goto options_rejected;
740 }
Wayne Davison3a5e9222005-02-04 21:13:03 +0000741 parse_filter_file(&filter_list, arg,
742 opt == OPT_INCLUDE_FROM ? MATCHFLG_INCLUDE : 0,
743 XFLG_FATAL_ERRORS | XFLG_OLD_PREFIXES);
David Dykstra93695762002-02-27 22:49:57 +0000744 break;
745
Andrew Tridgelld8537831998-07-17 10:00:43 +0000746 case 'h':
747 usage(FINFO);
748 exit_cleanup(0);
Andrew Tridgell2b6b4d51998-05-27 11:02:33 +0000749
Andrew Tridgelld8537831998-07-17 10:00:43 +0000750 case 'v':
751 verbose++;
752 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000753
David Dykstrab86f0ce1999-02-09 17:25:35 +0000754 case 'q':
Wayne Davisonf98c60b2004-02-09 18:10:57 +0000755 if (frommain)
756 quiet++;
David Dykstrab86f0ce1999-02-09 17:25:35 +0000757 break;
758
Andrew Tridgelld8537831998-07-17 10:00:43 +0000759 case OPT_SENDER:
760 if (!am_server) {
761 usage(FERROR);
Andrew Tridgell65417571998-11-03 07:08:27 +0000762 exit_cleanup(RERR_SYNTAX);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000763 }
764 am_sender = 1;
765 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000766
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000767 case 'F':
768 switch (++F_option_cnt) {
769 case 1:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000770 parse_rule(&filter_list,": /.rsync-filter",0,0);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000771 break;
772 case 2:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000773 parse_rule(&filter_list,"- .rsync-filter",0,0);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000774 break;
775 }
776 break;
777
Andrew Tridgelld9fcc191999-10-31 02:47:30 +0000778 case 'P':
Wayne Davison36719872005-02-11 10:42:55 +0000779 if (refused_partial || refused_progress) {
780 create_refuse_error(refused_partial
781 ? refused_partial : refused_progress);
782 return 0;
783 }
Andrew Tridgelld9fcc191999-10-31 02:47:30 +0000784 do_progress = 1;
785 keep_partial = 1;
786 break;
787
David Dykstra088aac82002-02-06 21:20:48 +0000788 case OPT_WRITE_BATCH:
Wayne Davison9b3318b2004-07-15 16:27:02 +0000789 /* batch_name is already set */
David Dykstra088aac82002-02-06 21:20:48 +0000790 write_batch = 1;
791 break;
792
Martin Pool76f79ba2002-01-23 05:51:06 +0000793 case OPT_READ_BATCH:
Wayne Davison9b3318b2004-07-15 16:27:02 +0000794 /* batch_name is already set */
Martin Pool6902ed12001-08-14 02:04:47 +0000795 read_batch = 1;
796 break;
Wayne Davisonea5164d2003-03-30 23:00:42 +0000797
Wayne Davison7d5acf12004-11-11 01:45:25 +0000798 case OPT_MAX_SIZE:
Wayne Davisoncc800222005-01-28 21:32:20 +0000799 for (arg = max_size_arg; isdigit(*(uchar*)arg); arg++) {}
Wayne Davison7d5acf12004-11-11 01:45:25 +0000800 if (*arg == '.')
Wayne Davisoncc800222005-01-28 21:32:20 +0000801 for (arg++; isdigit(*(uchar*)arg); arg++) {}
Wayne Davison7d5acf12004-11-11 01:45:25 +0000802 switch (*arg) {
803 case 'k': case 'K':
804 max_size = atof(max_size_arg) * 1024;
805 break;
806 case 'm': case 'M':
807 max_size = atof(max_size_arg) * 1024*1024;
808 break;
809 case 'g': case 'G':
810 max_size = atof(max_size_arg) * 1024*1024*1024;
811 break;
812 case '\0':
813 max_size = atof(max_size_arg);
814 break;
815 default:
816 max_size = 0;
817 break;
818 }
819 if (max_size <= 0) {
Wayne Davisone012f852004-11-27 17:52:51 +0000820 snprintf(err_buf, sizeof err_buf,
Wayne Davison7d5acf12004-11-11 01:45:25 +0000821 "--max-size value is invalid: %s\n",
822 max_size_arg);
Wayne Davisone012f852004-11-27 17:52:51 +0000823 return 0;
Wayne Davison7d5acf12004-11-11 01:45:25 +0000824 }
825 break;
826
Wayne Davison99218d82004-06-06 19:02:40 +0000827 case OPT_TIMEOUT:
828 if (io_timeout && io_timeout < select_timeout)
829 select_timeout = io_timeout;
830 break;
831
David Dykstra59c95e42002-08-29 14:44:55 +0000832 case OPT_LINK_DEST:
Wayne Davison4f5b0752005-02-14 00:53:43 +0000833#ifdef HAVE_LINK
David Dykstra59c95e42002-08-29 14:44:55 +0000834 link_dest = 1;
Wayne Davisone012f852004-11-27 17:52:51 +0000835 dest_option = "--link-dest";
836 goto set_dest_dir;
David Dykstra59c95e42002-08-29 14:44:55 +0000837#else
Wayne Davisond175d7e2003-08-01 07:58:44 +0000838 snprintf(err_buf, sizeof err_buf,
Wayne Davisondfa32482003-03-21 18:58:50 +0000839 "hard links are not supported on this %s\n",
David Dykstra59c95e42002-08-29 14:44:55 +0000840 am_server ? "server" : "client");
David Dykstra59c95e42002-08-29 14:44:55 +0000841 return 0;
842#endif
843
Wayne Davison1de3e992005-03-11 17:35:59 +0000844 case OPT_COPY_DEST:
845 copy_dest = 1;
846 dest_option = "--copy-dest";
847 goto set_dest_dir;
848
Wayne Davisone012f852004-11-27 17:52:51 +0000849 case OPT_COMPARE_DEST:
850 compare_dest = 1;
851 dest_option = "--compare-dest";
852 set_dest_dir:
Wayne Davison3b26bba2005-01-15 21:23:04 +0000853 if (basis_dir_cnt >= MAX_BASIS_DIRS) {
Wayne Davisone012f852004-11-27 17:52:51 +0000854 snprintf(err_buf, sizeof err_buf,
855 "ERROR: at most %d %s args may be specified\n",
856 MAX_BASIS_DIRS, dest_option);
857 return 0;
858 }
859 arg = poptGetOptArg(pc);
860 if (sanitize_paths)
861 arg = sanitize_path(NULL, arg, NULL, 0);
862 basis_dir[basis_dir_cnt++] = (char *)arg;
863 break;
864
Andrew Tridgelld8537831998-07-17 10:00:43 +0000865 default:
Wayne Davison55afbb52004-02-21 21:36:55 +0000866 /* A large opt value means that set_refuse_options()
Wayne Davison36719872005-02-11 10:42:55 +0000867 * turned this option off. */
Wayne Davisonc67d1382004-02-22 08:56:43 +0000868 if (opt >= OPT_REFUSED_BASE) {
Wayne Davison36719872005-02-11 10:42:55 +0000869 create_refuse_error(opt);
870 return 0;
Wayne Davison27ed20f2004-02-21 21:12:49 +0000871 }
Wayne Davison36719872005-02-11 10:42:55 +0000872 snprintf(err_buf, sizeof err_buf, "%s%s: %s\n",
873 am_server ? "on remote machine: " : "",
874 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
875 poptStrerror(opt));
Wayne Davisondfa32482003-03-21 18:58:50 +0000876 return 0;
Andrew Tridgelld8537831998-07-17 10:00:43 +0000877 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000878 }
Martin Pool2855f612001-02-23 01:02:31 +0000879
Wayne Davison4f5b0752005-02-14 00:53:43 +0000880#ifndef SUPPORT_LINKS
Wayne Davison54e87b42004-02-02 21:33:10 +0000881 if (preserve_links && !am_sender) {
Wayne Davisone1add892004-02-01 17:29:41 +0000882 snprintf(err_buf, sizeof err_buf,
883 "symlinks are not supported on this %s\n",
884 am_server ? "server" : "client");
Wayne Davisone1add892004-02-01 17:29:41 +0000885 return 0;
886 }
887#endif
888
Wayne Davison4f5b0752005-02-14 00:53:43 +0000889#ifndef SUPPORT_HARD_LINKS
Wayne Davisone1add892004-02-01 17:29:41 +0000890 if (preserve_hard_links) {
891 snprintf(err_buf, sizeof err_buf,
892 "hard links are not supported on this %s\n",
893 am_server ? "server" : "client");
Wayne Davisone1add892004-02-01 17:29:41 +0000894 return 0;
895 }
896#endif
897
David Dykstra088aac82002-02-06 21:20:48 +0000898 if (write_batch && read_batch) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000899 snprintf(err_buf, sizeof err_buf,
Wayne Davison36119892004-07-21 22:50:11 +0000900 "--write-batch and --read-batch can not be used together\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000901 return 0;
David Dykstra088aac82002-02-06 21:20:48 +0000902 }
Wayne Davison94327ff2004-07-15 19:06:32 +0000903 if (write_batch || read_batch) {
904 if (dry_run) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000905 snprintf(err_buf, sizeof err_buf,
Wayne Davison94327ff2004-07-15 19:06:32 +0000906 "--%s-batch cannot be used with --dry_run (-n)\n",
907 write_batch ? "write" : "read");
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000908 return 0;
Wayne Davison94327ff2004-07-15 19:06:32 +0000909 }
910 if (am_server) {
911 rprintf(FINFO,
912 "ignoring --%s-batch option sent to server\n",
913 write_batch ? "write" : "read");
914 /* We don't actually exit_cleanup(), so that we can
915 * still service older version clients that still send
916 * batch args to server. */
917 read_batch = write_batch = 0;
918 batch_name = NULL;
919 }
Wayne Davisonb9f592f2004-07-15 02:20:08 +0000920 }
Wayne Davison36119892004-07-21 22:50:11 +0000921 if (read_batch && files_from) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000922 snprintf(err_buf, sizeof err_buf,
Wayne Davison36119892004-07-21 22:50:11 +0000923 "--read-batch cannot be used with --files-from\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000924 return 0;
Wayne Davison36119892004-07-21 22:50:11 +0000925 }
Wayne Davison9b3318b2004-07-15 16:27:02 +0000926 if (batch_name && strlen(batch_name) > MAX_BATCH_NAME_LEN) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000927 snprintf(err_buf, sizeof err_buf,
Wayne Davison9b3318b2004-07-15 16:27:02 +0000928 "the batch-file name must be %d characters or less.\n",
929 MAX_BATCH_NAME_LEN);
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000930 return 0;
Wayne Davisonbeb93682004-01-19 23:33:02 +0000931 }
David Dykstra088aac82002-02-06 21:20:48 +0000932
Wayne Davisonce58b1b2004-01-22 01:20:24 +0000933 if (tmpdir && strlen(tmpdir) >= MAXPATHLEN - 10) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000934 snprintf(err_buf, sizeof err_buf,
935 "the --temp-dir path is WAY too long.\n");
936 return 0;
Wayne Davisonce58b1b2004-01-22 01:20:24 +0000937 }
938
Wayne Davison1de3e992005-03-11 17:35:59 +0000939 if (compare_dest + copy_dest + link_dest > 1) {
Wayne Davisone012f852004-11-27 17:52:51 +0000940 snprintf(err_buf, sizeof err_buf,
Wayne Davison1de3e992005-03-11 17:35:59 +0000941 "You may not mix --compare-dest, --copy-dest, and --link-dest.\n");
Wayne Davisone012f852004-11-27 17:52:51 +0000942 return 0;
943 }
944
Wayne Davisondfa32482003-03-21 18:58:50 +0000945 if (archive_mode) {
Wayne Davison36719872005-02-11 10:42:55 +0000946 if (refused_archive_part) {
947 create_refuse_error(refused_archive_part);
948 return 0;
949 }
Wayne Davisonea5164d2003-03-30 23:00:42 +0000950 if (!files_from)
Wayne Davison51d48392005-01-22 22:48:34 +0000951 recurse = -1; /* infinite recursion */
Wayne Davison4f5b0752005-02-14 00:53:43 +0000952#ifdef SUPPORT_LINKS
Wayne Davisondfa32482003-03-21 18:58:50 +0000953 preserve_links = 1;
954#endif
955 preserve_perms = 1;
956 preserve_times = 1;
957 preserve_gid = 1;
958 preserve_uid = 1;
959 preserve_devices = 1;
960 }
Wayne Davison51d48392005-01-22 22:48:34 +0000961
962 if (recurse || list_only || files_from)
Wayne Davison65e4cda2005-01-24 00:17:39 +0000963 xfer_dirs |= 1;
Wayne Davisondfa32482003-03-21 18:58:50 +0000964
Wayne Davisonea5164d2003-03-30 23:00:42 +0000965 if (relative_paths < 0)
966 relative_paths = files_from? 1 : 0;
967
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000968 if (!!delete_before + delete_during + delete_after > 1) {
Wayne Davison3359acb2005-01-25 03:08:58 +0000969 snprintf(err_buf, sizeof err_buf,
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000970 "You may not combine multiple --delete-WHEN options.\n");
Wayne Davison3359acb2005-01-25 03:08:58 +0000971 return 0;
972 }
Wayne Davison78fc60c2005-01-29 22:35:50 +0000973 if (!recurse) {
974 delete_before = delete_during = delete_after = 0;
975 delete_mode = delete_excluded = 0;
976 } else if (delete_before || delete_during || delete_after)
Wayne Davison51d48392005-01-22 22:48:34 +0000977 delete_mode = 1;
Wayne Davison3296f912005-02-15 21:15:58 +0000978 else if (delete_mode || delete_excluded) {
979 if (refused_delete_before) {
980 create_refuse_error(refused_delete_before);
981 return 0;
982 }
Wayne Davison3359acb2005-01-25 03:08:58 +0000983 delete_mode = delete_before = 1;
Wayne Davison3296f912005-02-15 21:15:58 +0000984 }
Wayne Davison51d48392005-01-22 22:48:34 +0000985
Wayne Davison36719872005-02-11 10:42:55 +0000986 if (delete_mode && refused_delete) {
987 create_refuse_error(refused_delete);
988 return 0;
989 }
990
Wayne Davison07c6ae72005-02-20 01:04:40 +0000991 if (remove_sent_files) {
992 /* We only want to infer this refusal of --remove-sent-files
993 * via the refusal of "delete", not any of the "delete-FOO"
994 * options. */
995 if (refused_delete && am_sender) {
996 create_refuse_error(refused_delete);
997 return 0;
998 }
999 need_messages_from_generator = 1;
1000 }
1001
Wayne Davison7be73df2004-03-27 09:46:42 +00001002 *argv = poptGetArgs(pc);
Wayne Davison8db7cc22004-10-11 10:43:25 +00001003 *argc = count_args(*argv);
Wayne Davison7be73df2004-03-27 09:46:42 +00001004
1005 if (sanitize_paths) {
1006 int i;
1007 for (i = *argc; i-- > 0; )
Wayne Davison10796f42004-08-11 23:41:03 +00001008 (*argv)[i] = sanitize_path(NULL, (*argv)[i], "", 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001009 if (tmpdir)
Wayne Davison10796f42004-08-11 23:41:03 +00001010 tmpdir = sanitize_path(NULL, tmpdir, NULL, 0);
Wayne Davisona7260c42004-07-29 16:06:38 +00001011 if (partial_dir)
Wayne Davison10796f42004-08-11 23:41:03 +00001012 partial_dir = sanitize_path(NULL, partial_dir, NULL, 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001013 if (backup_dir)
Wayne Davison10796f42004-08-11 23:41:03 +00001014 backup_dir = sanitize_path(NULL, backup_dir, NULL, 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001015 }
Wayne Davison78424182005-01-25 10:39:14 +00001016 if (server_filter_list.head && !am_sender) {
1017 struct filter_list_struct *elp = &server_filter_list;
Wayne Davisone012f852004-11-27 17:52:51 +00001018 int i;
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001019 if (tmpdir) {
Wayne Davison36719872005-02-11 10:42:55 +00001020 if (!*tmpdir)
1021 goto options_rejected;
Wayne Davison58b19992004-08-12 18:20:07 +00001022 clean_fname(tmpdir, 1);
Wayne Davison78424182005-01-25 10:39:14 +00001023 if (check_filter(elp, tmpdir, 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001024 goto options_rejected;
1025 }
Wayne Davison36719872005-02-11 10:42:55 +00001026 if (partial_dir && *partial_dir) {
Wayne Davison58b19992004-08-12 18:20:07 +00001027 clean_fname(partial_dir, 1);
Wayne Davison78424182005-01-25 10:39:14 +00001028 if (check_filter(elp, partial_dir, 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001029 goto options_rejected;
1030 }
Wayne Davisone012f852004-11-27 17:52:51 +00001031 for (i = 0; i < basis_dir_cnt; i++) {
Wayne Davison36719872005-02-11 10:42:55 +00001032 if (!*basis_dir[i])
1033 goto options_rejected;
Wayne Davisone012f852004-11-27 17:52:51 +00001034 clean_fname(basis_dir[i], 1);
Wayne Davison78424182005-01-25 10:39:14 +00001035 if (check_filter(elp, basis_dir[i], 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001036 goto options_rejected;
1037 }
1038 if (backup_dir) {
Wayne Davison36719872005-02-11 10:42:55 +00001039 if (!*backup_dir)
1040 goto options_rejected;
Wayne Davison58b19992004-08-12 18:20:07 +00001041 clean_fname(backup_dir, 1);
Wayne Davison305666b2005-03-01 01:15:57 +00001042 if (check_filter(elp, backup_dir, 1) < 0) {
1043 options_rejected:
1044 snprintf(err_buf, sizeof err_buf,
1045 "Your options have been rejected by the server.\n");
1046 return 0;
1047 }
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001048 }
1049 }
Wayne Davison7be73df2004-03-27 09:46:42 +00001050
Wayne Davisond175d7e2003-08-01 07:58:44 +00001051 if (!backup_suffix)
Wayne Davisone0391f82004-02-11 04:30:41 +00001052 backup_suffix = backup_dir ? "" : BACKUP_SUFFIX;
Wayne Davisond175d7e2003-08-01 07:58:44 +00001053 backup_suffix_len = strlen(backup_suffix);
Wayne Davison80ddadb2003-08-01 19:40:31 +00001054 if (strchr(backup_suffix, '/') != NULL) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001055 snprintf(err_buf, sizeof err_buf,
1056 "--suffix cannot contain slashes: %s\n",
Wayne Davison80ddadb2003-08-01 19:40:31 +00001057 backup_suffix);
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001058 return 0;
Wayne Davison80ddadb2003-08-01 19:40:31 +00001059 }
Wayne Davisone0391f82004-02-11 04:30:41 +00001060 if (backup_dir) {
1061 backup_dir_len = strlcpy(backup_dir_buf, backup_dir, sizeof backup_dir_buf);
1062 backup_dir_remainder = sizeof backup_dir_buf - backup_dir_len;
1063 if (backup_dir_remainder < 32) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001064 snprintf(err_buf, sizeof err_buf,
1065 "the --backup-dir path is WAY too long.\n");
1066 return 0;
Wayne Davisone0391f82004-02-11 04:30:41 +00001067 }
1068 if (backup_dir_buf[backup_dir_len - 1] != '/') {
1069 backup_dir_buf[backup_dir_len++] = '/';
1070 backup_dir_buf[backup_dir_len] = '\0';
1071 }
Wayne Davison4875d6b2005-02-07 20:36:43 +00001072 if (verbose > 1 && !am_sender) {
1073 rprintf(FINFO, "backup_dir is %s\n",
1074 safe_fname(backup_dir_buf));
1075 }
Wayne Davison8dcf9332004-03-31 17:02:22 +00001076 } else if (!backup_suffix_len && (!am_server || !am_sender)) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001077 snprintf(err_buf, sizeof err_buf,
Wayne Davisond175d7e2003-08-01 07:58:44 +00001078 "--suffix cannot be a null string without --backup-dir\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001079 return 0;
Wayne Davisond175d7e2003-08-01 07:58:44 +00001080 }
Wayne Davisond4021b62005-02-21 10:03:23 +00001081 if (make_backups && !backup_dir)
1082 omit_dir_times = 1;
Wayne Davisond175d7e2003-08-01 07:58:44 +00001083
Wayne Davisone7651882005-02-16 08:10:31 +00001084 if (log_format) {
1085 if (strstr(log_format, "%i") != NULL)
Wayne Davison684d7582005-02-19 22:16:39 +00001086 log_format_has_i = 1;
Wayne Davisone7651882005-02-16 08:10:31 +00001087 if (strstr(log_format, "%b") == NULL
1088 && strstr(log_format, "%c") == NULL)
1089 log_before_transfer = !am_server;
1090 } else if (itemize_changes) {
1091 log_format = "%i %n%L";
Wayne Davison684d7582005-02-19 22:16:39 +00001092 log_format_has_i = 1;
Wayne Davisone7651882005-02-16 08:10:31 +00001093 log_before_transfer = !am_server;
1094 }
Wayne Davison87383692005-02-16 17:02:08 +00001095
1096 if ((do_progress || dry_run) && !verbose && !log_before_transfer
Wayne Davison702cd152005-02-18 17:36:12 +00001097 && !am_server)
J.W. Schultze2559db2003-08-06 06:45:14 +00001098 verbose = 1;
Wayne Davison87383692005-02-16 17:02:08 +00001099
1100 if (verbose && !log_format) {
1101 log_format = "%n%L";
1102 log_before_transfer = !am_server;
Wayne Davison36719872005-02-11 10:42:55 +00001103 }
Wayne Davison684d7582005-02-19 22:16:39 +00001104 if (log_format_has_i
1105 || (log_format && strstr(log_format, "%o") != NULL))
Wayne Davison5c5e1592005-02-19 03:54:11 +00001106 log_format_has_o_or_i = 1;
J.W. Schultze2559db2003-08-06 06:45:14 +00001107
Wayne Davison9fb08442004-11-17 19:29:20 +00001108 if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit))
1109 bwlimit = daemon_bwlimit;
Wayne Davison3c74c3a2004-05-27 21:51:53 +00001110 if (bwlimit) {
1111 bwlimit_writemax = (size_t)bwlimit * 128;
1112 if (bwlimit_writemax < 512)
1113 bwlimit_writemax = 512;
1114 }
1115
Wayne Davisonf06e7082005-01-27 22:46:14 +00001116 if (delay_updates && !partial_dir)
Wayne Davison36719872005-02-11 10:42:55 +00001117 partial_dir = partialdir_for_delayupdate;
Wayne Davisonf06e7082005-01-27 22:46:14 +00001118
Wayne Davisona3221d22004-07-16 20:06:24 +00001119 if (inplace) {
Wayne Davison4f5b0752005-02-14 00:53:43 +00001120#ifdef HAVE_FTRUNCATE
Wayne Davisona7260c42004-07-29 16:06:38 +00001121 if (partial_dir) {
1122 snprintf(err_buf, sizeof err_buf,
Wayne Davisonf06e7082005-01-27 22:46:14 +00001123 "--inplace cannot be used with --%s\n",
1124 delay_updates ? "delay-updates" : "partial-dir");
Wayne Davisona7260c42004-07-29 16:06:38 +00001125 return 0;
1126 }
Wayne Davison36719872005-02-11 10:42:55 +00001127 /* --inplace implies --partial for refusal purposes, but we
1128 * clear the keep_partial flag for internal logic purposes. */
1129 if (refused_partial) {
1130 create_refuse_error(refused_partial);
1131 return 0;
1132 }
Wayne Davisona3221d22004-07-16 20:06:24 +00001133 keep_partial = 0;
Wayne Davisonded4daf2005-01-15 20:22:54 +00001134#else
1135 snprintf(err_buf, sizeof err_buf,
1136 "--inplace is not supported on this %s\n",
1137 am_server ? "server" : "client");
1138 return 0;
1139#endif
Wayne Davison075aa182004-09-18 17:34:56 +00001140 } else {
Wayne Davison36719872005-02-11 10:42:55 +00001141 if (keep_partial && !partial_dir) {
1142 if ((arg = getenv("RSYNC_PARTIAL_DIR")) != NULL && *arg)
1143 partial_dir = strdup(arg);
1144 }
Wayne Davison075aa182004-09-18 17:34:56 +00001145 if (partial_dir) {
Wayne Davison36719872005-02-11 10:42:55 +00001146 if (*partial_dir)
1147 clean_fname(partial_dir, 1);
Wayne Davison075aa182004-09-18 17:34:56 +00001148 if (!*partial_dir || strcmp(partial_dir, ".") == 0)
1149 partial_dir = NULL;
Wayne Davison13791b12004-09-22 04:12:13 +00001150 else if (*partial_dir != '/') {
Wayne Davison3a5e9222005-02-04 21:13:03 +00001151 parse_rule(&filter_list, partial_dir,
Wayne Davison0a68f862005-02-03 19:00:17 +00001152 MATCHFLG_NO_PREFIXES|MATCHFLG_DIRECTORY, 0);
Wayne Davison13791b12004-09-22 04:12:13 +00001153 }
Wayne Davison36719872005-02-11 10:42:55 +00001154 if (!partial_dir && refused_partial) {
1155 create_refuse_error(refused_partial);
1156 return 0;
1157 }
Wayne Davison075aa182004-09-18 17:34:56 +00001158 keep_partial = 1;
1159 }
Wayne Davisona3221d22004-07-16 20:06:24 +00001160 }
1161
Wayne Davisonea5164d2003-03-30 23:00:42 +00001162 if (files_from) {
Wayne Davison305666b2005-03-01 01:15:57 +00001163 char *h, *p;
1164 int q;
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001165 if (*argc > 2 || (!am_daemon && *argc == 1)) {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001166 usage(FERROR);
1167 exit_cleanup(RERR_SYNTAX);
1168 }
Wayne Davison63596e12003-12-15 00:53:07 +00001169 if (strcmp(files_from, "-") == 0) {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001170 filesfrom_fd = 0;
Wayne Davison63596e12003-12-15 00:53:07 +00001171 if (am_server)
Wayne Davison305666b2005-03-01 01:15:57 +00001172 filesfrom_host = ""; /* reading from socket */
1173 } else if ((p = check_for_hostspec(files_from, &h, &q)) != 0) {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001174 if (am_server) {
Wayne Davison305666b2005-03-01 01:15:57 +00001175 snprintf(err_buf, sizeof err_buf,
1176 "The --files-from sent to the server cannot specify a host.\n");
1177 return 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001178 }
Wayne Davison305666b2005-03-01 01:15:57 +00001179 files_from = p;
1180 filesfrom_host = h;
1181 if (strcmp(files_from, "-") == 0) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001182 snprintf(err_buf, sizeof err_buf,
1183 "Invalid --files-from remote filename\n");
1184 return 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001185 }
1186 } else {
Wayne Davison305666b2005-03-01 01:15:57 +00001187 if (sanitize_paths)
1188 files_from = sanitize_path(NULL, files_from, NULL, 0);
1189 if (server_filter_list.head) {
1190 if (!*files_from)
1191 goto options_rejected;
1192 clean_fname(files_from, 1);
1193 if (check_filter(&server_filter_list, files_from, 0) < 0)
1194 goto options_rejected;
1195 }
Wayne Davisonea5164d2003-03-30 23:00:42 +00001196 filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);
1197 if (filesfrom_fd < 0) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001198 snprintf(err_buf, sizeof err_buf,
1199 "failed to open files-from file %s: %s\n",
1200 files_from, strerror(errno));
1201 return 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001202 }
1203 }
1204 }
1205
Wayne Davison7f2a1f62005-02-25 17:08:31 +00001206 am_starting_up = 0;
1207
Andrew Tridgellb11ed3b1998-07-19 04:50:48 +00001208 return 1;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001209}
1210
1211
Martin Pooldafe63c2002-04-16 01:38:21 +00001212/**
1213 * Construct a filtered list of options to pass through from the
1214 * client to the server.
1215 *
1216 * This involves setting options that will tell the server how to
1217 * behave, and also filtering out options that are processed only
1218 * locally.
1219 **/
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001220void server_options(char **args,int *argc)
1221{
Wayne Davisone012f852004-11-27 17:52:51 +00001222 static char argstr[50+MAX_BASIS_DIRS*2];
Andrew Tridgelld8537831998-07-17 10:00:43 +00001223 int ac = *argc;
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001224 char *arg;
David Dykstraef5d23e2000-06-06 21:13:05 +00001225
Andrew Tridgelld8537831998-07-17 10:00:43 +00001226 int i, x;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001227
David Dykstra93689aa2002-02-05 23:05:31 +00001228 if (blocking_io == -1)
1229 blocking_io = 0;
1230
Andrew Tridgelld8537831998-07-17 10:00:43 +00001231 args[ac++] = "--server";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001232
Wayne Davison1312d9f2002-08-01 00:37:01 +00001233 if (daemon_over_rsh) {
1234 args[ac++] = "--daemon";
1235 *argc = ac;
1236 /* if we're passing --daemon, we're done */
1237 return;
1238 }
1239
Andrew Tridgelld8537831998-07-17 10:00:43 +00001240 if (!am_sender)
1241 args[ac++] = "--sender";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001242
Andrew Tridgelld8537831998-07-17 10:00:43 +00001243 x = 1;
1244 argstr[0] = '-';
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001245 for (i = 0; i < verbose; i++)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001246 argstr[x++] = 'v';
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001247
David Dykstrab86f0ce1999-02-09 17:25:35 +00001248 /* the -q option is intentionally left out */
Andrew Tridgelld8537831998-07-17 10:00:43 +00001249 if (make_backups)
1250 argstr[x++] = 'b';
1251 if (update_only)
1252 argstr[x++] = 'u';
1253 if (dry_run)
1254 argstr[x++] = 'n';
1255 if (preserve_links)
1256 argstr[x++] = 'l';
1257 if (copy_links)
1258 argstr[x++] = 'L';
Wayne Davison65e4cda2005-01-24 00:17:39 +00001259 if (xfer_dirs > 1)
Wayne Davison5454d222005-01-29 21:25:44 +00001260 argstr[x++] = 'd';
Wayne Davison716e73d2004-06-05 16:16:30 +00001261 if (keep_dirlinks && am_sender)
1262 argstr[x++] = 'K';
Martin Pool1bfbf402002-03-19 03:21:53 +00001263
Wayne Davisondfa32482003-03-21 18:58:50 +00001264 if (whole_file > 0)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001265 argstr[x++] = 'W';
Martin Poolbceec822002-03-19 03:39:42 +00001266 /* We don't need to send --no-whole-file, because it's the
1267 * default for remote transfers, and in any case old versions
1268 * of rsync will not understand it. */
Wayne Davisondfa32482003-03-21 18:58:50 +00001269
Andrew Tridgelld8537831998-07-17 10:00:43 +00001270 if (preserve_hard_links)
1271 argstr[x++] = 'H';
1272 if (preserve_uid)
1273 argstr[x++] = 'o';
1274 if (preserve_gid)
1275 argstr[x++] = 'g';
1276 if (preserve_devices)
1277 argstr[x++] = 'D';
1278 if (preserve_times)
1279 argstr[x++] = 't';
Wayne Davisond4021b62005-02-21 10:03:23 +00001280 if (omit_dir_times == 2 && am_sender)
Wayne Davison20fb7b92005-01-24 00:51:32 +00001281 argstr[x++] = 'O';
Andrew Tridgelld8537831998-07-17 10:00:43 +00001282 if (preserve_perms)
1283 argstr[x++] = 'p';
Wayne Davison51d48392005-01-22 22:48:34 +00001284 if (recurse < 0)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001285 argstr[x++] = 'r';
1286 if (always_checksum)
1287 argstr[x++] = 'c';
1288 if (cvs_exclude)
1289 argstr[x++] = 'C';
1290 if (ignore_times)
1291 argstr[x++] = 'I';
1292 if (relative_paths)
1293 argstr[x++] = 'R';
1294 if (one_file_system)
1295 argstr[x++] = 'x';
1296 if (sparse_files)
1297 argstr[x++] = 'S';
1298 if (do_compression)
1299 argstr[x++] = 'z';
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001300
Wayne Davison51d48392005-01-22 22:48:34 +00001301 /* This is a complete hack - blame Rusty. FIXME!
1302 * This hack is only needed for older rsync versions that
1303 * don't understand the --list-only option. */
1304 if (list_only == 1 && recurse >= 0)
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001305 argstr[x++] = 'r';
1306
Andrew Tridgelld8537831998-07-17 10:00:43 +00001307 argstr[x] = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001308
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001309 if (x != 1)
1310 args[ac++] = argstr;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001311
Wayne Davison51d48392005-01-22 22:48:34 +00001312 if (list_only > 1)
1313 args[ac++] = "--list-only";
1314
Wayne Davison5c5e1592005-02-19 03:54:11 +00001315 /* The server side doesn't use our log-format, but in certain
1316 * circumstances they need to know a little about the option. */
Wayne Davison684d7582005-02-19 22:16:39 +00001317 if (log_format && am_sender) {
1318 if (log_format_has_i)
1319 args[ac++] = "--log-format=%i";
1320 else if (log_format_has_o_or_i)
Wayne Davison5c5e1592005-02-19 03:54:11 +00001321 args[ac++] = "--log-format=%o";
1322 else if (!verbose)
1323 args[ac++] = "--log-format=X";
1324 }
Wayne Davison1f30a672005-02-19 02:39:30 +00001325
J.W. Schultz195bd902003-04-10 02:04:58 +00001326 if (block_size) {
Wayne Davisona06b4192005-01-01 21:08:14 +00001327 if (asprintf(&arg, "-B%lu", block_size) < 0)
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001328 goto oom;
1329 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001330 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001331
Andrew Tridgell0b73ca12000-01-23 11:43:04 +00001332 if (max_delete && am_sender) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001333 if (asprintf(&arg, "--max-delete=%d", max_delete) < 0)
1334 goto oom;
1335 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001336 }
1337
Wayne Davison7d5acf12004-11-11 01:45:25 +00001338 if (max_size && am_sender) {
1339 args[ac++] = "--max-size";
1340 args[ac++] = max_size_arg;
1341 }
1342
Andrew Tridgelld8537831998-07-17 10:00:43 +00001343 if (io_timeout) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001344 if (asprintf(&arg, "--timeout=%d", io_timeout) < 0)
1345 goto oom;
1346 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001347 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001348
David Dykstraef5d23e2000-06-06 21:13:05 +00001349 if (bwlimit) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001350 if (asprintf(&arg, "--bwlimit=%d", bwlimit) < 0)
1351 goto oom;
1352 args[ac++] = arg;
David Dykstraef5d23e2000-06-06 21:13:05 +00001353 }
1354
Wayne Davisond175d7e2003-08-01 07:58:44 +00001355 if (backup_dir) {
1356 args[ac++] = "--backup-dir";
1357 args[ac++] = backup_dir;
1358 }
1359
1360 /* Only send --suffix if it specifies a non-default value. */
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001361 if (strcmp(backup_suffix, backup_dir ? "" : BACKUP_SUFFIX) != 0) {
Wayne Davison191e40d2003-08-01 20:19:51 +00001362 /* We use the following syntax to avoid weirdness with '~'. */
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001363 if (asprintf(&arg, "--suffix=%s", backup_suffix) < 0)
1364 goto oom;
1365 args[ac++] = arg;
Andrew Tridgelld8537831998-07-17 10:00:43 +00001366 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001367
Wayne Davison06a50542004-08-02 05:00:30 +00001368 if (am_sender) {
1369 if (delete_excluded)
1370 args[ac++] = "--delete-excluded";
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +00001371 else if (delete_before == 1 || delete_after)
Wayne Davison06a50542004-08-02 05:00:30 +00001372 args[ac++] = "--delete";
Wayne Davison57f74bd2005-01-28 07:50:00 +00001373 if (delete_before > 1)
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +00001374 args[ac++] = "--delete-before";
Wayne Davison3359acb2005-01-25 03:08:58 +00001375 if (delete_during)
1376 args[ac++] = "--delete-during";
Wayne Davison06a50542004-08-02 05:00:30 +00001377 if (delete_after)
1378 args[ac++] = "--delete-after";
Wayne Davison06a50542004-08-02 05:00:30 +00001379 if (force_delete)
1380 args[ac++] = "--force";
1381 }
David Dykstrab33b7911999-02-22 19:55:57 +00001382
Andrew Tridgellf83f0541999-02-18 03:48:24 +00001383 if (size_only)
1384 args[ac++] = "--size-only";
1385
Andrew Tridgell5b56cc12000-09-06 02:12:13 +00001386 if (modify_window_set) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001387 if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
1388 goto oom;
1389 args[ac++] = arg;
Andrew Tridgell5b56cc12000-09-06 02:12:13 +00001390 }
1391
Wayne Davisonc8d895d2004-05-21 09:44:32 +00001392 if (checksum_seed) {
Wayne Davison221ddb92004-05-22 06:09:22 +00001393 if (asprintf(&arg, "--checksum-seed=%d", checksum_seed) < 0)
Wayne Davisonc8d895d2004-05-21 09:44:32 +00001394 goto oom;
1395 args[ac++] = arg;
1396 }
1397
Wayne Davisona7260c42004-07-29 16:06:38 +00001398 if (partial_dir && am_sender) {
Wayne Davison36719872005-02-11 10:42:55 +00001399 if (partial_dir != partialdir_for_delayupdate) {
1400 args[ac++] = "--partial-dir";
1401 args[ac++] = partial_dir;
1402 }
Wayne Davisonf06e7082005-01-27 22:46:14 +00001403 if (delay_updates)
1404 args[ac++] = "--delay-updates";
Wayne Davisona7260c42004-07-29 16:06:38 +00001405 } else if (keep_partial)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001406 args[ac++] = "--partial";
Andrew Tridgellc95da961998-07-01 03:36:03 +00001407
Andrew Tridgellef55c682000-03-21 04:06:04 +00001408 if (ignore_errors)
1409 args[ac++] = "--ignore-errors";
1410
David Dykstrab5313601999-02-17 19:34:40 +00001411 if (copy_unsafe_links)
1412 args[ac++] = "--copy-unsafe-links";
1413
Andrew Tridgelld8537831998-07-17 10:00:43 +00001414 if (safe_symlinks)
1415 args[ac++] = "--safe-links";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001416
Andrew Tridgelld8537831998-07-17 10:00:43 +00001417 if (numeric_ids)
1418 args[ac++] = "--numeric-ids";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001419
Andrew Tridgell0b73ca12000-01-23 11:43:04 +00001420 if (only_existing && am_sender)
Andrew Tridgell1347d512000-01-23 01:53:18 +00001421 args[ac++] = "--existing";
1422
Wayne Davisondfa32482003-03-21 18:58:50 +00001423 if (opt_ignore_existing && am_sender)
Martin Pool3d6fead2002-01-25 10:42:23 +00001424 args[ac++] = "--ignore-existing";
1425
Wayne Davisona3221d22004-07-16 20:06:24 +00001426 if (inplace)
1427 args[ac++] = "--inplace";
1428
Andrew Tridgelld8537831998-07-17 10:00:43 +00001429 if (tmpdir) {
1430 args[ac++] = "--temp-dir";
1431 args[ac++] = tmpdir;
1432 }
1433
Wayne Davisone012f852004-11-27 17:52:51 +00001434 if (basis_dir[0] && am_sender) {
David Dykstra375a4551998-10-26 21:42:38 +00001435 /* the server only needs this option if it is not the sender,
1436 * and it may be an older version that doesn't know this
1437 * option, so don't send it if client is the sender.
1438 */
Wayne Davisone012f852004-11-27 17:52:51 +00001439 int i;
1440 for (i = 0; i < basis_dir_cnt; i++) {
1441 args[ac++] = dest_option;
1442 args[ac++] = basis_dir[i];
1443 }
David Dykstra375a4551998-10-26 21:42:38 +00001444 }
1445
Wayne Davison305666b2005-03-01 01:15:57 +00001446 if (files_from && (!am_sender || filesfrom_host)) {
1447 if (filesfrom_host) {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001448 args[ac++] = "--files-from";
Wayne Davison305666b2005-03-01 01:15:57 +00001449 args[ac++] = files_from;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001450 if (eol_nulls)
1451 args[ac++] = "--from0";
1452 } else {
1453 args[ac++] = "--files-from=-";
1454 args[ac++] = "--from0";
1455 }
Wayne Davisonc0ab28d2004-12-22 09:10:08 +00001456 if (!relative_paths)
1457 args[ac++] = "--no-relative";
Wayne Davisonea5164d2003-03-30 23:00:42 +00001458 }
Wayne Davisonc72f5bd2005-01-19 00:34:13 +00001459 if (!implied_dirs && !am_sender)
Wayne Davison3a90ea02005-01-19 00:23:32 +00001460 args[ac++] = "--no-implied-dirs";
Wayne Davisonea5164d2003-03-30 23:00:42 +00001461
Wayne Davisonc4ed1482005-02-14 02:41:15 +00001462 if (fuzzy_basis && am_sender)
1463 args[ac++] = "--fuzzy";
1464
Wayne Davison07c6ae72005-02-20 01:04:40 +00001465 if (remove_sent_files)
1466 args[ac++] = "--remove-sent-files";
1467
Andrew Tridgelld8537831998-07-17 10:00:43 +00001468 *argc = ac;
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001469 return;
1470
1471 oom:
1472 out_of_memory("server_options");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001473}
1474
Wayne Davison305666b2005-03-01 01:15:57 +00001475/* Look for a HOST specfication of the form "HOST:PATH", "HOST::PATH", or
1476 * "rsync://HOST:PORT/PATH". If found, *host_ptr will be set to some allocated
1477 * memory with the HOST. If a daemon-accessing spec was specified, the value
1478 * of *port_ptr will contain a non-0 port number, otherwise it will be set to
1479 * 0. The return value is a pointer to the PATH. Note that the HOST spec can
1480 * be an IPv6 literal address enclosed in '[' and ']' (such as "[::1]" or
1481 * "[::ffff:127.0.0.1]") which is returned without the '[' and ']'. */
1482char *check_for_hostspec(char *s, char **host_ptr, int *port_ptr)
Wayne Davisonea5164d2003-03-30 23:00:42 +00001483{
Wayne Davison305666b2005-03-01 01:15:57 +00001484 char *p;
1485 int not_host;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001486
Wayne Davison305666b2005-03-01 01:15:57 +00001487 if (port_ptr && strncasecmp(URL_PREFIX, s, strlen(URL_PREFIX)) == 0) {
1488 char *path;
1489 int hostlen;
1490 s += strlen(URL_PREFIX);
1491 if ((p = strchr(s, '/')) != NULL) {
1492 hostlen = p - s;
1493 path = p + 1;
1494 } else {
1495 hostlen = strlen(s);
1496 path = "";
1497 }
1498 if (*s == '[' && (p = strchr(s, ']')) != NULL) {
1499 s++;
1500 hostlen = p - s;
Wayne Davisonc60b7052005-03-01 05:49:11 +00001501 if (p[1] == ':')
1502 *port_ptr = atoi(p+2);
Wayne Davison305666b2005-03-01 01:15:57 +00001503 } else {
1504 if ((p = strchr(s, ':')) != NULL) {
1505 hostlen = p - s;
1506 *port_ptr = atoi(p+1);
Wayne Davisonc60b7052005-03-01 05:49:11 +00001507 }
Wayne Davison305666b2005-03-01 01:15:57 +00001508 }
Wayne Davisonc60b7052005-03-01 05:49:11 +00001509 if (!*port_ptr)
1510 *port_ptr = RSYNC_PORT;
Wayne Davison305666b2005-03-01 01:15:57 +00001511 *host_ptr = new_array(char, hostlen + 1);
1512 strlcpy(*host_ptr, s, hostlen + 1);
1513 return path;
1514 }
Wayne Davisonea5164d2003-03-30 23:00:42 +00001515
Wayne Davison305666b2005-03-01 01:15:57 +00001516 if (*s == '[' && (p = strchr(s, ']')) != NULL && p[1] == ':') {
1517 s++;
1518 *p = '\0';
1519 not_host = strchr(s, '/') || !strchr(s, ':');
1520 *p = ']';
1521 if (not_host)
1522 return NULL;
Wayne Davisonc60b7052005-03-01 05:49:11 +00001523 p++;
Wayne Davison305666b2005-03-01 01:15:57 +00001524 } else {
1525 if (!(p = strchr(s, ':')))
1526 return NULL;
1527 *p = '\0';
1528 not_host = strchr(s, '/') != NULL;
1529 *p = ':';
1530 if (not_host)
1531 return NULL;
1532 }
Wayne Davisonea5164d2003-03-30 23:00:42 +00001533
Wayne Davison305666b2005-03-01 01:15:57 +00001534 *host_ptr = new_array(char, p - s + 1);
1535 strlcpy(*host_ptr, s, p - s + 1);
1536
1537 if (p[1] == ':') {
1538 if (port_ptr && !*port_ptr)
1539 *port_ptr = RSYNC_PORT;
1540 return p + 2;
1541 }
1542 if (port_ptr)
1543 *port_ptr = 0;
1544
1545 return p + 1;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001546}