- Simplified the whole-file option handling.

- Fixed some whitespace issues.
This commit is contained in:
Wayne Davison
2003-03-21 18:58:50 +00:00
parent 2cda256088
commit dfa3248380

265
options.c
View File

@@ -1,18 +1,18 @@
/* -*- c-file-style: "linux" -*-
*
*
* Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
* Copyright (C) 2000, 2001, 2002 by Martin Pool <mbp@samba.org>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -24,17 +24,16 @@
int make_backups = 0;
/**
* If True, send the whole file as literal data rather than trying to
* If 1, send the whole file as literal data rather than trying to
* create an incremental diff.
*
* If both are 0, then look at whether we're local or remote and go by
* that.
* If -1, then look at whether we're local or remote and go by that.
*
* @sa disable_deltas_p()
**/
int whole_file = 0;
int no_whole_file = 0;
int whole_file = -1;
int archive_mode = 0;
int copy_links = 0;
int preserve_links = 0;
int preserve_hard_links = 0;
@@ -130,43 +129,43 @@ char *bind_address;
static void print_rsync_version(enum logcode f)
{
char const *got_socketpair = "no ";
char const *hardlinks = "no ";
char const *links = "no ";
char const *got_socketpair = "no ";
char const *hardlinks = "no ";
char const *links = "no ";
char const *ipv6 = "no ";
STRUCT_STAT *dumstat;
#ifdef HAVE_SOCKETPAIR
got_socketpair = "";
got_socketpair = "";
#endif
#if SUPPORT_HARD_LINKS
hardlinks = "";
hardlinks = "";
#endif
#if SUPPORT_LINKS
links = "";
links = "";
#endif
#if INET6
ipv6 = "";
#endif
#endif
rprintf(f, "%s version %s protocol version %d\n",
RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
rprintf(f,
"Copyright (C) 1996-2002 by Andrew Tridgell and others\n");
rprintf(f, "%s version %s protocol version %d\n",
RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
rprintf(f,
"Copyright (C) 1996-2002 by Andrew Tridgell and others\n");
rprintf(f, "<http://rsync.samba.org/>\n");
rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
"%shard links, %ssymlinks, batchfiles, \n",
(int) (sizeof(OFF_T) * 8),
got_socketpair, hardlinks, links);
rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
"%shard links, %ssymlinks, batchfiles, \n",
(int) (sizeof(OFF_T) * 8),
got_socketpair, hardlinks, links);
/* Note that this field may not have type ino_t. It depends
* on the complicated interaction between largefile feature
* macros. */
rprintf(f, " %sIPv6, %d-bit system inums, %d-bit internal inums\n",
ipv6,
ipv6,
(int) (sizeof(dumstat->st_ino) * 8),
(int) (sizeof(INO64_T) * 8));
#ifdef MAINTAINER_MODE
@@ -175,7 +174,7 @@ static void print_rsync_version(enum logcode f)
#endif
#ifdef NO_INT64
rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
#endif
rprintf(f,
@@ -212,7 +211,7 @@ void usage(enum logcode F)
rprintf(F," -R, --relative use relative path names\n");
rprintf(F," -b, --backup make backups (default %s suffix)\n",BACKUP_SUFFIX);
rprintf(F," --backup-dir make backups into this directory\n");
rprintf(F," --suffix=SUFFIX override backup suffix\n");
rprintf(F," --suffix=SUFFIX override backup suffix\n");
rprintf(F," -u, --update update only (don't overwrite newer files)\n");
rprintf(F," -l, --links copy symlinks as symlinks\n");
rprintf(F," -L, --copy-links copy the referent of symlinks\n");
@@ -223,13 +222,13 @@ void usage(enum logcode F)
rprintf(F," -o, --owner preserve owner (root only)\n");
rprintf(F," -g, --group preserve group\n");
rprintf(F," -D, --devices preserve devices (root only)\n");
rprintf(F," -t, --times preserve times\n");
rprintf(F," -t, --times preserve times\n");
rprintf(F," -S, --sparse handle sparse files efficiently\n");
rprintf(F," -n, --dry-run show what would have been transferred\n");
rprintf(F," -W, --whole-file copy whole files, no incremental checks\n");
rprintf(F," --no-whole-file turn off --whole-file\n");
rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n");
rprintf(F," -B, --block-size=SIZE checksum blocking size (default %d)\n",BLOCK_SIZE);
rprintf(F," -B, --block-size=SIZE checksum blocking size (default %d)\n",BLOCK_SIZE);
rprintf(F," -e, --rsh=COMMAND specify the remote shell\n");
rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
@@ -255,17 +254,17 @@ void usage(enum logcode F)
rprintf(F," --exclude-from=FILE exclude patterns listed in FILE\n");
rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
rprintf(F," --include-from=FILE don't exclude patterns listed in FILE\n");
rprintf(F," --version print version number\n");
rprintf(F," --daemon run as a rsync daemon\n");
rprintf(F," --no-detach do not detach from the parent\n");
rprintf(F," --address=ADDRESS bind to the specified address\n");
rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
rprintf(F," --version print version number\n");
rprintf(F," --daemon run as a rsync daemon\n");
rprintf(F," --no-detach do not detach from the parent\n");
rprintf(F," --address=ADDRESS bind to the specified address\n");
rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
rprintf(F," --port=PORT specify alternate rsyncd port number\n");
rprintf(F," --blocking-io use blocking IO for the remote shell\n");
rprintf(F," --no-blocking-io turn off --blocking-io\n");
rprintf(F," --stats give some file transfer stats\n");
rprintf(F," --progress show progress during transfer\n");
rprintf(F," --log-format=FORMAT log file transfers using specified format\n");
rprintf(F," --blocking-io use blocking IO for the remote shell\n");
rprintf(F," --no-blocking-io turn off --blocking-io\n");
rprintf(F," --stats give some file transfer stats\n");
rprintf(F," --progress show progress during transfer\n");
rprintf(F," --log-format=FORMAT log file transfers using specified format\n");
rprintf(F," --password-file=FILE get password from FILE\n");
rprintf(F," --bwlimit=KBPS limit I/O bandwidth, KBytes per second\n");
rprintf(F," --write-batch=PREFIX write batch fileset starting with PREFIX\n");
@@ -288,15 +287,14 @@ enum {OPT_VERSION = 1000, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LINK_DEST,
OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO,
OPT_NO_BLOCKING_IO, OPT_WHOLE_FILE, OPT_NO_WHOLE_FILE,
OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR,
OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_NO_BLOCKING_IO, OPT_NO_WHOLE_FILE,
OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_IGNORE_EXISTING};
static struct poptOption long_options[] = {
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
{"suffix", 0, POPT_ARG_STRING, &backup_suffix, OPT_SUFFIX, 0, 0 },
{"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
{"suffix", 0, POPT_ARG_STRING, &backup_suffix, OPT_SUFFIX, 0, 0 },
{"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
{"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
{"ignore-times", 'I', POPT_ARG_NONE, &ignore_times , 0, 0, 0 },
@@ -323,7 +321,7 @@ static struct poptOption long_options[] = {
{"update", 'u', POPT_ARG_NONE, &update_only , 0, 0, 0 },
{"links", 'l', POPT_ARG_NONE, &preserve_links , 0, 0, 0 },
{"copy-links", 'L', POPT_ARG_NONE, &copy_links , 0, 0, 0 },
{"whole-file", 'W', POPT_ARG_NONE, 0, OPT_WHOLE_FILE, 0, 0 },
{"whole-file", 'W', POPT_ARG_NONE, &whole_file, 0, 0, 0 },
{"no-whole-file", 0, POPT_ARG_NONE, 0, OPT_NO_WHOLE_FILE, 0, 0 },
{"copy-unsafe-links", 0, POPT_ARG_NONE, &copy_unsafe_links , 0, 0, 0 },
{"perms", 'p', POPT_ARG_NONE, &preserve_perms , 0, 0, 0 },
@@ -334,9 +332,9 @@ static struct poptOption long_options[] = {
{"checksum", 'c', POPT_ARG_NONE, &always_checksum , 0, 0, 0 },
{"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
{"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
{"archive", 'a', POPT_ARG_NONE, 0, 'a', 0, 0 },
{"archive", 'a', POPT_ARG_NONE, &archive_mode, 0, 0, 0 },
{"server", 0, POPT_ARG_NONE, &am_server , 0, 0, 0 },
{"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
{"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER, 0, 0 },
{"recursive", 'r', POPT_ARG_NONE, &recurse , 0, 0, 0 },
{"relative", 'R', POPT_ARG_NONE, &relative_paths , 0, 0, 0 },
{"rsh", 'e', POPT_ARG_STRING, &shell_cmd , 0, 0, 0 },
@@ -345,7 +343,7 @@ static struct poptOption long_options[] = {
{"timeout", 0, POPT_ARG_INT, &io_timeout , 0, 0, 0 },
{"temp-dir", 'T', POPT_ARG_STRING, &tmpdir , 0, 0, 0 },
{"compare-dest", 0, POPT_ARG_STRING, &compare_dest , 0, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
/* TODO: Should this take an optional int giving the compression level? */
{"compress", 'z', POPT_ARG_NONE, &do_compression , 0, 0, 0 },
{"daemon", 0, POPT_ARG_NONE, &am_daemon , 0, 0, 0 },
@@ -355,8 +353,8 @@ static struct poptOption long_options[] = {
{"partial", 0, POPT_ARG_NONE, &keep_partial , 0, 0, 0 },
{"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors , 0, 0, 0 },
{"blocking-io", 0, POPT_ARG_NONE, &blocking_io , 0, 0, 0 },
{"no-blocking-io", 0, POPT_ARG_NONE, 0, OPT_NO_BLOCKING_IO, 0, 0 },
{0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
{"no-blocking-io", 0, POPT_ARG_NONE, 0, OPT_NO_BLOCKING_IO, 0, 0 },
{0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
{"config", 0, POPT_ARG_STRING, &config_file , 0, 0, 0 },
{"port", 0, POPT_ARG_INT, &rsync_port , 0, 0, 0 },
{"log-format", 0, POPT_ARG_STRING, &log_format , 0, 0, 0 },
@@ -364,8 +362,8 @@ static struct poptOption long_options[] = {
{"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 },
{"backup-dir", 0, POPT_ARG_STRING, &backup_dir , 0, 0, 0 },
{"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links , 0, 0, 0 },
{"read-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_READ_BATCH, 0, 0 },
{"write-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_WRITE_BATCH, 0, 0 },
{"read-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_READ_BATCH, 0, 0 },
{"write-batch", 0, POPT_ARG_STRING, &batch_prefix, OPT_WRITE_BATCH, 0, 0 },
#ifdef INET6
{0, '4', POPT_ARG_VAL, &default_af_hint, AF_INET , 0, 0 },
{0, '6', POPT_ARG_VAL, &default_af_hint, AF_INET6 , 0, 0 },
@@ -408,7 +406,7 @@ static int check_refuse_options(char *ref, int opt)
for (i=0; long_options[i].longName; i++) {
if (long_options[i].val == opt) break;
}
if (!long_options[i].longName) return 0;
name = long_options[i].longName;
@@ -429,12 +427,12 @@ static int check_refuse_options(char *ref, int opt)
static int count_args(char const **argv)
{
int i = 0;
int i = 0;
while (argv[i] != NULL)
i++;
return i;
while (argv[i] != NULL)
i++;
return i;
}
@@ -450,38 +448,38 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
{
int opt;
char *ref = lp_refuse_options(module_id);
poptContext pc;
poptContext pc;
/* TODO: Call poptReadDefaultConfig; handle errors. */
/* TODO: Call poptReadDefaultConfig; handle errors. */
/* The context leaks in case of an error, but if there's a
* problem we always exit anyhow. */
pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
/* The context leaks in case of an error, but if there's a
* problem we always exit anyhow. */
pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
while ((opt = poptGetNextOpt(pc)) != -1) {
if (ref) {
if (check_refuse_options(ref, opt)) return 0;
}
/* most options are handled automatically by popt;
* only special cases are returned and listed here. */
/* most options are handled automatically by popt;
* only special cases are returned and listed here. */
switch (opt) {
case OPT_VERSION:
print_rsync_version(FINFO);
print_rsync_version(FINFO);
exit_cleanup(0);
case OPT_SUFFIX:
/* The value has already been set by popt, but
* we need to remember that a suffix was specified
* in case a backup-directory is used. */
suffix_specified = 1;
/* The value has already been set by popt, but
* we need to remember that a suffix was specified
* in case a backup-directory is used. */
suffix_specified = 1;
break;
case OPT_MODIFY_WINDOW:
/* The value has already been set by popt, but
* we need to remember that we're using a
* non-default setting. */
/* The value has already been set by popt, but
* we need to remember that we're using a
* non-default setting. */
modify_window_set = 1;
break;
@@ -511,13 +509,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
add_exclude_file(poptGetOptArg(pc), 1, 1);
break;
case OPT_WHOLE_FILE:
whole_file = 1;
no_whole_file = 0;
break;
case OPT_NO_WHOLE_FILE:
no_whole_file = 1;
whole_file = 0;
break;
@@ -533,14 +525,14 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
#if SUPPORT_HARD_LINKS
preserve_hard_links=1;
#else
/* FIXME: Don't say "server" if this is
* happening on the client. */
/* FIXME: Why do we have the duplicated
* rprintf? Everybody who gets this message
* ought to send it to the client and also to
* the logs. */
/* FIXME: Don't say "server" if this is
* happening on the client. */
/* FIXME: Why do we have the duplicated
* rprintf? Everybody who gets this message
* ought to send it to the client and also to
* the logs. */
snprintf(err_buf,sizeof(err_buf),
"hard links are not supported on this %s\n",
"hard links are not supported on this %s\n",
am_server ? "server" : "client");
rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
return 0;
@@ -555,18 +547,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
if (frommain) quiet++;
break;
case 'a':
recurse=1;
#if SUPPORT_LINKS
preserve_links=1;
#endif
preserve_perms=1;
preserve_times=1;
preserve_gid=1;
preserve_uid=1;
preserve_devices=1;
break;
case OPT_SENDER:
if (!am_server) {
usage(FERROR);
@@ -596,7 +576,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
break;
#else
snprintf(err_buf,sizeof(err_buf),
"hard links are not supported on this %s\n",
"hard links are not supported on this %s\n",
am_server ? "server" : "client");
rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
return 0;
@@ -604,38 +584,50 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
default:
/* FIXME: If --daemon is specified, then errors for later
* parameters seem to disappear. */
snprintf(err_buf, sizeof(err_buf),
"%s%s: %s\n",
am_server ? "on remote machine: " : "",
poptBadOption(pc, POPT_BADOPTION_NOALIAS),
poptStrerror(opt));
return 0;
/* FIXME: If --daemon is specified, then errors for later
* parameters seem to disappear. */
snprintf(err_buf, sizeof(err_buf),
"%s%s: %s\n",
am_server ? "on remote machine: " : "",
poptBadOption(pc, POPT_BADOPTION_NOALIAS),
poptStrerror(opt));
return 0;
}
}
if (write_batch && read_batch) {
snprintf(err_buf,sizeof(err_buf),
"write-batch and read-batch can not be used together\n");
rprintf(FERROR,"ERROR: write-batch and read-batch"
" can not be used together\n");
return 0;
snprintf(err_buf,sizeof(err_buf),
"write-batch and read-batch can not be used together\n");
rprintf(FERROR,"ERROR: write-batch and read-batch"
" can not be used together\n");
return 0;
}
if (do_compression && (write_batch || read_batch)) {
snprintf(err_buf,sizeof(err_buf),
"compress can not be used with write-batch or read-batch\n");
rprintf(FERROR,"ERROR: compress can not be used with"
" write-batch or read-batch\n");
return 0;
snprintf(err_buf,sizeof(err_buf),
"compress can not be used with write-batch or read-batch\n");
rprintf(FERROR,"ERROR: compress can not be used with"
" write-batch or read-batch\n");
return 0;
}
*argv = poptGetArgs(pc);
if (*argv)
*argc = count_args(*argv);
else
*argc = 0;
if (archive_mode) {
recurse = 1;
#if SUPPORT_LINKS
preserve_links = 1;
#endif
preserve_perms = 1;
preserve_times = 1;
preserve_gid = 1;
preserve_uid = 1;
preserve_devices = 1;
}
*argv = poptGetArgs(pc);
if (*argv)
*argc = count_args(*argv);
else
*argc = 0;
return 1;
}
@@ -695,13 +687,12 @@ void server_options(char **args,int *argc)
if (copy_links)
argstr[x++] = 'L';
assert(whole_file == 0 || whole_file == 1);
if (whole_file)
if (whole_file > 0)
argstr[x++] = 'W';
/* We don't need to send --no-whole-file, because it's the
* default for remote transfers, and in any case old versions
* of rsync will not understand it. */
if (preserve_hard_links)
argstr[x++] = 'H';
if (preserve_uid)
@@ -731,11 +722,11 @@ void server_options(char **args,int *argc)
if (do_compression)
argstr[x++] = 'z';
/* this is a complete hack - blame Rusty
/* this is a complete hack - blame Rusty
this is a hack to make the list_only (remote file list)
more useful */
if (list_only && !recurse)
if (list_only && !recurse)
argstr[x++] = 'r';
argstr[x] = 0;
@@ -745,20 +736,20 @@ void server_options(char **args,int *argc)
if (block_size != BLOCK_SIZE) {
snprintf(bsize,sizeof(bsize),"-B%d",block_size);
args[ac++] = bsize;
}
}
if (max_delete && am_sender) {
snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
args[ac++] = mdelete;
}
}
if (batch_prefix != NULL) {
char *fmt = "";
if (write_batch)
fmt = "--write-batch=%s";
fmt = "--write-batch=%s";
else
if (read_batch)
fmt = "--read-batch=%s";
fmt = "--read-batch=%s";
snprintf(fext,sizeof(fext),fmt,batch_prefix);
args[ac++] = fext;
}
@@ -766,7 +757,7 @@ void server_options(char **args,int *argc)
if (io_timeout) {
snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);
args[ac++] = iotime;
}
}
if (bwlimit) {
snprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit);
@@ -788,7 +779,7 @@ void server_options(char **args,int *argc)
args[ac++] = "--size-only";
if (modify_window_set) {
snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
modify_window);
args[ac++] = mwindow;
}
@@ -817,7 +808,7 @@ void server_options(char **args,int *argc)
if (only_existing && am_sender)
args[ac++] = "--existing";
if (opt_ignore_existing && am_sender)
if (opt_ignore_existing && am_sender)
args[ac++] = "--ignore-existing";
if (tmpdir) {