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