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