X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/858fb9ebad77ceefc628344de26353d0a1936a9d..d1be231290b3867648ee417fad341fdf1caaa94b:/options.c diff --git a/options.c b/options.c index 23b3c8cd..ca1b0187 100644 --- a/options.c +++ b/options.c @@ -64,15 +64,17 @@ int block_size=BLOCK_SIZE; char *backup_suffix = BACKUP_SUFFIX; char *tmpdir = NULL; +char *compare_dest = NULL; char *config_file = RSYNCD_CONF; char *shell_cmd = NULL; +char *log_format = NULL; char *rsync_path = RSYNC_NAME; int rsync_port = RSYNC_PORT; int verbose = 0; int always_checksum = 0; - +int list_only = 0; void usage(int F) { @@ -84,8 +86,9 @@ void usage(int F) rprintf(F,"Usage: rsync [OPTION]... SRC [USER@]HOST:DEST\n"); rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC DEST\n"); rprintf(F," or rsync [OPTION]... SRC DEST\n"); - rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC DEST\n"); + rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n"); rprintf(F," or rsync [OPTION]... SRC [USER@]HOST::DEST\n"); + rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n"); rprintf(F,"\nOptions\n"); rprintf(F," -v, --verbose increase verbosity\n"); rprintf(F," -c, --checksum always checksum\n"); @@ -118,10 +121,11 @@ void usage(int F) rprintf(F," --timeout=TIME set IO timeout in seconds\n"); rprintf(F," -I, --ignore-times don't exclude files that match length and time\n"); rprintf(F," -T --temp-dir=DIR create temporary files in directory DIR\n"); + rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n"); rprintf(F," -z, --compress compress file data\n"); - rprintf(F," --exclude=PATTERN exclude file FILE\n"); + rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n"); rprintf(F," --exclude-from=FILE exclude patterns listed in FILE\n"); - rprintf(F," --include=PATTERN don't exclude file 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," --suffix=SUFFIX override backup suffix\n"); rprintf(F," --version print version number\n"); @@ -130,6 +134,7 @@ void usage(int F) rprintf(F," --port=PORT specify alternate rsyncd port number\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," -h, --help show this help screen\n"); rprintf(F,"\n"); @@ -137,14 +142,14 @@ void usage(int F) rprintf(F,"the block size defaults to %d\n",BLOCK_SIZE); rprintf(F,"\nPlease see the rsync(1) and rsyncd.conf(5) man pages for full documentation\n"); - rprintf(F,"See http://samba.anu.edu.au/rsync/ for updates and bug reports\n"); + rprintf(F,"See http://rsync.samba.org/ for updates and bug reports\n"); } enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE, OPT_EXCLUDE_FROM,OPT_DELETE,OPT_NUMERIC_IDS,OPT_RSYNC_PATH, OPT_FORCE,OPT_TIMEOUT,OPT_DAEMON,OPT_CONFIG,OPT_PORT, OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS, - OPT_SAFE_LINKS}; + OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LOG_FORMAT}; static char *short_options = "oblLWHpguDCtcahvrRIxnSe:B:T:z"; @@ -188,6 +193,7 @@ static struct option long_options[] = { {"block-size", 1, 0, 'B'}, {"timeout", 1, 0, OPT_TIMEOUT}, {"temp-dir", 1, 0, 'T'}, + {"compare-dest", 1, 0, OPT_COMPARE_DEST}, {"compress", 0, 0, 'z'}, {"daemon", 0, 0, OPT_DAEMON}, {"stats", 0, 0, OPT_STATS}, @@ -195,17 +201,67 @@ static struct option long_options[] = { {"partial", 0, 0, OPT_PARTIAL}, {"config", 1, 0, OPT_CONFIG}, {"port", 1, 0, OPT_PORT}, + {"log-format", 1, 0, OPT_LOG_FORMAT}, {0,0,0,0}}; +static char err_buf[100]; + +void option_error(void) +{ + if (err_buf[0]) { + rprintf(FLOG,"%s", err_buf); + rprintf(FERROR,"%s", err_buf); + } else { + rprintf(FLOG,"Error parsing options - unsupported option?\n"); + rprintf(FERROR,"Error parsing options - unsupported option?\n"); + } + exit_cleanup(RERR_UNSUPPORTED); +} + +/* check to see if we should refuse this option */ +static int check_refuse_options(char *ref, int opt) +{ + int i, len; + char *p; + const char *name; + + for (i=0; long_options[i].name; i++) { + if (long_options[i].val == opt) break; + } + + if (!long_options[i].name) return 0; + + name = long_options[i].name; + len = strlen(name); + + while ((p = strstr(ref,name))) { + if ((p==ref || p[-1]==' ') && + (p[len] == ' ' || p[len] == 0)) { + slprintf(err_buf,sizeof(err_buf), + "The '%s' option is not supported by this server\n", name); + return 1; + } + ref += len; + } + return 0; +} + + int parse_arguments(int argc, char *argv[]) { int opt; int option_index; + char *ref = lp_refuse_options(module_id); while ((opt = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1) { + + if (ref) { + if (check_refuse_options(ref, opt)) return 0; + } + switch (opt) { case OPT_VERSION: rprintf(FINFO,"rsync version %s protocol version %d\n\n", @@ -301,6 +357,7 @@ int parse_arguments(int argc, char *argv[]) #if SUPPORT_HARD_LINKS preserve_hard_links=1; #else + slprintf(err_buf,sizeof(err_buf),"hard links are not supported on this server\n"); rprintf(FERROR,"ERROR: hard links not supported on this platform\n"); return 0; #endif @@ -355,7 +412,7 @@ int parse_arguments(int argc, char *argv[]) case OPT_SENDER: if (!am_server) { usage(FERROR); - exit_cleanup(1); + exit_cleanup(RERR_SYNTAX); } am_sender = 1; break; @@ -384,6 +441,10 @@ int parse_arguments(int argc, char *argv[]) tmpdir = optarg; break; + case OPT_COMPARE_DEST: + compare_dest = optarg; + break; + case 'z': do_compression = 1; break; @@ -412,7 +473,12 @@ int parse_arguments(int argc, char *argv[]) rsync_port = atoi(optarg); break; + case OPT_LOG_FORMAT: + log_format = optarg; + break; + default: + slprintf(err_buf,sizeof(err_buf),"unrecognised option\n"); return 0; } } @@ -516,6 +582,16 @@ void server_options(char **args,int *argc) args[ac++] = tmpdir; } + if (compare_dest && am_sender) { + /* the server only needs this option if it is not the sender, + * and it may be an older version that doesn't know this + * option, so don't send it if client is the sender. + */ + args[ac++] = "--compare-dest"; + args[ac++] = compare_dest; + } + + *argc = ac; }