Remove tempname length problem and files-from from TODO.
[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=BLOCK_SIZE;
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," -P                          equivalent to --partial --progress\n");
258   rprintf(F," -z, --compress              compress file data\n");
259   rprintf(F," -C, --cvs-exclude           auto ignore files in the same way CVS does\n");
260   rprintf(F,"     --exclude=PATTERN       exclude files matching PATTERN\n");
261   rprintf(F,"     --exclude-from=FILE     exclude patterns listed in FILE\n");
262   rprintf(F,"     --include=PATTERN       don't exclude files matching PATTERN\n");
263   rprintf(F,"     --include-from=FILE     don't exclude patterns listed in FILE\n");
264   rprintf(F,"     --files-from=FILE       read FILE for list of source-file names\n");
265   rprintf(F," -0  --from0                 file names we read are separated by nulls, not newlines\n");
266   rprintf(F,"     --version               print version number\n");
267   rprintf(F,"     --daemon                run as a rsync daemon\n");
268   rprintf(F,"     --no-detach             do not detach from the parent\n");
269   rprintf(F,"     --address=ADDRESS       bind to the specified address\n");
270   rprintf(F,"     --config=FILE           specify alternate rsyncd.conf file\n");
271   rprintf(F,"     --port=PORT             specify alternate rsyncd port number\n");
272   rprintf(F,"     --blocking-io           use blocking IO for the remote shell\n");
273   rprintf(F,"     --no-blocking-io        turn off --blocking-io\n");
274   rprintf(F,"     --stats                 give some file transfer stats\n");
275   rprintf(F,"     --progress              show progress during transfer\n");
276   rprintf(F,"     --log-format=FORMAT     log file transfers using specified format\n");
277   rprintf(F,"     --password-file=FILE    get password from FILE\n");
278   rprintf(F,"     --bwlimit=KBPS          limit I/O bandwidth, KBytes per second\n");
279   rprintf(F,"     --write-batch=PREFIX    write batch fileset starting with PREFIX\n");
280   rprintf(F,"     --read-batch=PREFIX     read batch fileset starting with PREFIX\n");
281   rprintf(F," -h, --help                  show this help screen\n");
282 #ifdef INET6
283   rprintf(F," -4                          prefer IPv4\n");
284   rprintf(F," -6                          prefer IPv6\n");
285 #endif
286
287   rprintf(F,"\n");
288
289   rprintf(F,"\nPlease see the rsync(1) and rsyncd.conf(5) man pages for full documentation\n");
290   rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and answers\n");
291 }
292
293 enum {OPT_VERSION = 1000, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
294       OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
295       OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
296       OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
297       OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LINK_DEST,
298       OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
299       OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
300       OPT_IGNORE_ERRORS, OPT_BWLIMIT,
301       OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_IGNORE_EXISTING};
302
303 static struct poptOption long_options[] = {
304   /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
305   {"version",          0,  POPT_ARG_NONE,   0,              OPT_VERSION, 0, 0},
306   {"suffix",           0,  POPT_ARG_STRING, &backup_suffix, OPT_SUFFIX, 0, 0 },
307   {"rsync-path",       0,  POPT_ARG_STRING, &rsync_path,        0, 0, 0 },
308   {"password-file",    0,  POPT_ARG_STRING, &password_file,     0, 0, 0 },
309   {"ignore-times",    'I', POPT_ARG_NONE,   &ignore_times, 0, 0, 0 },
310   {"size-only",        0,  POPT_ARG_NONE,   &size_only, 0, 0, 0 },
311   {"modify-window",    0,  POPT_ARG_INT,    &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
312   {"one-file-system", 'x', POPT_ARG_NONE,   &one_file_system, 0, 0, 0 },
313   {"delete",           0,  POPT_ARG_NONE,   &delete_mode, 0, 0, 0 },
314   {"existing",         0,  POPT_ARG_NONE,   &only_existing, 0, 0, 0 },
315   {"ignore-existing",  0,  POPT_ARG_NONE,   &opt_ignore_existing, 0, 0, 0 },
316   {"delete-after",     0,  POPT_ARG_NONE,   0,              OPT_DELETE_AFTER, 0, 0 },
317   {"delete-excluded",  0,  POPT_ARG_NONE,   0,              OPT_DELETE_EXCLUDED, 0, 0 },
318   {"force",            0,  POPT_ARG_NONE,   &force_delete, 0, 0, 0 },
319   {"numeric-ids",      0,  POPT_ARG_NONE,   &numeric_ids, 0, 0, 0 },
320   {"exclude",          0,  POPT_ARG_STRING, 0,              OPT_EXCLUDE, 0, 0 },
321   {"include",          0,  POPT_ARG_STRING, 0,              OPT_INCLUDE, 0, 0 },
322   {"exclude-from",     0,  POPT_ARG_STRING, 0,              OPT_EXCLUDE_FROM, 0, 0 },
323   {"include-from",     0,  POPT_ARG_STRING, 0,              OPT_INCLUDE_FROM, 0, 0 },
324   {"safe-links",       0,  POPT_ARG_NONE,   &safe_symlinks, 0, 0, 0 },
325   {"help",            'h', POPT_ARG_NONE,   0,              'h', 0, 0 },
326   {"backup",          'b', POPT_ARG_NONE,   &make_backups, 0, 0, 0 },
327   {"dry-run",         'n', POPT_ARG_NONE,   &dry_run, 0, 0, 0 },
328   {"sparse",          'S', POPT_ARG_NONE,   &sparse_files, 0, 0, 0 },
329   {"cvs-exclude",     'C', POPT_ARG_NONE,   &cvs_exclude, 0, 0, 0 },
330   {"update",          'u', POPT_ARG_NONE,   &update_only, 0, 0, 0 },
331   {"links",           'l', POPT_ARG_NONE,   &preserve_links, 0, 0, 0 },
332   {"copy-links",      'L', POPT_ARG_NONE,   &copy_links, 0, 0, 0 },
333   {"whole-file",      'W', POPT_ARG_VAL,    &whole_file, 1, 0, 0 },
334   {"no-whole-file",    0,  POPT_ARG_VAL,    &whole_file, 0, 0, 0 },
335   {"copy-unsafe-links", 0, POPT_ARG_NONE,   &copy_unsafe_links, 0, 0, 0 },
336   {"perms",           'p', POPT_ARG_NONE,   &preserve_perms, 0, 0, 0 },
337   {"owner",           'o', POPT_ARG_NONE,   &preserve_uid, 0, 0, 0 },
338   {"group",           'g', POPT_ARG_NONE,   &preserve_gid, 0, 0, 0 },
339   {"devices",         'D', POPT_ARG_NONE,   &preserve_devices, 0, 0, 0 },
340   {"times",           't', POPT_ARG_NONE,   &preserve_times, 0, 0, 0 },
341   {"checksum",        'c', POPT_ARG_NONE,   &always_checksum, 0, 0, 0 },
342   {"verbose",         'v', POPT_ARG_NONE,   0,               'v', 0, 0 },
343   {"quiet",           'q', POPT_ARG_NONE,   0,               'q', 0, 0 },
344   {"archive",         'a', POPT_ARG_NONE,   &archive_mode, 0, 0, 0 },
345   {"server",           0,  POPT_ARG_NONE,   &am_server, 0, 0, 0 },
346   {"sender",           0,  POPT_ARG_NONE,   0,              OPT_SENDER, 0, 0 },
347   {"recursive",       'r', POPT_ARG_NONE,   &recurse, 0, 0, 0 },
348   {"relative",        'R', POPT_ARG_VAL,    &relative_paths, 1, 0, 0 },
349   {"no-relative",      0,  POPT_ARG_VAL,    &relative_paths, 0, 0, 0 },
350   {"rsh",             'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
351   {"block-size",      'B', POPT_ARG_INT,    &block_size, 0, 0, 0 },
352   {"max-delete",       0,  POPT_ARG_INT,    &max_delete, 0, 0, 0 },
353   {"timeout",          0,  POPT_ARG_INT,    &io_timeout, 0, 0, 0 },
354   {"temp-dir",        'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
355   {"compare-dest",     0,  POPT_ARG_STRING, &compare_dest, 0, 0, 0 },
356   {"link-dest",        0,  POPT_ARG_STRING, 0,              OPT_LINK_DEST, 0, 0 },
357   /* TODO: Should this take an optional int giving the compression level? */
358   {"compress",        'z', POPT_ARG_NONE,   &do_compression, 0, 0, 0 },
359   {"daemon",           0,  POPT_ARG_NONE,   &am_daemon, 0, 0, 0 },
360   {"no-detach",        0,  POPT_ARG_NONE,   &no_detach, 0, 0, 0 },
361   {"stats",            0,  POPT_ARG_NONE,   &do_stats, 0, 0, 0 },
362   {"progress",         0,  POPT_ARG_NONE,   &do_progress, 0, 0, 0 },
363   {"partial",          0,  POPT_ARG_NONE,   &keep_partial, 0, 0, 0 },
364   {"ignore-errors",    0,  POPT_ARG_NONE,   &ignore_errors, 0, 0, 0 },
365   {"blocking-io",      0,  POPT_ARG_VAL,    &blocking_io, 1, 0, 0 },
366   {"no-blocking-io",   0,  POPT_ARG_VAL,    &blocking_io, 0, 0, 0 },
367   {0,                 'P', POPT_ARG_NONE,   0,              'P', 0, 0 },
368   {"config",           0,  POPT_ARG_STRING, &config_file, 0, 0, 0 },
369   {"port",             0,  POPT_ARG_INT,    &rsync_port, 0, 0, 0 },
370   {"log-format",       0,  POPT_ARG_STRING, &log_format, 0, 0, 0 },
371   {"bwlimit",          0,  POPT_ARG_INT,    &bwlimit, 0, 0, 0 },
372   {"address",          0,  POPT_ARG_STRING, &bind_address, 0, 0, 0 },
373   {"backup-dir",       0,  POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
374   {"hard-links",      'H', POPT_ARG_NONE,   &preserve_hard_links, 0, 0, 0 },
375   {"read-batch",       0,  POPT_ARG_STRING, &batch_prefix,  OPT_READ_BATCH, 0, 0 },
376   {"write-batch",      0,  POPT_ARG_STRING, &batch_prefix,  OPT_WRITE_BATCH, 0, 0 },
377   {"files-from",       0,  POPT_ARG_STRING, &files_from, 0, 0, 0 },
378   {"from0",           '0', POPT_ARG_NONE,   &eol_nulls, 0, 0, 0},
379   {"no-implied-dirs",  0,  POPT_ARG_VAL,    &implied_dirs, 0, 0, 0 },
380 #ifdef INET6
381   {0,                 '4', POPT_ARG_VAL,    &default_af_hint, AF_INET, 0, 0 },
382   {0,                 '6', POPT_ARG_VAL,    &default_af_hint, AF_INET6, 0, 0 },
383 #endif
384   {0,0,0,0, 0, 0, 0}
385 };
386
387
388 static char err_buf[100];
389
390
391 /**
392  * Store the option error message, if any, so that we can log the
393  * connection attempt (which requires parsing the options), and then
394  * show the error later on.
395  **/
396 void option_error(void)
397 {
398         if (err_buf[0]) {
399                 rprintf(FLOG, "%s", err_buf);
400                 rprintf(FERROR, "%s: %s", RSYNC_NAME, err_buf);
401         } else {
402                 rprintf (FERROR, "Error parsing options: "
403                          "option may be supported on client but not on server?\n");
404                 rprintf (FERROR, RSYNC_NAME ": Error parsing options: "
405                          "option may be supported on client but not on server?\n");
406         }
407 }
408
409
410 /**
411  * Check to see if we should refuse this option
412  **/
413 static int check_refuse_options(char *ref, int opt)
414 {
415         int i, len;
416         char *p;
417         const char *name;
418
419         for (i=0; long_options[i].longName; i++) {
420                 if (long_options[i].val == opt) break;
421         }
422
423         if (!long_options[i].longName) return 0;
424
425         name = long_options[i].longName;
426         len = strlen(name);
427
428         while ((p = strstr(ref,name))) {
429                 if ((p==ref || p[-1]==' ') &&
430                     (p[len] == ' ' || p[len] == 0)) {
431                         snprintf(err_buf,sizeof(err_buf),
432                                  "The '%s' option is not supported by this server\n", name);
433                         return 1;
434                 }
435                 ref += len;
436         }
437         return 0;
438 }
439
440
441 static int count_args(char const **argv)
442 {
443         int i = 0;
444
445         while (argv[i] != NULL)
446                 i++;
447
448         return i;
449 }
450
451
452 /**
453  * Process command line arguments.  Called on both local and remote.
454  *
455  * @retval 1 if all options are OK; with globals set to appropriate
456  * values
457  *
458  * @retval 0 on error, with err_buf containing an explanation
459  **/
460 int parse_arguments(int *argc, const char ***argv, int frommain)
461 {
462         int opt;
463         char *ref = lp_refuse_options(module_id);
464         poptContext pc;
465
466         /* TODO: Call poptReadDefaultConfig; handle errors. */
467
468         /* The context leaks in case of an error, but if there's a
469          * problem we always exit anyhow. */
470         pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
471
472         while ((opt = poptGetNextOpt(pc)) != -1) {
473                 if (ref) {
474                         if (check_refuse_options(ref, opt)) return 0;
475                 }
476
477                 /* most options are handled automatically by popt;
478                  * only special cases are returned and listed here. */
479
480                 switch (opt) {
481                 case OPT_VERSION:
482                         print_rsync_version(FINFO);
483                         exit_cleanup(0);
484
485                 case OPT_SUFFIX:
486                         /* The value has already been set by popt, but
487                          * we need to remember that a suffix was specified
488                          * in case a backup-directory is used. */
489                         suffix_specified = 1;
490                         break;
491
492                 case OPT_MODIFY_WINDOW:
493                         /* The value has already been set by popt, but
494                          * we need to remember that we're using a
495                          * non-default setting. */
496                         modify_window_set = 1;
497                         break;
498
499                 case OPT_DELETE_AFTER:
500                         delete_after = 1;
501                         delete_mode = 1;
502                         break;
503
504                 case OPT_DELETE_EXCLUDED:
505                         delete_excluded = 1;
506                         delete_mode = 1;
507                         break;
508
509                 case OPT_EXCLUDE:
510                         add_exclude(poptGetOptArg(pc), 0);
511                         break;
512
513                 case OPT_INCLUDE:
514                         add_exclude(poptGetOptArg(pc), 1);
515                         break;
516
517                 case OPT_EXCLUDE_FROM:
518                         add_exclude_file(poptGetOptArg(pc), 1, 0);
519                         break;
520
521                 case OPT_INCLUDE_FROM:
522                         add_exclude_file(poptGetOptArg(pc), 1, 1);
523                         break;
524
525                 case 'h':
526                         usage(FINFO);
527                         exit_cleanup(0);
528
529                 case 'H':
530 #if SUPPORT_HARD_LINKS
531                         preserve_hard_links=1;
532 #else
533                         /* FIXME: Don't say "server" if this is
534                          * happening on the client. */
535                         /* FIXME: Why do we have the duplicated
536                          * rprintf?  Everybody who gets this message
537                          * ought to send it to the client and also to
538                          * the logs. */
539                         snprintf(err_buf,sizeof(err_buf),
540                                  "hard links are not supported on this %s\n",
541                                  am_server ? "server" : "client");
542                         rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
543                         return 0;
544 #endif /* SUPPORT_HARD_LINKS */
545                         break;
546
547                 case 'v':
548                         verbose++;
549                         break;
550
551                 case 'q':
552                         if (frommain) quiet++;
553                         break;
554
555                 case OPT_SENDER:
556                         if (!am_server) {
557                                 usage(FERROR);
558                                 exit_cleanup(RERR_SYNTAX);
559                         }
560                         am_sender = 1;
561                         break;
562
563                 case 'P':
564                         do_progress = 1;
565                         keep_partial = 1;
566                         break;
567
568                 case OPT_WRITE_BATCH:
569                         /* popt stores the filename in batch_prefix for us */
570                         write_batch = 1;
571                         break;
572
573                 case OPT_READ_BATCH:
574                         /* popt stores the filename in batch_prefix for us */
575                         read_batch = 1;
576                         break;
577
578                 case OPT_LINK_DEST:
579 #if HAVE_LINK
580                         compare_dest = (char *)poptGetOptArg(pc);
581                         link_dest = 1;
582                         break;
583 #else
584                         snprintf(err_buf,sizeof(err_buf),
585                                  "hard links are not supported on this %s\n",
586                                  am_server ? "server" : "client");
587                         rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
588                         return 0;
589 #endif
590
591
592                 default:
593                         /* FIXME: If --daemon is specified, then errors for later
594                          * parameters seem to disappear. */
595                         snprintf(err_buf, sizeof(err_buf),
596                                  "%s%s: %s\n",
597                                  am_server ? "on remote machine: " : "",
598                                  poptBadOption(pc, POPT_BADOPTION_NOALIAS),
599                                  poptStrerror(opt));
600                         return 0;
601                 }
602         }
603
604         if (write_batch && read_batch) {
605                 snprintf(err_buf,sizeof(err_buf),
606                          "write-batch and read-batch can not be used together\n");
607                 rprintf(FERROR,"ERROR: write-batch and read-batch"
608                         " can not be used together\n");
609                 return 0;
610         }
611
612         if (do_compression && (write_batch || read_batch)) {
613                 snprintf(err_buf,sizeof(err_buf),
614                          "compress can not be used with write-batch or read-batch\n");
615                 rprintf(FERROR,"ERROR: compress can not be used with"
616                         "  write-batch or read-batch\n");
617                 return 0;
618         }
619
620         if (archive_mode) {
621                 if (!files_from)
622                         recurse = 1;
623 #if SUPPORT_LINKS
624                 preserve_links = 1;
625 #endif
626                 preserve_perms = 1;
627                 preserve_times = 1;
628                 preserve_gid = 1;
629                 preserve_uid = 1;
630                 preserve_devices = 1;
631         }
632
633         if (relative_paths < 0)
634                 relative_paths = files_from? 1 : 0;
635
636         *argv = poptGetArgs(pc);
637         if (*argv)
638                 *argc = count_args(*argv);
639         else
640                 *argc = 0;
641
642         if (files_from) {
643                 char *colon;
644                 if (*argc != 2) {
645                         usage(FERROR);
646                         exit_cleanup(RERR_SYNTAX);
647                 }
648                 if (strcmp(files_from, "-") == 0)
649                         filesfrom_fd = 0;
650                 else if ((colon = find_colon(files_from)) != 0) {
651                         if (am_server) {
652                                 usage(FERROR);
653                                 exit_cleanup(RERR_SYNTAX);
654                         }
655                         remote_filesfrom_file = colon+1 + (colon[1] == ':');
656                         if (strcmp(remote_filesfrom_file, "-") == 0) {
657                                 rprintf(FERROR, "Invalid --files-from remote filename\n");
658                                 exit_cleanup(RERR_SYNTAX);
659                         }
660                 } else {
661                         extern int sanitize_paths;
662                         if (sanitize_paths)
663                                 sanitize_path(strdup(files_from), NULL);
664                         filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);
665                         if (filesfrom_fd < 0) {
666                                 rsyserr(FERROR, errno,
667                                         "failed to open files-from file %s",
668                                         files_from);
669                                 exit_cleanup(RERR_FILEIO);
670                         }
671                 }
672         }
673
674         return 1;
675 }
676
677
678 /**
679  * Construct a filtered list of options to pass through from the
680  * client to the server.
681  *
682  * This involves setting options that will tell the server how to
683  * behave, and also filtering out options that are processed only
684  * locally.
685  **/
686 void server_options(char **args,int *argc)
687 {
688         int ac = *argc;
689         static char argstr[50];
690         static char bsize[30];
691         static char iotime[30];
692         static char mdelete[30];
693         static char mwindow[30];
694         static char bw[50];
695         /* Leave room for ``--(write|read)-batch='' */
696         static char fext[MAXPATHLEN + 15];
697
698         int i, x;
699
700         if (blocking_io == -1)
701                 blocking_io = 0;
702
703         args[ac++] = "--server";
704
705         if (daemon_over_rsh) {
706                 args[ac++] = "--daemon";
707                 *argc = ac;
708                 /* if we're passing --daemon, we're done */
709                 return;
710         }
711
712         if (!am_sender)
713                 args[ac++] = "--sender";
714
715         x = 1;
716         argstr[0] = '-';
717         for (i=0;i<verbose;i++)
718                 argstr[x++] = 'v';
719
720         /* the -q option is intentionally left out */
721         if (make_backups)
722                 argstr[x++] = 'b';
723         if (update_only)
724                 argstr[x++] = 'u';
725         if (dry_run)
726                 argstr[x++] = 'n';
727         if (preserve_links)
728                 argstr[x++] = 'l';
729         if (copy_links)
730                 argstr[x++] = 'L';
731
732         if (whole_file > 0)
733                 argstr[x++] = 'W';
734         /* We don't need to send --no-whole-file, because it's the
735          * default for remote transfers, and in any case old versions
736          * of rsync will not understand it. */
737
738         if (preserve_hard_links)
739                 argstr[x++] = 'H';
740         if (preserve_uid)
741                 argstr[x++] = 'o';
742         if (preserve_gid)
743                 argstr[x++] = 'g';
744         if (preserve_devices)
745                 argstr[x++] = 'D';
746         if (preserve_times)
747                 argstr[x++] = 't';
748         if (preserve_perms)
749                 argstr[x++] = 'p';
750         if (recurse)
751                 argstr[x++] = 'r';
752         if (always_checksum)
753                 argstr[x++] = 'c';
754         if (cvs_exclude)
755                 argstr[x++] = 'C';
756         if (ignore_times)
757                 argstr[x++] = 'I';
758         if (relative_paths)
759                 argstr[x++] = 'R';
760         if (one_file_system)
761                 argstr[x++] = 'x';
762         if (sparse_files)
763                 argstr[x++] = 'S';
764         if (do_compression)
765                 argstr[x++] = 'z';
766
767         /* this is a complete hack - blame Rusty
768
769            this is a hack to make the list_only (remote file list)
770            more useful */
771         if (list_only && !recurse)
772                 argstr[x++] = 'r';
773
774         argstr[x] = 0;
775
776         if (x != 1) args[ac++] = argstr;
777
778         if (block_size != BLOCK_SIZE) {
779                 snprintf(bsize,sizeof(bsize),"-B%d",block_size);
780                 args[ac++] = bsize;
781         }
782
783         if (max_delete && am_sender) {
784                 snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
785                 args[ac++] = mdelete;
786         }
787
788         if (batch_prefix != NULL) {
789                 char *fmt = "";
790                 if (write_batch)
791                         fmt = "--write-batch=%s";
792                 else
793                 if (read_batch)
794                         fmt = "--read-batch=%s";
795                 snprintf(fext,sizeof(fext),fmt,batch_prefix);
796                 args[ac++] = fext;
797         }
798
799         if (io_timeout) {
800                 snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);
801                 args[ac++] = iotime;
802         }
803
804         if (bwlimit) {
805                 snprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit);
806                 args[ac++] = bw;
807         }
808
809         if (strcmp(backup_suffix, BACKUP_SUFFIX)) {
810                 args[ac++] = "--suffix";
811                 args[ac++] = backup_suffix;
812         }
813
814         if (delete_mode && !delete_excluded)
815                 args[ac++] = "--delete";
816
817         if (delete_excluded)
818                 args[ac++] = "--delete-excluded";
819
820         if (size_only)
821                 args[ac++] = "--size-only";
822
823         if (modify_window_set) {
824                 snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
825                          modify_window);
826                 args[ac++] = mwindow;
827         }
828
829         if (keep_partial)
830                 args[ac++] = "--partial";
831
832         if (force_delete)
833                 args[ac++] = "--force";
834
835         if (delete_after)
836                 args[ac++] = "--delete-after";
837
838         if (ignore_errors)
839                 args[ac++] = "--ignore-errors";
840
841         if (copy_unsafe_links)
842                 args[ac++] = "--copy-unsafe-links";
843
844         if (safe_symlinks)
845                 args[ac++] = "--safe-links";
846
847         if (numeric_ids)
848                 args[ac++] = "--numeric-ids";
849
850         if (only_existing && am_sender)
851                 args[ac++] = "--existing";
852
853         if (opt_ignore_existing && am_sender)
854                 args[ac++] = "--ignore-existing";
855
856         if (tmpdir) {
857                 args[ac++] = "--temp-dir";
858                 args[ac++] = tmpdir;
859         }
860
861         if (backup_dir && am_sender) {
862                 /* only the receiver needs this option, if we are the sender
863                  *   then we need to send it to the receiver.
864                  */
865                 args[ac++] = "--backup-dir";
866                 args[ac++] = backup_dir;
867         }
868
869         if (compare_dest && am_sender) {
870                 /* the server only needs this option if it is not the sender,
871                  *   and it may be an older version that doesn't know this
872                  *   option, so don't send it if client is the sender.
873                  */
874                 args[ac++] = link_dest ? "--link-dest" : "--compare-dest";
875                 args[ac++] = compare_dest;
876         }
877
878         if (files_from && (!am_sender || remote_filesfrom_file)) {
879                 if (remote_filesfrom_file) {
880                         args[ac++] = "--files-from";
881                         args[ac++] = remote_filesfrom_file;
882                         if (eol_nulls)
883                                 args[ac++] = "--from0";
884                 } else {
885                         args[ac++] = "--files-from=-";
886                         args[ac++] = "--from0";
887                 }
888         }
889
890         *argc = ac;
891 }
892
893 /**
894  * Return the position of a ':' IF it is not part of a filename (i.e. as
895  * long as it doesn't occur after a slash.
896  */
897 char *find_colon(char *s)
898 {
899         char *p, *p2;
900
901         p = strchr(s,':');
902         if (!p) return NULL;
903
904         /* now check to see if there is a / in the string before the : - if there is then
905            discard the colon on the assumption that the : is part of a filename */
906         p2 = strchr(s,'/');
907         if (p2 && p2 < p) return NULL;
908
909         return p;
910 }
911
912