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