blob: 5ff1e9d615eaba4f418a77c4e652b1ea77c34215 [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;
68int orig_umask = 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +000069int relative_paths = -1;
70int implied_dirs = 1;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000071int numeric_ids = 0;
72int force_delete = 0;
73int io_timeout = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000074int am_server = 0;
Wayne Davisonf1d5ba42005-02-01 09:46:42 +000075int am_sender = -1;
Wayne Davison4337c8f2004-01-27 23:13:12 +000076int am_generator = 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +000077char *files_from = NULL;
78int filesfrom_fd = -1;
79char *remote_filesfrom_file = NULL;
80int eol_nulls = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +000081int recurse = 0;
Wayne Davison65e4cda2005-01-24 00:17:39 +000082int xfer_dirs = 0;
Wayne Davison1312d9f2002-08-01 00:37:01 +000083int am_daemon = 0;
84int daemon_over_rsh = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000085int do_stats = 0;
86int do_progress = 0;
87int keep_partial = 0;
88int safe_symlinks = 0;
89int copy_unsafe_links = 0;
90int size_only = 0;
Wayne Davison9fb08442004-11-17 19:29:20 +000091int daemon_bwlimit = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000092int bwlimit = 0;
Wayne Davisonc4ed1482005-02-14 02:41:15 +000093int fuzzy_basis = 0;
Wayne Davison3c74c3a2004-05-27 21:51:53 +000094size_t bwlimit_writemax = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000095int only_existing = 0;
96int opt_ignore_existing = 0;
Wayne Davison07c6ae72005-02-20 01:04:40 +000097int need_messages_from_generator = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +000098int max_delete = 0;
Wayne Davison7d5acf12004-11-11 01:45:25 +000099OFF_T max_size = 0;
Wayne Davisona5c11132004-02-09 17:45:22 +0000100int ignore_errors = 0;
101int modify_window = 0;
102int blocking_io = -1;
Wayne Davison2289bf62004-02-09 18:32:54 +0000103int checksum_seed = 0;
Wayne Davisona3221d22004-07-16 20:06:24 +0000104int inplace = 0;
Wayne Davisonf06e7082005-01-27 22:46:14 +0000105int delay_updates = 0;
Wayne Davisona06b4192005-01-01 21:08:14 +0000106long block_size = 0; /* "long" because popt can't set an int32. */
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000107
Martin Poolb35d0d82002-04-08 04:10:20 +0000108
Martin Pool13e29992001-12-18 05:54:57 +0000109/** Network address family. **/
Wayne Davison4f5b0752005-02-14 00:53:43 +0000110#ifdef INET6
Martin Pool13e29992001-12-18 05:54:57 +0000111int default_af_hint = 0; /* Any protocol */
David Dykstra6ab6d4b2001-12-14 18:25:51 +0000112#else
Martin Pool13e29992001-12-18 05:54:57 +0000113int default_af_hint = AF_INET; /* Must use IPv4 */
David Dykstra6ab6d4b2001-12-14 18:25:51 +0000114#endif
Martin Pool06963d02001-11-23 07:35:49 +0000115
Martin Pool13e29992001-12-18 05:54:57 +0000116/** Do not go into the background when run as --daemon. Good
117 * for debugging and required for running as a service on W32,
118 * or under Unix process-monitors. **/
119int no_detach = 0;
120
David Dykstra088aac82002-02-06 21:20:48 +0000121int write_batch = 0;
122int read_batch = 0;
Wayne Davisond175d7e2003-08-01 07:58:44 +0000123int backup_dir_len = 0;
124int backup_suffix_len;
Wayne Davisone0391f82004-02-11 04:30:41 +0000125unsigned int backup_dir_remainder;
Martin Pool6902ed12001-08-14 02:04:47 +0000126
Wayne Davisond175d7e2003-08-01 07:58:44 +0000127char *backup_suffix = NULL;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000128char *tmpdir = NULL;
Wayne Davisona7260c42004-07-29 16:06:38 +0000129char *partial_dir = NULL;
Wayne Davisone012f852004-11-27 17:52:51 +0000130char *basis_dir[MAX_BASIS_DIRS+1];
David Dykstra30e8c8e2002-08-30 23:27:26 +0000131char *config_file = NULL;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000132char *shell_cmd = NULL;
Andrew Tridgellb6062651998-11-03 03:48:47 +0000133char *log_format = NULL;
Andrew Tridgell65575e91999-01-08 10:32:56 +0000134char *password_file = NULL;
David Dykstra41bd28f2001-06-12 19:33:41 +0000135char *rsync_path = RSYNC_PATH;
Andrew Tridgell66203a92000-01-24 04:58:53 +0000136char *backup_dir = NULL;
Wayne Davisone0391f82004-02-11 04:30:41 +0000137char backup_dir_buf[MAXPATHLEN];
Wayne Davison0c56b1a2004-11-27 18:24:12 +0000138int rsync_port = 0;
Wayne Davisondfd7d542005-01-15 20:54:25 +0000139int compare_dest = 0;
Wayne Davisone012f852004-11-27 17:52:51 +0000140int copy_dest = 0;
David Dykstra59c95e42002-08-29 14:44:55 +0000141int link_dest = 0;
Wayne Davisonce0b3842005-01-15 21:12:58 +0000142int basis_dir_cnt = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000143
144int verbose = 0;
David Dykstrab86f0ce1999-02-09 17:25:35 +0000145int quiet = 0;
Wayne Davisonb78296c2005-02-15 07:41:13 +0000146int itemize_changes = 0;
Wayne Davisone7651882005-02-16 08:10:31 +0000147int log_before_transfer = 0;
Wayne Davison684d7582005-02-19 22:16:39 +0000148int log_format_has_i = 0;
Wayne Davison5c5e1592005-02-19 03:54:11 +0000149int log_format_has_o_or_i = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000150int always_checksum = 0;
Andrew Tridgellf7632fc1998-11-02 00:52:01 +0000151int list_only = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000152
Wayne Davison9b3318b2004-07-15 16:27:02 +0000153#define MAX_BATCH_NAME_LEN 256 /* Must be less than MAXPATHLEN-13 */
154char *batch_name = NULL;
Martin Pool6902ed12001-08-14 02:04:47 +0000155
Wayne Davisone1add892004-02-01 17:29:41 +0000156static int daemon_opt; /* sets am_daemon after option error-reporting */
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000157static int F_option_cnt = 0;
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000158static int modify_window_set;
Wayne Davison702cd152005-02-18 17:36:12 +0000159static int refused_delete, refused_archive_part;
Wayne Davison3296f912005-02-15 21:15:58 +0000160static int refused_partial, refused_progress, refused_delete_before;
Wayne Davison12a79db2005-01-15 04:40:06 +0000161static char *dest_option = NULL;
Wayne Davison7d5acf12004-11-11 01:45:25 +0000162static char *max_size_arg;
Wayne Davison36719872005-02-11 10:42:55 +0000163static char partialdir_for_delayupdate[] = ".~tmp~";
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000164
Martin Pool06963d02001-11-23 07:35:49 +0000165/** Local address to bind. As a character string because it's
Wayne Davisonfdf57ed2004-06-20 19:47:05 +0000166 * interpreted by the IPv6 layer: should be a numeric IP4 or IP6
Martin Pool06963d02001-11-23 07:35:49 +0000167 * address, or a hostname. **/
168char *bind_address;
Andrew Tridgell5c9730a1999-10-31 03:21:02 +0000169
Martin Pool7a24c342000-11-09 09:05:14 +0000170
Martin Pool27a12342001-12-05 13:45:51 +0000171static void print_rsync_version(enum logcode f)
Martin Pool7a24c342000-11-09 09:05:14 +0000172{
Wayne Davisondfa32482003-03-21 18:58:50 +0000173 char const *got_socketpair = "no ";
Wayne Davisona3221d22004-07-16 20:06:24 +0000174 char const *have_inplace = "no ";
Wayne Davisondfa32482003-03-21 18:58:50 +0000175 char const *hardlinks = "no ";
176 char const *links = "no ";
Martin Poola3584492001-11-24 04:57:41 +0000177 char const *ipv6 = "no ";
Martin Pool736a6a22002-01-11 07:15:16 +0000178 STRUCT_STAT *dumstat;
Martin Pool0c80cd82000-11-10 03:41:47 +0000179
Wayne Davison4f5b0752005-02-14 00:53:43 +0000180#ifdef HAVE_SOCKETPAIR
Wayne Davisondfa32482003-03-21 18:58:50 +0000181 got_socketpair = "";
Martin Pool0c80cd82000-11-10 03:41:47 +0000182#endif
Martin Pool2855f612001-02-23 01:02:31 +0000183
Wayne Davison4f5b0752005-02-14 00:53:43 +0000184#ifdef HAVE_FTRUNCATE
Wayne Davisona3221d22004-07-16 20:06:24 +0000185 have_inplace = "";
186#endif
187
Wayne Davison4f5b0752005-02-14 00:53:43 +0000188#ifdef SUPPORT_HARD_LINKS
Wayne Davisondfa32482003-03-21 18:58:50 +0000189 hardlinks = "";
Martin Pool2855f612001-02-23 01:02:31 +0000190#endif
191
Wayne Davison4f5b0752005-02-14 00:53:43 +0000192#ifdef SUPPORT_LINKS
Wayne Davisondfa32482003-03-21 18:58:50 +0000193 links = "";
Martin Pool2855f612001-02-23 01:02:31 +0000194#endif
195
Wayne Davison4f5b0752005-02-14 00:53:43 +0000196#ifdef INET6
Martin Poola3584492001-11-24 04:57:41 +0000197 ipv6 = "";
Wayne Davisondfa32482003-03-21 18:58:50 +0000198#endif
Martin Poola3584492001-11-24 04:57:41 +0000199
Wayne Davisondfa32482003-03-21 18:58:50 +0000200 rprintf(f, "%s version %s protocol version %d\n",
201 RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
202 rprintf(f,
Wayne Davison72a90c72005-01-27 21:42:56 +0000203 "Copyright (C) 1996-2005 by Andrew Tridgell and others\n");
Martin Pool3b4b1982001-08-14 02:08:17 +0000204 rprintf(f, "<http://rsync.samba.org/>\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000205 rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
206 "%shard links, %ssymlinks, batchfiles, \n",
Wayne Davisona5c11132004-02-09 17:45:22 +0000207 (int) (sizeof (OFF_T) * 8),
Wayne Davisondfa32482003-03-21 18:58:50 +0000208 got_socketpair, hardlinks, links);
Martin Pool2855f612001-02-23 01:02:31 +0000209
Martin Pool736a6a22002-01-11 07:15:16 +0000210 /* Note that this field may not have type ino_t. It depends
211 * on the complicated interaction between largefile feature
212 * macros. */
Wayne Davisona3221d22004-07-16 20:06:24 +0000213 rprintf(f, " %sinplace, %sIPv6, %d-bit system inums, %d-bit internal inums\n",
214 have_inplace, ipv6,
Wayne Davisona5c11132004-02-09 17:45:22 +0000215 (int) (sizeof dumstat->st_ino * 8),
Wayne Davison14908122005-01-20 22:42:47 +0000216 (int) (sizeof (int64) * 8));
Martin Poolfc0302c2002-04-08 07:36:05 +0000217#ifdef MAINTAINER_MODE
218 rprintf(f, " panic action: \"%s\"\n",
219 get_panic_action());
220#endif
Martin Pool736a6a22002-01-11 07:15:16 +0000221
Wayne Davison031fa9a2005-01-28 06:46:33 +0000222#if SIZEOF_INT64 < 8
223 rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
Martin Pool7a24c342000-11-09 09:05:14 +0000224#endif
Wayne Davisonc561eda2005-01-28 06:51:44 +0000225 if (sizeof (int64) != SIZEOF_INT64) {
226 rprintf(f,
227 "WARNING: size mismatch in SIZEOF_INT64 define (%d != %d)\n",
228 (int) SIZEOF_INT64, (int) sizeof (int64));
229 }
Martin Pool7b329a22002-03-19 05:00:05 +0000230
231 rprintf(f,
232"\n"
233"rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
234"are welcome to redistribute it under certain conditions. See the GNU\n"
235"General Public Licence for details.\n"
236 );
Martin Pool7a24c342000-11-09 09:05:14 +0000237}
238
239
Andrew Tridgell0f3203c2000-01-29 02:49:03 +0000240void usage(enum logcode F)
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000241{
Martin Pool2855f612001-02-23 01:02:31 +0000242 print_rsync_version(F);
Andrew Tridgell704f9081998-06-18 09:31:42 +0000243
Martin Pool3ff984d2002-03-19 05:09:19 +0000244 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 +0000245
David Dykstra9ef53901999-02-10 19:33:05 +0000246 rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000247 rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC DEST\n");
David Dykstra9ef53901999-02-10 19:33:05 +0000248 rprintf(F," or rsync [OPTION]... SRC [SRC]... DEST\n");
David Dykstra14d43f11998-11-18 17:36:36 +0000249 rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
David Dykstra9ef53901999-02-10 19:33:05 +0000250 rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
David Dykstra14d43f11998-11-18 17:36:36 +0000251 rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n");
Wayne Davisoneaa4c152002-08-01 17:55:11 +0000252 rprintf(F," or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST\n");
David Dykstra9ef53901999-02-10 19:33:05 +0000253 rprintf(F,"SRC on single-colon remote HOST will be expanded by remote shell\n");
254 rprintf(F,"SRC on server remote HOST may contain shell wildcards or multiple\n");
255 rprintf(F," sources separated by space as long as they have same top-level\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000256 rprintf(F,"\nOptions\n");
257 rprintf(F," -v, --verbose increase verbosity\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000258 rprintf(F," -q, --quiet suppress non-error messages\n");
259 rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n");
260 rprintf(F," -a, --archive archive mode; same as -rlptgoD (no -H)\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000261 rprintf(F," -r, --recursive recurse into directories\n");
262 rprintf(F," -R, --relative use relative path names\n");
Wayne Davisonea5164d2003-03-30 23:00:42 +0000263 rprintf(F," --no-relative turn off --relative\n");
264 rprintf(F," --no-implied-dirs don't send implied dirs with -R\n");
Wayne Davison68391402003-12-30 18:16:25 +0000265 rprintf(F," -b, --backup make backups (see --suffix & --backup-dir)\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000266 rprintf(F," --backup-dir=DIR make backups into hierarchy based in DIR\n");
267 rprintf(F," --suffix=SUFFIX set backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
268 rprintf(F," -u, --update skip files that are newer on the receiver\n");
Wayne Davison4ce838e2005-01-17 23:11:18 +0000269 rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000270 rprintf(F," -d, --dirs transfer directories without recursing\n");
Martin Pool13e29992001-12-18 05:54:57 +0000271 rprintf(F," -l, --links copy symlinks as symlinks\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000272 rprintf(F," -L, --copy-links transform symlink into referent file/dir\n");
273 rprintf(F," --copy-unsafe-links only \"unsafe\" symlinks are transformed\n");
274 rprintf(F," --safe-links ignore symlinks that point outside the source tree\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000275 rprintf(F," -H, --hard-links preserve hard links\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000276 rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000277 rprintf(F," -p, --perms preserve permissions\n");
278 rprintf(F," -o, --owner preserve owner (root only)\n");
279 rprintf(F," -g, --group preserve group\n");
280 rprintf(F," -D, --devices preserve devices (root only)\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000281 rprintf(F," -t, --times preserve times\n");
Wayne Davison20fb7b92005-01-24 00:51:32 +0000282 rprintf(F," -O, --omit-dir-times omit directories when preserving times\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000283 rprintf(F," -S, --sparse handle sparse files efficiently\n");
284 rprintf(F," -n, --dry-run show what would have been transferred\n");
Wayne Davison98bf61c2005-02-14 19:09:30 +0000285 rprintf(F," -W, --whole-file copy files whole (without rsync algorithm)\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000286 rprintf(F," --no-whole-file always use incremental rsync algorithm\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000287 rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n");
Wayne Davison9cd339e2004-08-03 08:05:20 +0000288 rprintf(F," -B, --block-size=SIZE force a fixed checksum block-size\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000289 rprintf(F," -e, --rsh=COMMAND specify the remote shell to use\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000290 rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000291 rprintf(F," --existing only update files that already exist on receiver\n");
Wayne Davison68391402003-12-30 18:16:25 +0000292 rprintf(F," --ignore-existing ignore files that already exist on receiving side\n");
Wayne Davison07c6ae72005-02-20 01:04:40 +0000293 rprintf(F," --remove-sent-files sent files/symlinks are removed from sending side\n");
Wayne Davison3359acb2005-01-25 03:08:58 +0000294 rprintf(F," --del an alias for --delete-during\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000295 rprintf(F," --delete delete files that don't exist on the sending side\n");
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000296 rprintf(F," --delete-before receiver deletes before transfer (default)\n");
Wayne Davison3359acb2005-01-25 03:08:58 +0000297 rprintf(F," --delete-during receiver deletes during transfer, not before\n");
298 rprintf(F," --delete-after receiver deletes after transfer, not before\n");
Wayne Davison51d48392005-01-22 22:48:34 +0000299 rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000300 rprintf(F," --ignore-errors delete even if there are I/O errors\n");
Wayne Davison51d48392005-01-22 22:48:34 +0000301 rprintf(F," --force force deletion of directories even if not empty\n");
Andrew Tridgell0b73ca12000-01-23 11:43:04 +0000302 rprintf(F," --max-delete=NUM don't delete more than NUM files\n");
Wayne Davison7d5acf12004-11-11 01:45:25 +0000303 rprintf(F," --max-size=SIZE don't transfer any file larger than SIZE\n");
Andrew Tridgellc95da961998-07-01 03:36:03 +0000304 rprintf(F," --partial keep partially transferred files\n");
Wayne Davisona7260c42004-07-29 16:06:38 +0000305 rprintf(F," --partial-dir=DIR put a partially transferred file into DIR\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000306 rprintf(F," --delay-updates put all updated files into place at transfer's end\n");
Andrew Tridgell704f9081998-06-18 09:31:42 +0000307 rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000308 rprintf(F," --timeout=TIME set I/O timeout in seconds\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000309 rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n");
310 rprintf(F," --size-only skip files that match in size\n");
311 rprintf(F," --modify-window=NUM compare mod-times with reduced accuracy\n");
Wayne Davison4db88e52004-07-22 15:43:28 +0000312 rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n");
Wayne Davisonc4ed1482005-02-14 02:41:15 +0000313 rprintf(F," -y, --fuzzy find similar file for basis if no dest file\n");
David Dykstra375a4551998-10-26 21:42:38 +0000314 rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
Wayne Davisone012f852004-11-27 17:52:51 +0000315 rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
316 rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
Wayne Davisonf9249462005-02-12 22:22:14 +0000317 rprintf(F," -z, --compress compress file data during the transfer\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000318 rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000319 rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
Wayne Davison9c71f562005-02-13 05:44:29 +0000320 rprintf(F," -F same as --filter='dir-merge /.rsync-filter'\n");
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000321 rprintf(F," repeated: --filter='- .rsync-filter'\n");
David Dykstra2acf81e1998-11-03 21:17:40 +0000322 rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000323 rprintf(F," --exclude-from=FILE read exclude patterns from FILE\n");
David Dykstra2acf81e1998-11-03 21:17:40 +0000324 rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000325 rprintf(F," --include-from=FILE read include patterns from FILE\n");
326 rprintf(F," --files-from=FILE read list of source-file names from FILE\n");
Wayne Davison4db88e52004-07-22 15:43:28 +0000327 rprintf(F," -0, --from0 all *-from file lists are delimited by nulls\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000328 rprintf(F," --version print version number\n");
Wayne Davisonb4713292004-12-08 17:29:54 +0000329 rprintf(F," --port=PORT specify double-colon alternate port number\n");
Wayne Davisondb2b5cb2004-01-23 09:32:50 +0000330 rprintf(F," --blocking-io use blocking I/O for the remote shell\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000331 rprintf(F," --no-blocking-io turn off blocking I/O when it is the default\n");
332 rprintf(F," --stats give some file-transfer stats\n");
Wayne Davisondfa32482003-03-21 18:58:50 +0000333 rprintf(F," --progress show progress during transfer\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000334 rprintf(F," -P same as --partial --progress\n");
Wayne Davisonb78296c2005-02-15 07:41:13 +0000335 rprintf(F," -i, --itemize-changes output a change-summary for all updates\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000336 rprintf(F," --log-format=FORMAT log file-transfers using specified format\n");
337 rprintf(F," --password-file=FILE read password from FILE\n");
Wayne Davison65e4cda2005-01-24 00:17:39 +0000338 rprintf(F," --list-only list the files instead of copying them\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000339 rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
340 rprintf(F," --write-batch=FILE write a batched update to FILE\n");
341 rprintf(F," --read-batch=FILE read a batched update from FILE\n");
Wayne Davison4f5b0752005-02-14 00:53:43 +0000342#ifdef INET6
Wayne Davison4db88e52004-07-22 15:43:28 +0000343 rprintf(F," -4, --ipv4 prefer IPv4\n");
344 rprintf(F," -6, --ipv6 prefer IPv6\n");
Martin Pool06963d02001-11-23 07:35:49 +0000345#endif
Wayne Davison3dd22902004-05-06 21:08:01 +0000346 rprintf(F," -h, --help show this help screen\n");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000347
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000348 rprintf(F,"\nUse \"rsync --daemon --help\" to see the daemon-mode command-line options.\n");
349 rprintf(F,"Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation.\n");
Martin Pool2855f612001-02-23 01:02:31 +0000350 rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and answers\n");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000351}
352
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000353enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000354 OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST,
Wayne Davison1f3d6cd2003-08-05 17:56:54 +0000355 OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
Wayne Davison7d5acf12004-11-11 01:45:25 +0000356 OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE,
Wayne Davisonc67d1382004-02-22 08:56:43 +0000357 OPT_REFUSED_BASE = 9000};
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000358
Martin Pool2855f612001-02-23 01:02:31 +0000359static struct poptOption long_options[] = {
360 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
Wayne Davison8db7cc22004-10-11 10:43:25 +0000361 {"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
Wayne Davisond175d7e2003-08-01 07:58:44 +0000362 {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
Wayne Davison3dd22902004-05-06 21:08:01 +0000363 {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
364 {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000365 {"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
366 {"size-only", 0, POPT_ARG_NONE, &size_only, 0, 0, 0 },
Martin Pool8b54f002002-03-19 04:10:07 +0000367 {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000368 {"one-file-system", 'x', POPT_ARG_NONE, &one_file_system, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000369 {"existing", 0, POPT_ARG_NONE, &only_existing, 0, 0, 0 },
370 {"ignore-existing", 0, POPT_ARG_NONE, &opt_ignore_existing, 0, 0, 0 },
Wayne Davison36719872005-02-11 10:42:55 +0000371 {"del", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
Wayne Davison3359acb2005-01-25 03:08:58 +0000372 {"delete", 0, POPT_ARG_NONE, &delete_mode, 0, 0, 0 },
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000373 {"delete-before", 0, POPT_ARG_VAL, &delete_before, 2, 0, 0 },
Wayne Davison3359acb2005-01-25 03:08:58 +0000374 {"delete-during", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
Wayne Davison51d48392005-01-22 22:48:34 +0000375 {"delete-after", 0, POPT_ARG_NONE, &delete_after, 0, 0, 0 },
376 {"delete-excluded", 0, POPT_ARG_NONE, &delete_excluded, 0, 0, 0 },
Wayne Davison07c6ae72005-02-20 01:04:40 +0000377 {"remove-sent-files",0, POPT_ARG_NONE, &remove_sent_files, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000378 {"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 },
379 {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000380 {"filter", 'f', POPT_ARG_STRING, 0, OPT_FILTER, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000381 {"exclude", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE, 0, 0 },
382 {"include", 0, POPT_ARG_STRING, 0, OPT_INCLUDE, 0, 0 },
383 {"exclude-from", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE_FROM, 0, 0 },
384 {"include-from", 0, POPT_ARG_STRING, 0, OPT_INCLUDE_FROM, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000385 {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000386 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000387 {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
388 {"dry-run", 'n', POPT_ARG_NONE, &dry_run, 0, 0, 0 },
389 {"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 },
390 {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 },
391 {"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 },
Wayne Davisona3221d22004-07-16 20:06:24 +0000392 {"inplace", 0, POPT_ARG_NONE, &inplace, 0, 0, 0 },
Wayne Davison65e4cda2005-01-24 00:17:39 +0000393 {"dirs", 'd', POPT_ARG_VAL, &xfer_dirs, 2, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000394 {"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 },
395 {"copy-links", 'L', POPT_ARG_NONE, &copy_links, 0, 0, 0 },
Wayne Davison65e4cda2005-01-24 00:17:39 +0000396 {"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000397 {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 },
398 {"no-whole-file", 0, POPT_ARG_VAL, &whole_file, 0, 0, 0 },
Wayne Davisonb78296c2005-02-15 07:41:13 +0000399 {"copy-unsafe-links",0, POPT_ARG_NONE, &copy_unsafe_links, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000400 {"perms", 'p', POPT_ARG_NONE, &preserve_perms, 0, 0, 0 },
401 {"owner", 'o', POPT_ARG_NONE, &preserve_uid, 0, 0, 0 },
402 {"group", 'g', POPT_ARG_NONE, &preserve_gid, 0, 0, 0 },
403 {"devices", 'D', POPT_ARG_NONE, &preserve_devices, 0, 0, 0 },
404 {"times", 't', POPT_ARG_NONE, &preserve_times, 0, 0, 0 },
Wayne Davison20fb7b92005-01-24 00:51:32 +0000405 {"omit-dir-times", 'O', POPT_ARG_NONE, &omit_dir_times, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000406 {"checksum", 'c', POPT_ARG_NONE, &always_checksum, 0, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000407 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
408 {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
Wayne Davisondfa32482003-03-21 18:58:50 +0000409 {"archive", 'a', POPT_ARG_NONE, &archive_mode, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000410 {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000411 {"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
Wayne Davison51d48392005-01-22 22:48:34 +0000412 {"recursive", 'r', POPT_ARG_VAL, &recurse, -1, 0, 0 },
413 {"list-only", 0, POPT_ARG_VAL, &list_only, 2, 0, 0 },
Wayne Davisonea5164d2003-03-30 23:00:42 +0000414 {"relative", 'R', POPT_ARG_VAL, &relative_paths, 1, 0, 0 },
415 {"no-relative", 0, POPT_ARG_VAL, &relative_paths, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000416 {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
Wayne Davisona06b4192005-01-01 21:08:14 +0000417 {"block-size", 'B', POPT_ARG_LONG, &block_size, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000418 {"max-delete", 0, POPT_ARG_INT, &max_delete, 0, 0, 0 },
Wayne Davison7d5acf12004-11-11 01:45:25 +0000419 {"max-size", 0, POPT_ARG_STRING, &max_size_arg, OPT_MAX_SIZE, 0, 0 },
Wayne Davison99218d82004-06-06 19:02:40 +0000420 {"timeout", 0, POPT_ARG_INT, &io_timeout, OPT_TIMEOUT, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000421 {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
Wayne Davisone012f852004-11-27 17:52:51 +0000422 {"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
423 {"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
424 {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
Wayne Davisonc4ed1482005-02-14 02:41:15 +0000425 {"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 },
Martin Pool2855f612001-02-23 01:02:31 +0000426 /* TODO: Should this take an optional int giving the compression level? */
Wayne Davisonafb6e942003-03-21 19:17:23 +0000427 {"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000428 {"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
429 {"progress", 0, POPT_ARG_NONE, &do_progress, 0, 0, 0 },
430 {"partial", 0, POPT_ARG_NONE, &keep_partial, 0, 0, 0 },
Wayne Davisona7260c42004-07-29 16:06:38 +0000431 {"partial-dir", 0, POPT_ARG_STRING, &partial_dir, 0, 0, 0 },
Wayne Davisonf06e7082005-01-27 22:46:14 +0000432 {"delay-updates", 0, POPT_ARG_NONE, &delay_updates, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000433 {"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors, 0, 0, 0 },
434 {"blocking-io", 0, POPT_ARG_VAL, &blocking_io, 1, 0, 0 },
435 {"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 },
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000436 {0, 'F', POPT_ARG_NONE, 0, 'F', 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000437 {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
Wayne Davisonb4713292004-12-08 17:29:54 +0000438 {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000439 {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
Wayne Davisonb78296c2005-02-15 07:41:13 +0000440 {"itemize-changes", 'i', POPT_ARG_NONE, &itemize_changes, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000441 {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
Wayne Davisonafb6e942003-03-21 19:17:23 +0000442 {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
443 {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
Wayne Davison8db7cc22004-10-11 10:43:25 +0000444 {"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 },
445 {"write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 },
Wayne Davisonea5164d2003-03-30 23:00:42 +0000446 {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
447 {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
448 {"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 },
Wayne Davison4f3e9a02003-09-09 15:58:56 +0000449 {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 },
Wayne Davisonc8d895d2004-05-21 09:44:32 +0000450 {"checksum-seed", 0, POPT_ARG_INT, &checksum_seed, 0, 0, 0 },
Wayne Davison4f5b0752005-02-14 00:53:43 +0000451#ifdef INET6
Wayne Davison3dd22902004-05-06 21:08:01 +0000452 {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
453 {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
Martin Pool06963d02001-11-23 07:35:49 +0000454#endif
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000455 /* All these options switch us into daemon-mode option-parsing. */
456 {"address", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 },
457 {"config", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 },
458 {"daemon", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
459 {"no-detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000460 {0,0,0,0, 0, 0, 0}
461};
462
463static void daemon_usage(enum logcode F)
464{
465 print_rsync_version(F);
466
467 rprintf(F,"\nUsage: rsync --daemon [OPTION]...\n");
468 rprintf(F," --address=ADDRESS bind to the specified address\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000469 rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000470 rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
471 rprintf(F," --no-detach do not detach from the parent\n");
Wayne Davisonb3708ac2005-01-28 09:55:18 +0000472 rprintf(F," --port=PORT listen on alternate port number\n");
Wayne Davison1bd9db72005-01-28 17:07:54 +0000473 rprintf(F," -v, --verbose increase verbosity\n");
Wayne Davison4f5b0752005-02-14 00:53:43 +0000474#ifdef INET6
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000475 rprintf(F," -4, --ipv4 prefer IPv4\n");
476 rprintf(F," -6, --ipv6 prefer IPv6\n");
477#endif
478 rprintf(F," -h, --help show this help screen\n");
479
480 rprintf(F,"\nIf you were not trying to invoke rsync as a daemon, avoid using any of the\n");
481 rprintf(F,"daemon-specific rsync options. See also the rsyncd.conf(5) man page.\n");
482}
483
484static struct poptOption long_daemon_options[] = {
485 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
486 {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
Wayne Davison9fb08442004-11-17 19:29:20 +0000487 {"bwlimit", 0, POPT_ARG_INT, &daemon_bwlimit, 0, 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000488 {"config", 0, POPT_ARG_STRING, &config_file, 0, 0, 0 },
489 {"daemon", 0, POPT_ARG_NONE, &daemon_opt, 0, 0, 0 },
Wayne Davison4f5b0752005-02-14 00:53:43 +0000490#ifdef INET6
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000491 {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 },
492 {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 },
493#endif
494 {"no-detach", 0, POPT_ARG_NONE, &no_detach, 0, 0, 0 },
495 {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
496 {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 },
497 {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 },
Wayne Davison1bd9db72005-01-28 17:07:54 +0000498 {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000499 {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
Wayne Davisonad715002004-10-14 09:11:12 +0000500 {0,0,0,0, 0, 0, 0}
Martin Pool2855f612001-02-23 01:02:31 +0000501};
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000502
Martin Pool06963d02001-11-23 07:35:49 +0000503
Wayne Davisone51094b2004-05-21 09:41:38 +0000504static char err_buf[200];
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000505
Martin Pool2855f612001-02-23 01:02:31 +0000506
Martin Pooldafe63c2002-04-16 01:38:21 +0000507/**
508 * Store the option error message, if any, so that we can log the
509 * connection attempt (which requires parsing the options), and then
510 * show the error later on.
511 **/
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000512void option_error(void)
513{
Wayne Davisone51094b2004-05-21 09:41:38 +0000514 if (!err_buf[0]) {
515 strcpy(err_buf, "Error parsing options: "
516 "option may be supported on client but not on server?\n");
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000517 }
Wayne Davisone51094b2004-05-21 09:41:38 +0000518
Wayne Davisone51094b2004-05-21 09:41:38 +0000519 rprintf(FERROR, RSYNC_NAME ": %s", err_buf);
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000520}
521
Martin Pooldafe63c2002-04-16 01:38:21 +0000522
523/**
Wayne Davison27ed20f2004-02-21 21:12:49 +0000524 * Tweak the option table to disable all options that the rsyncd.conf
525 * file has told us to refuse.
Martin Pooldafe63c2002-04-16 01:38:21 +0000526 **/
Wayne Davison27ed20f2004-02-21 21:12:49 +0000527static void set_refuse_options(char *bp)
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000528{
Wayne Davison27ed20f2004-02-21 21:12:49 +0000529 struct poptOption *op;
Wayne Davison093e8162004-08-02 07:40:34 +0000530 char *cp, shortname[2];
Wayne Davisond73e7f62004-08-04 21:20:34 +0000531 int is_wild, found_match;
Wayne Davison093e8162004-08-02 07:40:34 +0000532
533 shortname[1] = '\0';
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000534
Wayne Davison27ed20f2004-02-21 21:12:49 +0000535 while (1) {
Wayne Davison06a50542004-08-02 05:00:30 +0000536 while (*bp == ' ') bp++;
537 if (!*bp)
538 break;
Wayne Davison27ed20f2004-02-21 21:12:49 +0000539 if ((cp = strchr(bp, ' ')) != NULL)
540 *cp= '\0';
Wayne Davison093e8162004-08-02 07:40:34 +0000541 is_wild = strpbrk(bp, "*?[") != NULL;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000542 found_match = 0;
Wayne Davison55afbb52004-02-21 21:36:55 +0000543 for (op = long_options; ; op++) {
Wayne Davison093e8162004-08-02 07:40:34 +0000544 *shortname = op->shortName;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000545 if (!op->longName && !*shortname)
546 break;
547 if ((op->longName && wildmatch(bp, op->longName))
Wayne Davison684d7582005-02-19 22:16:39 +0000548 || (*shortname && wildmatch(bp, shortname))) {
Wayne Davisone57211c2005-01-23 01:25:36 +0000549 if (op->argInfo == POPT_ARG_VAL)
550 op->argInfo = POPT_ARG_NONE;
Wayne Davison06a50542004-08-02 05:00:30 +0000551 op->val = (op - long_options) + OPT_REFUSED_BASE;
Wayne Davisond73e7f62004-08-04 21:20:34 +0000552 found_match = 1;
Wayne Davison36719872005-02-11 10:42:55 +0000553 /* These flags are set to let us easily check
554 * an implied option later in the code. */
555 switch (*shortname) {
Wayne Davison36719872005-02-11 10:42:55 +0000556 case 'r': case 'd': case 'l': case 'p':
557 case 't': case 'g': case 'o': case 'D':
558 refused_archive_part = op->val;
559 break;
560 case '\0':
561 if (wildmatch("delete", op->longName))
562 refused_delete = op->val;
Wayne Davison3296f912005-02-15 21:15:58 +0000563 else if (wildmatch("delete-before", op->longName))
564 refused_delete_before = op->val;
Wayne Davison36719872005-02-11 10:42:55 +0000565 else if (wildmatch("partial", op->longName))
566 refused_partial = op->val;
567 else if (wildmatch("progress", op->longName))
568 refused_progress = op->val;
569 break;
570 }
Wayne Davison06a50542004-08-02 05:00:30 +0000571 if (!is_wild)
572 break;
Wayne Davison27ed20f2004-02-21 21:12:49 +0000573 }
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000574 }
Wayne Davisond73e7f62004-08-04 21:20:34 +0000575 if (!found_match) {
576 rprintf(FLOG, "No match for refuse-options string \"%s\"\n",
577 bp);
578 }
Wayne Davison27ed20f2004-02-21 21:12:49 +0000579 if (!cp)
580 break;
581 *cp = ' ';
582 bp = cp + 1;
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000583 }
Wayne Davison684d7582005-02-19 22:16:39 +0000584
585 for (op = long_options; ; op++) {
586 *shortname = op->shortName;
587 if (!op->longName && !*shortname)
588 break;
589 if (op->val == OPT_DAEMON) {
590 if (op->argInfo == POPT_ARG_VAL)
591 op->argInfo = POPT_ARG_NONE;
592 op->val = (op - long_options) + OPT_REFUSED_BASE;
593 }
594 }
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000595}
596
597
Wayne Davison8db7cc22004-10-11 10:43:25 +0000598static int count_args(const char **argv)
Martin Pool2855f612001-02-23 01:02:31 +0000599{
Wayne Davisondfa32482003-03-21 18:58:50 +0000600 int i = 0;
Martin Pool2855f612001-02-23 01:02:31 +0000601
Wayne Davison8db7cc22004-10-11 10:43:25 +0000602 if (argv) {
603 while (argv[i] != NULL)
604 i++;
605 }
Wayne Davisondfa32482003-03-21 18:58:50 +0000606
607 return i;
Martin Pool2855f612001-02-23 01:02:31 +0000608}
609
610
Wayne Davison36719872005-02-11 10:42:55 +0000611static void create_refuse_error(int which)
612{
613 /* The "which" value is the index + OPT_REFUSED_BASE. */
614 struct poptOption *op = &long_options[which - OPT_REFUSED_BASE];
615 int n = snprintf(err_buf, sizeof err_buf,
616 "The server is configured to refuse --%s\n",
617 op->longName) - 1;
618 if (op->shortName) {
619 snprintf(err_buf + n, sizeof err_buf - n,
620 " (-%c)\n", op->shortName);
621 }
622}
623
624
Martin Pooldafe63c2002-04-16 01:38:21 +0000625/**
626 * Process command line arguments. Called on both local and remote.
627 *
628 * @retval 1 if all options are OK; with globals set to appropriate
629 * values
630 *
631 * @retval 0 on error, with err_buf containing an explanation
632 **/
Martin Pool2855f612001-02-23 01:02:31 +0000633int parse_arguments(int *argc, const char ***argv, int frommain)
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000634{
Andrew Tridgelld8537831998-07-17 10:00:43 +0000635 int opt;
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000636 char *ref = lp_refuse_options(module_id);
Wayne Davison7be73df2004-03-27 09:46:42 +0000637 const char *arg;
Wayne Davisondfa32482003-03-21 18:58:50 +0000638 poptContext pc;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000639
Wayne Davison27ed20f2004-02-21 21:12:49 +0000640 if (ref && *ref)
641 set_refuse_options(ref);
642
Wayne Davisondfa32482003-03-21 18:58:50 +0000643 /* TODO: Call poptReadDefaultConfig; handle errors. */
Andrew Tridgellcd8185f1998-11-19 06:35:49 +0000644
Wayne Davisondfa32482003-03-21 18:58:50 +0000645 /* The context leaks in case of an error, but if there's a
646 * problem we always exit anyhow. */
647 pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
Wayne Davison9fb08442004-11-17 19:29:20 +0000648 poptReadDefaultConfig(pc, 0);
Martin Pool2855f612001-02-23 01:02:31 +0000649
650 while ((opt = poptGetNextOpt(pc)) != -1) {
Wayne Davisondfa32482003-03-21 18:58:50 +0000651 /* most options are handled automatically by popt;
652 * only special cases are returned and listed here. */
Martin Pool2855f612001-02-23 01:02:31 +0000653
Andrew Tridgelld8537831998-07-17 10:00:43 +0000654 switch (opt) {
655 case OPT_VERSION:
Wayne Davisondfa32482003-03-21 18:58:50 +0000656 print_rsync_version(FINFO);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000657 exit_cleanup(0);
Wayne Davisondfa32482003-03-21 18:58:50 +0000658
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000659 case OPT_DAEMON:
660 if (am_daemon) {
661 strcpy(err_buf, "Attempt to hack rsync thwarted!\n");
662 return 0;
663 }
664 poptFreeContext(pc);
665 pc = poptGetContext(RSYNC_NAME, *argc, *argv,
666 long_daemon_options, 0);
667 while ((opt = poptGetNextOpt(pc)) != -1) {
668 switch (opt) {
669 case 'h':
670 daemon_usage(FINFO);
671 exit_cleanup(0);
672
Wayne Davison1bd9db72005-01-28 17:07:54 +0000673 case 'v':
674 verbose++;
675 break;
676
Wayne Davison3ac7f5d2004-10-14 17:08:15 +0000677 default:
678 rprintf(FERROR,
679 "rsync: %s: %s (in daemon mode)\n",
680 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
681 poptStrerror(opt));
682 goto daemon_error;
683 }
684 }
685 if (!daemon_opt) {
686 rprintf(FERROR, "Daemon option(s) used without --daemon.\n");
687 daemon_error:
688 rprintf(FERROR,
689 "(Type \"rsync --daemon --help\" for assistance with daemon mode.)\n");
690 exit_cleanup(RERR_SYNTAX);
691 }
692 *argv = poptGetArgs(pc);
693 *argc = count_args(*argv);
694 daemon_opt = 0;
695 am_daemon = 1;
696 return 1;
697
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000698 case OPT_MODIFY_WINDOW:
Wayne Davisondfa32482003-03-21 18:58:50 +0000699 /* The value has already been set by popt, but
700 * we need to remember that we're using a
701 * non-default setting. */
Andrew Tridgell5b56cc12000-09-06 02:12:13 +0000702 modify_window_set = 1;
703 break;
Wayne Davison1de50992002-05-03 22:59:17 +0000704
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000705 case OPT_FILTER:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000706 parse_rule(&filter_list, poptGetOptArg(pc), 0, 0);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000707 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000708
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000709 case OPT_EXCLUDE:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000710 parse_rule(&filter_list, poptGetOptArg(pc),
Wayne Davison0a68f862005-02-03 19:00:17 +0000711 0, XFLG_OLD_PREFIXES);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000712 break;
713
Andrew Tridgelld8537831998-07-17 10:00:43 +0000714 case OPT_INCLUDE:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000715 parse_rule(&filter_list, poptGetOptArg(pc),
Wayne Davison0a68f862005-02-03 19:00:17 +0000716 MATCHFLG_INCLUDE, XFLG_OLD_PREFIXES);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000717 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000718
Andrew Tridgelld8537831998-07-17 10:00:43 +0000719 case OPT_EXCLUDE_FROM:
David Dykstra93695762002-02-27 22:49:57 +0000720 case OPT_INCLUDE_FROM:
Wayne Davison7be73df2004-03-27 09:46:42 +0000721 arg = poptGetOptArg(pc);
Wayne Davisonba3db472004-08-26 17:39:48 +0000722 if (sanitize_paths)
723 arg = sanitize_path(NULL, arg, NULL, 0);
Wayne Davison78424182005-01-25 10:39:14 +0000724 if (server_filter_list.head) {
Wayne Davisonba3db472004-08-26 17:39:48 +0000725 char *cp = (char *)arg;
Wayne Davison36719872005-02-11 10:42:55 +0000726 if (!*cp)
727 goto options_rejected;
Wayne Davisonba3db472004-08-26 17:39:48 +0000728 clean_fname(cp, 1);
Wayne Davison78424182005-01-25 10:39:14 +0000729 if (check_filter(&server_filter_list, cp, 0) < 0)
Wayne Davisonba3db472004-08-26 17:39:48 +0000730 goto options_rejected;
731 }
Wayne Davison3a5e9222005-02-04 21:13:03 +0000732 parse_filter_file(&filter_list, arg,
733 opt == OPT_INCLUDE_FROM ? MATCHFLG_INCLUDE : 0,
734 XFLG_FATAL_ERRORS | XFLG_OLD_PREFIXES);
David Dykstra93695762002-02-27 22:49:57 +0000735 break;
736
Andrew Tridgelld8537831998-07-17 10:00:43 +0000737 case 'h':
738 usage(FINFO);
739 exit_cleanup(0);
Andrew Tridgell2b6b4d51998-05-27 11:02:33 +0000740
Andrew Tridgelld8537831998-07-17 10:00:43 +0000741 case 'v':
742 verbose++;
743 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000744
David Dykstrab86f0ce1999-02-09 17:25:35 +0000745 case 'q':
Wayne Davisonf98c60b2004-02-09 18:10:57 +0000746 if (frommain)
747 quiet++;
David Dykstrab86f0ce1999-02-09 17:25:35 +0000748 break;
749
Andrew Tridgelld8537831998-07-17 10:00:43 +0000750 case OPT_SENDER:
751 if (!am_server) {
752 usage(FERROR);
Andrew Tridgell65417571998-11-03 07:08:27 +0000753 exit_cleanup(RERR_SYNTAX);
Andrew Tridgelld8537831998-07-17 10:00:43 +0000754 }
755 am_sender = 1;
756 break;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000757
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000758 case 'F':
759 switch (++F_option_cnt) {
760 case 1:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000761 parse_rule(&filter_list,": /.rsync-filter",0,0);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000762 break;
763 case 2:
Wayne Davison3a5e9222005-02-04 21:13:03 +0000764 parse_rule(&filter_list,"- .rsync-filter",0,0);
Wayne Davisonaa4d3b42005-01-25 00:52:56 +0000765 break;
766 }
767 break;
768
Andrew Tridgelld9fcc191999-10-31 02:47:30 +0000769 case 'P':
Wayne Davison36719872005-02-11 10:42:55 +0000770 if (refused_partial || refused_progress) {
771 create_refuse_error(refused_partial
772 ? refused_partial : refused_progress);
773 return 0;
774 }
Andrew Tridgelld9fcc191999-10-31 02:47:30 +0000775 do_progress = 1;
776 keep_partial = 1;
777 break;
778
David Dykstra088aac82002-02-06 21:20:48 +0000779 case OPT_WRITE_BATCH:
Wayne Davison9b3318b2004-07-15 16:27:02 +0000780 /* batch_name is already set */
David Dykstra088aac82002-02-06 21:20:48 +0000781 write_batch = 1;
782 break;
783
Martin Pool76f79ba2002-01-23 05:51:06 +0000784 case OPT_READ_BATCH:
Wayne Davison9b3318b2004-07-15 16:27:02 +0000785 /* batch_name is already set */
Martin Pool6902ed12001-08-14 02:04:47 +0000786 read_batch = 1;
787 break;
Wayne Davisonea5164d2003-03-30 23:00:42 +0000788
Wayne Davison7d5acf12004-11-11 01:45:25 +0000789 case OPT_MAX_SIZE:
Wayne Davisoncc800222005-01-28 21:32:20 +0000790 for (arg = max_size_arg; isdigit(*(uchar*)arg); arg++) {}
Wayne Davison7d5acf12004-11-11 01:45:25 +0000791 if (*arg == '.')
Wayne Davisoncc800222005-01-28 21:32:20 +0000792 for (arg++; isdigit(*(uchar*)arg); arg++) {}
Wayne Davison7d5acf12004-11-11 01:45:25 +0000793 switch (*arg) {
794 case 'k': case 'K':
795 max_size = atof(max_size_arg) * 1024;
796 break;
797 case 'm': case 'M':
798 max_size = atof(max_size_arg) * 1024*1024;
799 break;
800 case 'g': case 'G':
801 max_size = atof(max_size_arg) * 1024*1024*1024;
802 break;
803 case '\0':
804 max_size = atof(max_size_arg);
805 break;
806 default:
807 max_size = 0;
808 break;
809 }
810 if (max_size <= 0) {
Wayne Davisone012f852004-11-27 17:52:51 +0000811 snprintf(err_buf, sizeof err_buf,
Wayne Davison7d5acf12004-11-11 01:45:25 +0000812 "--max-size value is invalid: %s\n",
813 max_size_arg);
Wayne Davisone012f852004-11-27 17:52:51 +0000814 return 0;
Wayne Davison7d5acf12004-11-11 01:45:25 +0000815 }
816 break;
817
Wayne Davison99218d82004-06-06 19:02:40 +0000818 case OPT_TIMEOUT:
819 if (io_timeout && io_timeout < select_timeout)
820 select_timeout = io_timeout;
821 break;
822
David Dykstra59c95e42002-08-29 14:44:55 +0000823 case OPT_LINK_DEST:
Wayne Davison4f5b0752005-02-14 00:53:43 +0000824#ifdef HAVE_LINK
David Dykstra59c95e42002-08-29 14:44:55 +0000825 link_dest = 1;
Wayne Davisone012f852004-11-27 17:52:51 +0000826 dest_option = "--link-dest";
827 goto set_dest_dir;
David Dykstra59c95e42002-08-29 14:44:55 +0000828#else
Wayne Davisond175d7e2003-08-01 07:58:44 +0000829 snprintf(err_buf, sizeof err_buf,
Wayne Davisondfa32482003-03-21 18:58:50 +0000830 "hard links are not supported on this %s\n",
David Dykstra59c95e42002-08-29 14:44:55 +0000831 am_server ? "server" : "client");
David Dykstra59c95e42002-08-29 14:44:55 +0000832 return 0;
833#endif
834
Wayne Davisone012f852004-11-27 17:52:51 +0000835 case OPT_COPY_DEST:
836 copy_dest = 1;
837 dest_option = "--copy-dest";
838 goto set_dest_dir;
839
840 case OPT_COMPARE_DEST:
841 compare_dest = 1;
842 dest_option = "--compare-dest";
843 set_dest_dir:
Wayne Davison3b26bba2005-01-15 21:23:04 +0000844 if (basis_dir_cnt >= MAX_BASIS_DIRS) {
Wayne Davisone012f852004-11-27 17:52:51 +0000845 snprintf(err_buf, sizeof err_buf,
846 "ERROR: at most %d %s args may be specified\n",
847 MAX_BASIS_DIRS, dest_option);
848 return 0;
849 }
850 arg = poptGetOptArg(pc);
851 if (sanitize_paths)
852 arg = sanitize_path(NULL, arg, NULL, 0);
853 basis_dir[basis_dir_cnt++] = (char *)arg;
854 break;
855
Andrew Tridgelld8537831998-07-17 10:00:43 +0000856 default:
Wayne Davison55afbb52004-02-21 21:36:55 +0000857 /* A large opt value means that set_refuse_options()
Wayne Davison36719872005-02-11 10:42:55 +0000858 * turned this option off. */
Wayne Davisonc67d1382004-02-22 08:56:43 +0000859 if (opt >= OPT_REFUSED_BASE) {
Wayne Davison36719872005-02-11 10:42:55 +0000860 create_refuse_error(opt);
861 return 0;
Wayne Davison27ed20f2004-02-21 21:12:49 +0000862 }
Wayne Davison36719872005-02-11 10:42:55 +0000863 snprintf(err_buf, sizeof err_buf, "%s%s: %s\n",
864 am_server ? "on remote machine: " : "",
865 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
866 poptStrerror(opt));
Wayne Davisondfa32482003-03-21 18:58:50 +0000867 return 0;
Andrew Tridgelld8537831998-07-17 10:00:43 +0000868 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +0000869 }
Martin Pool2855f612001-02-23 01:02:31 +0000870
Wayne Davisonf1d5ba42005-02-01 09:46:42 +0000871 if (am_sender < 0)
872 am_sender = 0;
873
Wayne Davison4f5b0752005-02-14 00:53:43 +0000874#ifndef SUPPORT_LINKS
Wayne Davison54e87b42004-02-02 21:33:10 +0000875 if (preserve_links && !am_sender) {
Wayne Davisone1add892004-02-01 17:29:41 +0000876 snprintf(err_buf, sizeof err_buf,
877 "symlinks are not supported on this %s\n",
878 am_server ? "server" : "client");
Wayne Davisone1add892004-02-01 17:29:41 +0000879 return 0;
880 }
881#endif
882
Wayne Davison4f5b0752005-02-14 00:53:43 +0000883#ifndef SUPPORT_HARD_LINKS
Wayne Davisone1add892004-02-01 17:29:41 +0000884 if (preserve_hard_links) {
885 snprintf(err_buf, sizeof err_buf,
886 "hard links are not supported on this %s\n",
887 am_server ? "server" : "client");
Wayne Davisone1add892004-02-01 17:29:41 +0000888 return 0;
889 }
890#endif
891
David Dykstra088aac82002-02-06 21:20:48 +0000892 if (write_batch && read_batch) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000893 snprintf(err_buf, sizeof err_buf,
Wayne Davison36119892004-07-21 22:50:11 +0000894 "--write-batch and --read-batch can not be used together\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000895 return 0;
David Dykstra088aac82002-02-06 21:20:48 +0000896 }
Wayne Davison94327ff2004-07-15 19:06:32 +0000897 if (write_batch || read_batch) {
898 if (dry_run) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000899 snprintf(err_buf, sizeof err_buf,
Wayne Davison94327ff2004-07-15 19:06:32 +0000900 "--%s-batch cannot be used with --dry_run (-n)\n",
901 write_batch ? "write" : "read");
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000902 return 0;
Wayne Davison94327ff2004-07-15 19:06:32 +0000903 }
904 if (am_server) {
905 rprintf(FINFO,
906 "ignoring --%s-batch option sent to server\n",
907 write_batch ? "write" : "read");
908 /* We don't actually exit_cleanup(), so that we can
909 * still service older version clients that still send
910 * batch args to server. */
911 read_batch = write_batch = 0;
912 batch_name = NULL;
913 }
Wayne Davisonb9f592f2004-07-15 02:20:08 +0000914 }
Wayne Davison36119892004-07-21 22:50:11 +0000915 if (read_batch && files_from) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000916 snprintf(err_buf, sizeof err_buf,
Wayne Davison36119892004-07-21 22:50:11 +0000917 "--read-batch cannot be used with --files-from\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000918 return 0;
Wayne Davison36119892004-07-21 22:50:11 +0000919 }
Wayne Davison9b3318b2004-07-15 16:27:02 +0000920 if (batch_name && strlen(batch_name) > MAX_BATCH_NAME_LEN) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000921 snprintf(err_buf, sizeof err_buf,
Wayne Davison9b3318b2004-07-15 16:27:02 +0000922 "the batch-file name must be %d characters or less.\n",
923 MAX_BATCH_NAME_LEN);
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000924 return 0;
Wayne Davisonbeb93682004-01-19 23:33:02 +0000925 }
David Dykstra088aac82002-02-06 21:20:48 +0000926
Wayne Davisonce58b1b2004-01-22 01:20:24 +0000927 if (tmpdir && strlen(tmpdir) >= MAXPATHLEN - 10) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +0000928 snprintf(err_buf, sizeof err_buf,
929 "the --temp-dir path is WAY too long.\n");
930 return 0;
Wayne Davisonce58b1b2004-01-22 01:20:24 +0000931 }
932
Wayne Davisone012f852004-11-27 17:52:51 +0000933 if (compare_dest + copy_dest + link_dest > 1) {
934 snprintf(err_buf, sizeof err_buf,
935 "You may not mix --compare-dest, --copy-dest, and --link-dest.\n");
936 return 0;
937 }
938
Wayne Davisondfa32482003-03-21 18:58:50 +0000939 if (archive_mode) {
Wayne Davison36719872005-02-11 10:42:55 +0000940 if (refused_archive_part) {
941 create_refuse_error(refused_archive_part);
942 return 0;
943 }
Wayne Davisonea5164d2003-03-30 23:00:42 +0000944 if (!files_from)
Wayne Davison51d48392005-01-22 22:48:34 +0000945 recurse = -1; /* infinite recursion */
Wayne Davison4f5b0752005-02-14 00:53:43 +0000946#ifdef SUPPORT_LINKS
Wayne Davisondfa32482003-03-21 18:58:50 +0000947 preserve_links = 1;
948#endif
949 preserve_perms = 1;
950 preserve_times = 1;
951 preserve_gid = 1;
952 preserve_uid = 1;
953 preserve_devices = 1;
954 }
Wayne Davison51d48392005-01-22 22:48:34 +0000955
956 if (recurse || list_only || files_from)
Wayne Davison65e4cda2005-01-24 00:17:39 +0000957 xfer_dirs |= 1;
Wayne Davisondfa32482003-03-21 18:58:50 +0000958
Wayne Davisonea5164d2003-03-30 23:00:42 +0000959 if (relative_paths < 0)
960 relative_paths = files_from? 1 : 0;
961
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000962 if (!!delete_before + delete_during + delete_after > 1) {
Wayne Davison3359acb2005-01-25 03:08:58 +0000963 snprintf(err_buf, sizeof err_buf,
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +0000964 "You may not combine multiple --delete-WHEN options.\n");
Wayne Davison3359acb2005-01-25 03:08:58 +0000965 return 0;
966 }
Wayne Davison78fc60c2005-01-29 22:35:50 +0000967 if (!recurse) {
968 delete_before = delete_during = delete_after = 0;
969 delete_mode = delete_excluded = 0;
970 } else if (delete_before || delete_during || delete_after)
Wayne Davison51d48392005-01-22 22:48:34 +0000971 delete_mode = 1;
Wayne Davison3296f912005-02-15 21:15:58 +0000972 else if (delete_mode || delete_excluded) {
973 if (refused_delete_before) {
974 create_refuse_error(refused_delete_before);
975 return 0;
976 }
Wayne Davison3359acb2005-01-25 03:08:58 +0000977 delete_mode = delete_before = 1;
Wayne Davison3296f912005-02-15 21:15:58 +0000978 }
Wayne Davison51d48392005-01-22 22:48:34 +0000979
Wayne Davison36719872005-02-11 10:42:55 +0000980 if (delete_mode && refused_delete) {
981 create_refuse_error(refused_delete);
982 return 0;
983 }
984
Wayne Davison07c6ae72005-02-20 01:04:40 +0000985 if (remove_sent_files) {
986 /* We only want to infer this refusal of --remove-sent-files
987 * via the refusal of "delete", not any of the "delete-FOO"
988 * options. */
989 if (refused_delete && am_sender) {
990 create_refuse_error(refused_delete);
991 return 0;
992 }
993 need_messages_from_generator = 1;
994 }
995
Wayne Davison7be73df2004-03-27 09:46:42 +0000996 *argv = poptGetArgs(pc);
Wayne Davison8db7cc22004-10-11 10:43:25 +0000997 *argc = count_args(*argv);
Wayne Davison7be73df2004-03-27 09:46:42 +0000998
999 if (sanitize_paths) {
1000 int i;
1001 for (i = *argc; i-- > 0; )
Wayne Davison10796f42004-08-11 23:41:03 +00001002 (*argv)[i] = sanitize_path(NULL, (*argv)[i], "", 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001003 if (tmpdir)
Wayne Davison10796f42004-08-11 23:41:03 +00001004 tmpdir = sanitize_path(NULL, tmpdir, NULL, 0);
Wayne Davisona7260c42004-07-29 16:06:38 +00001005 if (partial_dir)
Wayne Davison10796f42004-08-11 23:41:03 +00001006 partial_dir = sanitize_path(NULL, partial_dir, NULL, 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001007 if (backup_dir)
Wayne Davison10796f42004-08-11 23:41:03 +00001008 backup_dir = sanitize_path(NULL, backup_dir, NULL, 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001009 if (files_from)
Wayne Davison10796f42004-08-11 23:41:03 +00001010 files_from = sanitize_path(NULL, files_from, NULL, 0);
Wayne Davison7be73df2004-03-27 09:46:42 +00001011 }
Wayne Davison78424182005-01-25 10:39:14 +00001012 if (server_filter_list.head && !am_sender) {
1013 struct filter_list_struct *elp = &server_filter_list;
Wayne Davisone012f852004-11-27 17:52:51 +00001014 int i;
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001015 if (tmpdir) {
Wayne Davison36719872005-02-11 10:42:55 +00001016 if (!*tmpdir)
1017 goto options_rejected;
Wayne Davison58b19992004-08-12 18:20:07 +00001018 clean_fname(tmpdir, 1);
Wayne Davison78424182005-01-25 10:39:14 +00001019 if (check_filter(elp, tmpdir, 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001020 goto options_rejected;
1021 }
Wayne Davison36719872005-02-11 10:42:55 +00001022 if (partial_dir && *partial_dir) {
Wayne Davison58b19992004-08-12 18:20:07 +00001023 clean_fname(partial_dir, 1);
Wayne Davison78424182005-01-25 10:39:14 +00001024 if (check_filter(elp, partial_dir, 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001025 goto options_rejected;
1026 }
Wayne Davisone012f852004-11-27 17:52:51 +00001027 for (i = 0; i < basis_dir_cnt; i++) {
Wayne Davison36719872005-02-11 10:42:55 +00001028 if (!*basis_dir[i])
1029 goto options_rejected;
Wayne Davisone012f852004-11-27 17:52:51 +00001030 clean_fname(basis_dir[i], 1);
Wayne Davison78424182005-01-25 10:39:14 +00001031 if (check_filter(elp, basis_dir[i], 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001032 goto options_rejected;
1033 }
1034 if (backup_dir) {
Wayne Davison36719872005-02-11 10:42:55 +00001035 if (!*backup_dir)
1036 goto options_rejected;
Wayne Davison58b19992004-08-12 18:20:07 +00001037 clean_fname(backup_dir, 1);
Wayne Davison78424182005-01-25 10:39:14 +00001038 if (check_filter(elp, backup_dir, 1) < 0)
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001039 goto options_rejected;
1040 }
1041 }
Wayne Davison78424182005-01-25 10:39:14 +00001042 if (server_filter_list.head && files_from) {
Wayne Davison36719872005-02-11 10:42:55 +00001043 if (!*files_from)
1044 goto options_rejected;
Wayne Davison58b19992004-08-12 18:20:07 +00001045 clean_fname(files_from, 1);
Wayne Davison78424182005-01-25 10:39:14 +00001046 if (check_filter(&server_filter_list, files_from, 0) < 0) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001047 options_rejected:
1048 snprintf(err_buf, sizeof err_buf,
1049 "Your options have been rejected by the server.\n");
1050 return 0;
1051 }
1052 }
Wayne Davison7be73df2004-03-27 09:46:42 +00001053
Wayne Davisond175d7e2003-08-01 07:58:44 +00001054 if (!backup_suffix)
Wayne Davisone0391f82004-02-11 04:30:41 +00001055 backup_suffix = backup_dir ? "" : BACKUP_SUFFIX;
Wayne Davisond175d7e2003-08-01 07:58:44 +00001056 backup_suffix_len = strlen(backup_suffix);
Wayne Davison80ddadb2003-08-01 19:40:31 +00001057 if (strchr(backup_suffix, '/') != NULL) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001058 snprintf(err_buf, sizeof err_buf,
1059 "--suffix cannot contain slashes: %s\n",
Wayne Davison80ddadb2003-08-01 19:40:31 +00001060 backup_suffix);
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001061 return 0;
Wayne Davison80ddadb2003-08-01 19:40:31 +00001062 }
Wayne Davisone0391f82004-02-11 04:30:41 +00001063 if (backup_dir) {
1064 backup_dir_len = strlcpy(backup_dir_buf, backup_dir, sizeof backup_dir_buf);
1065 backup_dir_remainder = sizeof backup_dir_buf - backup_dir_len;
1066 if (backup_dir_remainder < 32) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001067 snprintf(err_buf, sizeof err_buf,
1068 "the --backup-dir path is WAY too long.\n");
1069 return 0;
Wayne Davisone0391f82004-02-11 04:30:41 +00001070 }
1071 if (backup_dir_buf[backup_dir_len - 1] != '/') {
1072 backup_dir_buf[backup_dir_len++] = '/';
1073 backup_dir_buf[backup_dir_len] = '\0';
1074 }
Wayne Davison4875d6b2005-02-07 20:36:43 +00001075 if (verbose > 1 && !am_sender) {
1076 rprintf(FINFO, "backup_dir is %s\n",
1077 safe_fname(backup_dir_buf));
1078 }
Wayne Davison8dcf9332004-03-31 17:02:22 +00001079 } else if (!backup_suffix_len && (!am_server || !am_sender)) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001080 snprintf(err_buf, sizeof err_buf,
Wayne Davisond175d7e2003-08-01 07:58:44 +00001081 "--suffix cannot be a null string without --backup-dir\n");
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001082 return 0;
Wayne Davisond175d7e2003-08-01 07:58:44 +00001083 }
1084
Wayne Davisone7651882005-02-16 08:10:31 +00001085 if (log_format) {
1086 if (strstr(log_format, "%i") != NULL)
Wayne Davison684d7582005-02-19 22:16:39 +00001087 log_format_has_i = 1;
Wayne Davisone7651882005-02-16 08:10:31 +00001088 if (strstr(log_format, "%b") == NULL
1089 && strstr(log_format, "%c") == NULL)
1090 log_before_transfer = !am_server;
1091 } else if (itemize_changes) {
1092 log_format = "%i %n%L";
Wayne Davison684d7582005-02-19 22:16:39 +00001093 log_format_has_i = 1;
Wayne Davisone7651882005-02-16 08:10:31 +00001094 log_before_transfer = !am_server;
1095 }
Wayne Davison87383692005-02-16 17:02:08 +00001096
1097 if ((do_progress || dry_run) && !verbose && !log_before_transfer
Wayne Davison702cd152005-02-18 17:36:12 +00001098 && !am_server)
J.W. Schultze2559db2003-08-06 06:45:14 +00001099 verbose = 1;
Wayne Davison87383692005-02-16 17:02:08 +00001100
1101 if (verbose && !log_format) {
1102 log_format = "%n%L";
1103 log_before_transfer = !am_server;
Wayne Davison36719872005-02-11 10:42:55 +00001104 }
Wayne Davison684d7582005-02-19 22:16:39 +00001105 if (log_format_has_i
1106 || (log_format && strstr(log_format, "%o") != NULL))
Wayne Davison5c5e1592005-02-19 03:54:11 +00001107 log_format_has_o_or_i = 1;
J.W. Schultze2559db2003-08-06 06:45:14 +00001108
Wayne Davison9fb08442004-11-17 19:29:20 +00001109 if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit))
1110 bwlimit = daemon_bwlimit;
Wayne Davison3c74c3a2004-05-27 21:51:53 +00001111 if (bwlimit) {
1112 bwlimit_writemax = (size_t)bwlimit * 128;
1113 if (bwlimit_writemax < 512)
1114 bwlimit_writemax = 512;
1115 }
1116
Wayne Davisonf06e7082005-01-27 22:46:14 +00001117 if (delay_updates && !partial_dir)
Wayne Davison36719872005-02-11 10:42:55 +00001118 partial_dir = partialdir_for_delayupdate;
Wayne Davisonf06e7082005-01-27 22:46:14 +00001119
Wayne Davisona3221d22004-07-16 20:06:24 +00001120 if (inplace) {
Wayne Davison4f5b0752005-02-14 00:53:43 +00001121#ifdef HAVE_FTRUNCATE
Wayne Davisona7260c42004-07-29 16:06:38 +00001122 if (partial_dir) {
1123 snprintf(err_buf, sizeof err_buf,
Wayne Davisonf06e7082005-01-27 22:46:14 +00001124 "--inplace cannot be used with --%s\n",
1125 delay_updates ? "delay-updates" : "partial-dir");
Wayne Davisona7260c42004-07-29 16:06:38 +00001126 return 0;
1127 }
Wayne Davison36719872005-02-11 10:42:55 +00001128 /* --inplace implies --partial for refusal purposes, but we
1129 * clear the keep_partial flag for internal logic purposes. */
1130 if (refused_partial) {
1131 create_refuse_error(refused_partial);
1132 return 0;
1133 }
Wayne Davisona3221d22004-07-16 20:06:24 +00001134 keep_partial = 0;
Wayne Davisonded4daf2005-01-15 20:22:54 +00001135#else
1136 snprintf(err_buf, sizeof err_buf,
1137 "--inplace is not supported on this %s\n",
1138 am_server ? "server" : "client");
1139 return 0;
1140#endif
Wayne Davison075aa182004-09-18 17:34:56 +00001141 } else {
Wayne Davison36719872005-02-11 10:42:55 +00001142 if (keep_partial && !partial_dir) {
1143 if ((arg = getenv("RSYNC_PARTIAL_DIR")) != NULL && *arg)
1144 partial_dir = strdup(arg);
1145 }
Wayne Davison075aa182004-09-18 17:34:56 +00001146 if (partial_dir) {
Wayne Davison36719872005-02-11 10:42:55 +00001147 if (*partial_dir)
1148 clean_fname(partial_dir, 1);
Wayne Davison075aa182004-09-18 17:34:56 +00001149 if (!*partial_dir || strcmp(partial_dir, ".") == 0)
1150 partial_dir = NULL;
Wayne Davison13791b12004-09-22 04:12:13 +00001151 else if (*partial_dir != '/') {
Wayne Davison3a5e9222005-02-04 21:13:03 +00001152 parse_rule(&filter_list, partial_dir,
Wayne Davison0a68f862005-02-03 19:00:17 +00001153 MATCHFLG_NO_PREFIXES|MATCHFLG_DIRECTORY, 0);
Wayne Davison13791b12004-09-22 04:12:13 +00001154 }
Wayne Davison36719872005-02-11 10:42:55 +00001155 if (!partial_dir && refused_partial) {
1156 create_refuse_error(refused_partial);
1157 return 0;
1158 }
Wayne Davison075aa182004-09-18 17:34:56 +00001159 keep_partial = 1;
1160 }
Wayne Davisona3221d22004-07-16 20:06:24 +00001161 }
1162
Wayne Davisonea5164d2003-03-30 23:00:42 +00001163 if (files_from) {
1164 char *colon;
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)
1172 remote_filesfrom_file = "-";
1173 }
Wayne Davisonea5164d2003-03-30 23:00:42 +00001174 else if ((colon = find_colon(files_from)) != 0) {
1175 if (am_server) {
1176 usage(FERROR);
1177 exit_cleanup(RERR_SYNTAX);
1178 }
1179 remote_filesfrom_file = colon+1 + (colon[1] == ':');
1180 if (strcmp(remote_filesfrom_file, "-") == 0) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001181 snprintf(err_buf, sizeof err_buf,
1182 "Invalid --files-from remote filename\n");
1183 return 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001184 }
1185 } else {
Wayne Davisonea5164d2003-03-30 23:00:42 +00001186 filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);
1187 if (filesfrom_fd < 0) {
Wayne Davisonc3ea0992004-07-31 20:09:54 +00001188 snprintf(err_buf, sizeof err_buf,
1189 "failed to open files-from file %s: %s\n",
1190 files_from, strerror(errno));
1191 return 0;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001192 }
1193 }
1194 }
1195
Andrew Tridgellb11ed3b1998-07-19 04:50:48 +00001196 return 1;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001197}
1198
1199
Martin Pooldafe63c2002-04-16 01:38:21 +00001200/**
1201 * Construct a filtered list of options to pass through from the
1202 * client to the server.
1203 *
1204 * This involves setting options that will tell the server how to
1205 * behave, and also filtering out options that are processed only
1206 * locally.
1207 **/
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001208void server_options(char **args,int *argc)
1209{
Wayne Davisone012f852004-11-27 17:52:51 +00001210 static char argstr[50+MAX_BASIS_DIRS*2];
Andrew Tridgelld8537831998-07-17 10:00:43 +00001211 int ac = *argc;
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001212 char *arg;
David Dykstraef5d23e2000-06-06 21:13:05 +00001213
Andrew Tridgelld8537831998-07-17 10:00:43 +00001214 int i, x;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001215
David Dykstra93689aa2002-02-05 23:05:31 +00001216 if (blocking_io == -1)
1217 blocking_io = 0;
1218
Andrew Tridgelld8537831998-07-17 10:00:43 +00001219 args[ac++] = "--server";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001220
Wayne Davison1312d9f2002-08-01 00:37:01 +00001221 if (daemon_over_rsh) {
1222 args[ac++] = "--daemon";
1223 *argc = ac;
1224 /* if we're passing --daemon, we're done */
1225 return;
1226 }
1227
Andrew Tridgelld8537831998-07-17 10:00:43 +00001228 if (!am_sender)
1229 args[ac++] = "--sender";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001230
Andrew Tridgelld8537831998-07-17 10:00:43 +00001231 x = 1;
1232 argstr[0] = '-';
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001233 for (i = 0; i < verbose; i++)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001234 argstr[x++] = 'v';
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001235
David Dykstrab86f0ce1999-02-09 17:25:35 +00001236 /* the -q option is intentionally left out */
Andrew Tridgelld8537831998-07-17 10:00:43 +00001237 if (make_backups)
1238 argstr[x++] = 'b';
1239 if (update_only)
1240 argstr[x++] = 'u';
1241 if (dry_run)
1242 argstr[x++] = 'n';
1243 if (preserve_links)
1244 argstr[x++] = 'l';
1245 if (copy_links)
1246 argstr[x++] = 'L';
Wayne Davison65e4cda2005-01-24 00:17:39 +00001247 if (xfer_dirs > 1)
Wayne Davison5454d222005-01-29 21:25:44 +00001248 argstr[x++] = 'd';
Wayne Davison716e73d2004-06-05 16:16:30 +00001249 if (keep_dirlinks && am_sender)
1250 argstr[x++] = 'K';
Martin Pool1bfbf402002-03-19 03:21:53 +00001251
Wayne Davisondfa32482003-03-21 18:58:50 +00001252 if (whole_file > 0)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001253 argstr[x++] = 'W';
Martin Poolbceec822002-03-19 03:39:42 +00001254 /* We don't need to send --no-whole-file, because it's the
1255 * default for remote transfers, and in any case old versions
1256 * of rsync will not understand it. */
Wayne Davisondfa32482003-03-21 18:58:50 +00001257
Andrew Tridgelld8537831998-07-17 10:00:43 +00001258 if (preserve_hard_links)
1259 argstr[x++] = 'H';
1260 if (preserve_uid)
1261 argstr[x++] = 'o';
1262 if (preserve_gid)
1263 argstr[x++] = 'g';
1264 if (preserve_devices)
1265 argstr[x++] = 'D';
1266 if (preserve_times)
1267 argstr[x++] = 't';
Wayne Davison20fb7b92005-01-24 00:51:32 +00001268 if (omit_dir_times && am_sender)
1269 argstr[x++] = 'O';
Andrew Tridgelld8537831998-07-17 10:00:43 +00001270 if (preserve_perms)
1271 argstr[x++] = 'p';
Wayne Davison51d48392005-01-22 22:48:34 +00001272 if (recurse < 0)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001273 argstr[x++] = 'r';
1274 if (always_checksum)
1275 argstr[x++] = 'c';
1276 if (cvs_exclude)
1277 argstr[x++] = 'C';
1278 if (ignore_times)
1279 argstr[x++] = 'I';
1280 if (relative_paths)
1281 argstr[x++] = 'R';
1282 if (one_file_system)
1283 argstr[x++] = 'x';
1284 if (sparse_files)
1285 argstr[x++] = 'S';
1286 if (do_compression)
1287 argstr[x++] = 'z';
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001288
Wayne Davison51d48392005-01-22 22:48:34 +00001289 /* This is a complete hack - blame Rusty. FIXME!
1290 * This hack is only needed for older rsync versions that
1291 * don't understand the --list-only option. */
1292 if (list_only == 1 && recurse >= 0)
Andrew Tridgellf0b36a42000-08-29 04:46:27 +00001293 argstr[x++] = 'r';
1294
Andrew Tridgelld8537831998-07-17 10:00:43 +00001295 argstr[x] = 0;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001296
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001297 if (x != 1)
1298 args[ac++] = argstr;
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001299
Wayne Davison51d48392005-01-22 22:48:34 +00001300 if (list_only > 1)
1301 args[ac++] = "--list-only";
1302
Wayne Davison5c5e1592005-02-19 03:54:11 +00001303 /* The server side doesn't use our log-format, but in certain
1304 * circumstances they need to know a little about the option. */
Wayne Davison684d7582005-02-19 22:16:39 +00001305 if (log_format && am_sender) {
1306 if (log_format_has_i)
1307 args[ac++] = "--log-format=%i";
1308 else if (log_format_has_o_or_i)
Wayne Davison5c5e1592005-02-19 03:54:11 +00001309 args[ac++] = "--log-format=%o";
1310 else if (!verbose)
1311 args[ac++] = "--log-format=X";
1312 }
Wayne Davison1f30a672005-02-19 02:39:30 +00001313
J.W. Schultz195bd902003-04-10 02:04:58 +00001314 if (block_size) {
Wayne Davisona06b4192005-01-01 21:08:14 +00001315 if (asprintf(&arg, "-B%lu", block_size) < 0)
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001316 goto oom;
1317 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001318 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001319
Andrew Tridgell0b73ca12000-01-23 11:43:04 +00001320 if (max_delete && am_sender) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001321 if (asprintf(&arg, "--max-delete=%d", max_delete) < 0)
1322 goto oom;
1323 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001324 }
1325
Wayne Davison7d5acf12004-11-11 01:45:25 +00001326 if (max_size && am_sender) {
1327 args[ac++] = "--max-size";
1328 args[ac++] = max_size_arg;
1329 }
1330
Andrew Tridgelld8537831998-07-17 10:00:43 +00001331 if (io_timeout) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001332 if (asprintf(&arg, "--timeout=%d", io_timeout) < 0)
1333 goto oom;
1334 args[ac++] = arg;
Wayne Davisondfa32482003-03-21 18:58:50 +00001335 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001336
David Dykstraef5d23e2000-06-06 21:13:05 +00001337 if (bwlimit) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001338 if (asprintf(&arg, "--bwlimit=%d", bwlimit) < 0)
1339 goto oom;
1340 args[ac++] = arg;
David Dykstraef5d23e2000-06-06 21:13:05 +00001341 }
1342
Wayne Davisond175d7e2003-08-01 07:58:44 +00001343 if (backup_dir) {
1344 args[ac++] = "--backup-dir";
1345 args[ac++] = backup_dir;
1346 }
1347
1348 /* Only send --suffix if it specifies a non-default value. */
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001349 if (strcmp(backup_suffix, backup_dir ? "" : BACKUP_SUFFIX) != 0) {
Wayne Davison191e40d2003-08-01 20:19:51 +00001350 /* We use the following syntax to avoid weirdness with '~'. */
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001351 if (asprintf(&arg, "--suffix=%s", backup_suffix) < 0)
1352 goto oom;
1353 args[ac++] = arg;
Andrew Tridgelld8537831998-07-17 10:00:43 +00001354 }
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001355
Wayne Davison06a50542004-08-02 05:00:30 +00001356 if (am_sender) {
1357 if (delete_excluded)
1358 args[ac++] = "--delete-excluded";
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +00001359 else if (delete_before == 1 || delete_after)
Wayne Davison06a50542004-08-02 05:00:30 +00001360 args[ac++] = "--delete";
Wayne Davison57f74bd2005-01-28 07:50:00 +00001361 if (delete_before > 1)
Wayne Davisonc6eb7fa2005-01-28 07:39:09 +00001362 args[ac++] = "--delete-before";
Wayne Davison3359acb2005-01-25 03:08:58 +00001363 if (delete_during)
1364 args[ac++] = "--delete-during";
Wayne Davison06a50542004-08-02 05:00:30 +00001365 if (delete_after)
1366 args[ac++] = "--delete-after";
Wayne Davison06a50542004-08-02 05:00:30 +00001367 if (force_delete)
1368 args[ac++] = "--force";
1369 }
David Dykstrab33b7911999-02-22 19:55:57 +00001370
Andrew Tridgellf83f0541999-02-18 03:48:24 +00001371 if (size_only)
1372 args[ac++] = "--size-only";
1373
Andrew Tridgell5b56cc12000-09-06 02:12:13 +00001374 if (modify_window_set) {
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001375 if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
1376 goto oom;
1377 args[ac++] = arg;
Andrew Tridgell5b56cc12000-09-06 02:12:13 +00001378 }
1379
Wayne Davisonc8d895d2004-05-21 09:44:32 +00001380 if (checksum_seed) {
Wayne Davison221ddb92004-05-22 06:09:22 +00001381 if (asprintf(&arg, "--checksum-seed=%d", checksum_seed) < 0)
Wayne Davisonc8d895d2004-05-21 09:44:32 +00001382 goto oom;
1383 args[ac++] = arg;
1384 }
1385
Wayne Davisona7260c42004-07-29 16:06:38 +00001386 if (partial_dir && am_sender) {
Wayne Davison36719872005-02-11 10:42:55 +00001387 if (partial_dir != partialdir_for_delayupdate) {
1388 args[ac++] = "--partial-dir";
1389 args[ac++] = partial_dir;
1390 }
Wayne Davisonf06e7082005-01-27 22:46:14 +00001391 if (delay_updates)
1392 args[ac++] = "--delay-updates";
Wayne Davisona7260c42004-07-29 16:06:38 +00001393 } else if (keep_partial)
Andrew Tridgelld8537831998-07-17 10:00:43 +00001394 args[ac++] = "--partial";
Andrew Tridgellc95da961998-07-01 03:36:03 +00001395
Andrew Tridgellef55c682000-03-21 04:06:04 +00001396 if (ignore_errors)
1397 args[ac++] = "--ignore-errors";
1398
David Dykstrab5313601999-02-17 19:34:40 +00001399 if (copy_unsafe_links)
1400 args[ac++] = "--copy-unsafe-links";
1401
Andrew Tridgelld8537831998-07-17 10:00:43 +00001402 if (safe_symlinks)
1403 args[ac++] = "--safe-links";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001404
Andrew Tridgelld8537831998-07-17 10:00:43 +00001405 if (numeric_ids)
1406 args[ac++] = "--numeric-ids";
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001407
Andrew Tridgell0b73ca12000-01-23 11:43:04 +00001408 if (only_existing && am_sender)
Andrew Tridgell1347d512000-01-23 01:53:18 +00001409 args[ac++] = "--existing";
1410
Wayne Davisondfa32482003-03-21 18:58:50 +00001411 if (opt_ignore_existing && am_sender)
Martin Pool3d6fead2002-01-25 10:42:23 +00001412 args[ac++] = "--ignore-existing";
1413
Wayne Davisona3221d22004-07-16 20:06:24 +00001414 if (inplace)
1415 args[ac++] = "--inplace";
1416
Andrew Tridgelld8537831998-07-17 10:00:43 +00001417 if (tmpdir) {
1418 args[ac++] = "--temp-dir";
1419 args[ac++] = tmpdir;
1420 }
1421
Wayne Davisone012f852004-11-27 17:52:51 +00001422 if (basis_dir[0] && am_sender) {
David Dykstra375a4551998-10-26 21:42:38 +00001423 /* the server only needs this option if it is not the sender,
1424 * and it may be an older version that doesn't know this
1425 * option, so don't send it if client is the sender.
1426 */
Wayne Davisone012f852004-11-27 17:52:51 +00001427 int i;
1428 for (i = 0; i < basis_dir_cnt; i++) {
1429 args[ac++] = dest_option;
1430 args[ac++] = basis_dir[i];
1431 }
David Dykstra375a4551998-10-26 21:42:38 +00001432 }
1433
Wayne Davisonea5164d2003-03-30 23:00:42 +00001434 if (files_from && (!am_sender || remote_filesfrom_file)) {
1435 if (remote_filesfrom_file) {
1436 args[ac++] = "--files-from";
1437 args[ac++] = remote_filesfrom_file;
1438 if (eol_nulls)
1439 args[ac++] = "--from0";
1440 } else {
1441 args[ac++] = "--files-from=-";
1442 args[ac++] = "--from0";
1443 }
Wayne Davisonc0ab28d2004-12-22 09:10:08 +00001444 if (!relative_paths)
1445 args[ac++] = "--no-relative";
Wayne Davisonea5164d2003-03-30 23:00:42 +00001446 }
Wayne Davisonc72f5bd2005-01-19 00:34:13 +00001447 if (!implied_dirs && !am_sender)
Wayne Davison3a90ea02005-01-19 00:23:32 +00001448 args[ac++] = "--no-implied-dirs";
Wayne Davisonea5164d2003-03-30 23:00:42 +00001449
Wayne Davisonc4ed1482005-02-14 02:41:15 +00001450 if (fuzzy_basis && am_sender)
1451 args[ac++] = "--fuzzy";
1452
Wayne Davison07c6ae72005-02-20 01:04:40 +00001453 if (remove_sent_files)
1454 args[ac++] = "--remove-sent-files";
1455
Andrew Tridgelld8537831998-07-17 10:00:43 +00001456 *argc = ac;
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001457 return;
1458
1459 oom:
1460 out_of_memory("server_options");
Andrew Tridgell7a6421f1998-05-10 07:25:40 +00001461}
1462
Wayne Davisonea5164d2003-03-30 23:00:42 +00001463/**
1464 * Return the position of a ':' IF it is not part of a filename (i.e. as
1465 * long as it doesn't occur after a slash.
1466 */
1467char *find_colon(char *s)
1468{
1469 char *p, *p2;
1470
1471 p = strchr(s,':');
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001472 if (!p)
1473 return NULL;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001474
1475 /* now check to see if there is a / in the string before the : - if there is then
1476 discard the colon on the assumption that the : is part of a filename */
1477 p2 = strchr(s,'/');
Wayne Davisonf98c60b2004-02-09 18:10:57 +00001478 if (p2 && p2 < p)
1479 return NULL;
Wayne Davisonea5164d2003-03-30 23:00:42 +00001480
1481 return p;
1482}