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