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