X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0f3203c312c3e254b611a1687f8ff9a6bdf82376..2d1ebe9c722c8dfd3d892d6c00efce0bad78aae7:/options.c diff --git a/options.c b/options.c index ca849d51..a58df938 100644 --- a/options.c +++ b/options.c @@ -1,5 +1,6 @@ -/* - Copyright (C) Andrew Tridgell 1998 +/* -*- c-file-style: "linux" -*- + + Copyright (C) 1998-2000 by Andrew Tridgell 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 @@ -62,9 +63,17 @@ int safe_symlinks=0; int copy_unsafe_links=0; int block_size=BLOCK_SIZE; int size_only=0; +int bwlimit=0; int delete_after=0; int only_existing=0; int max_delete=0; +int ignore_errors=0; +#ifdef _WIN32 +int modify_window=2; +#else +int modify_window=0; +#endif +int blocking_io=0; char *backup_suffix = BACKUP_SUFFIX; char *tmpdir = NULL; @@ -82,12 +91,40 @@ int quiet = 0; int always_checksum = 0; int list_only = 0; +static int modify_window_set; + + struct in_addr socket_address = {INADDR_ANY}; + +static void print_rsync_version(void) +{ + char const *got_socketpair = "no "; + +#ifdef HAVE_SOCKETPAIR + got_socketpair = ""; +#endif + + rprintf(FINFO, "rsync version %s protocol version %d\n", + VERSION, PROTOCOL_VERSION); + rprintf(FINFO, "Configuration: %d-bit files, %ssocketpairs\n\n", + sizeof(int64) * 8, + got_socketpair); + rprintf(FINFO, "Written by Andrew Tridgell and Paul Mackerras " + "\n\n"); +#ifdef NO_INT64 + rprintf(FINFO, "WARNING: no 64-bit integers on this platform!\n"); +#endif +} + + void usage(enum logcode F) { rprintf(F,"rsync version %s Copyright Andrew Tridgell and Paul Mackerras\n\n", VERSION); +#ifdef NO_INT64 + rprintf(F, "WARNING: no 64-bit integers on this platform!\n"); +#endif rprintf(F,"rsync is a file transfer program capable of efficient remote update\nvia a fast differencing algorithm.\n\n"); @@ -133,6 +170,7 @@ void usage(enum logcode F) rprintf(F," --delete delete files that don't exist on the sending side\n"); rprintf(F," --delete-excluded also delete excluded files on the receiving side\n"); rprintf(F," --delete-after delete after transferring, not before\n"); + rprintf(F," --ignore-errors delete even if there are IO errors\n"); rprintf(F," --max-delete=NUM don't delete more than NUM files\n"); rprintf(F," --partial keep partially transferred files\n"); rprintf(F," --force force deletion of directories even if not empty\n"); @@ -140,6 +178,7 @@ void usage(enum logcode 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," --size-only only use file size when determining if a file should be transferred\n"); + rprintf(F," --modify-window=NUM Timestamp window (seconds) for file match (default=%d)\n",modify_window); 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," -P equivalent to --partial --progress\n"); @@ -153,10 +192,12 @@ void usage(enum logcode F) rprintf(F," --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," --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," -h, --help show this help screen\n"); rprintf(F,"\n"); @@ -171,7 +212,9 @@ enum {OPT_VERSION, 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_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS, - OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR}; + OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR, + OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO, + OPT_MODIFY_WINDOW}; static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP"; @@ -193,6 +236,7 @@ static struct option long_options[] = { {"one-file-system",0, 0, 'x'}, {"ignore-times",0, 0, 'I'}, {"size-only", 0, 0, OPT_SIZE_ONLY}, + {"modify-window",1, 0, OPT_MODIFY_WINDOW}, {"help", 0, 0, 'h'}, {"dry-run", 0, 0, 'n'}, {"sparse", 0, 0, 'S'}, @@ -228,9 +272,12 @@ static struct option long_options[] = { {"progress", 0, 0, OPT_PROGRESS}, {"partial", 0, 0, OPT_PARTIAL}, {"delete-after",0, 0, OPT_DELETE_AFTER}, + {"ignore-errors",0, 0, OPT_IGNORE_ERRORS}, + {"blocking-io" ,0, 0, OPT_BLOCKING_IO}, {"config", 1, 0, OPT_CONFIG}, {"port", 1, 0, OPT_PORT}, {"log-format", 1, 0, OPT_LOG_FORMAT}, + {"bwlimit", 1, 0, OPT_BWLIMIT}, {"address", 1, 0, OPT_ADDRESS}, {"max-delete", 1, 0, OPT_MAX_DELETE}, {"backup-dir", 1, 0, OPT_BACKUP_DIR}, @@ -296,9 +343,7 @@ int parse_arguments(int argc, char *argv[], int frommain) switch (opt) { case OPT_VERSION: - rprintf(FINFO,"rsync version %s protocol version %d\n\n", - VERSION,PROTOCOL_VERSION); - rprintf(FINFO,"Written by Andrew Tridgell and Paul Mackerras\n"); + print_rsync_version(); exit_cleanup(0); case OPT_SUFFIX: @@ -321,6 +366,11 @@ int parse_arguments(int argc, char *argv[], int frommain) size_only = 1; break; + case OPT_MODIFY_WINDOW: + modify_window = atoi(optarg); + modify_window_set = 1; + break; + case 'x': one_file_system=1; break; @@ -528,6 +578,14 @@ int parse_arguments(int argc, char *argv[], int frommain) keep_partial = 1; break; + case OPT_IGNORE_ERRORS: + ignore_errors = 1; + break; + + case OPT_BLOCKING_IO: + blocking_io = 1; + break; + case 'P': do_progress = 1; keep_partial = 1; @@ -544,6 +602,10 @@ int parse_arguments(int argc, char *argv[], int frommain) case OPT_LOG_FORMAT: log_format = optarg; break; + + case OPT_BWLIMIT: + bwlimit = atoi(optarg); + break; case OPT_ADDRESS: { @@ -559,6 +621,17 @@ int parse_arguments(int argc, char *argv[], int frommain) break; default: + /* FIXME: This can be confusing when the error message + * is coming from a remote server which has an older + * rsync version than the local version. The user + * sees the option documented in the local --help, but + * then the program seems to refuse to execute it. So + * perhaps the message should give the hostname or + * something. + * + * In rsync 3.x, it might be nice if options which + * only affect one end didn't have to bother the + * remote end. */ slprintf(err_buf,sizeof(err_buf),"unrecognised option\n"); return 0; } @@ -576,6 +649,9 @@ void server_options(char **args,int *argc) static char bsize[30]; static char iotime[30]; static char mdelete[30]; + static char mwindow[30]; + static char bw[50]; + int i, x; args[ac++] = "--server"; @@ -587,6 +663,7 @@ void server_options(char **args,int *argc) argstr[0] = '-'; for (i=0;i