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