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