From dfa32483808be6b760243f8e7cbdf64f1bb3f13d Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Fri, 21 Mar 2003 18:58:50 +0000 Subject: [PATCH] - Simplified the whole-file option handling. - Fixed some whitespace issues. --- options.c | 265 ++++++++++++++++++++++++++---------------------------- 1 file changed, 128 insertions(+), 137 deletions(-) diff --git a/options.c b/options.c index af43be7c..066dd4b9 100644 --- a/options.c +++ b/options.c @@ -1,18 +1,18 @@ /* -*- c-file-style: "linux" -*- - * + * * Copyright (C) 1998-2001 by Andrew Tridgell * Copyright (C) 2000, 2001, 2002 by Martin Pool - * + * * 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, "\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, ©_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, ©_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) { -- 2.34.1