X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d9fcc198cfad667e659f0994febc2a9f0d33753c..9ec16c83be3164bdcfe8412933d5b7fc86cabcb1:/options.c diff --git a/options.c b/options.c index 7bfe6921..6050524f 100644 --- a/options.c +++ b/options.c @@ -62,6 +62,12 @@ 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; +int blocking_io=0; char *backup_suffix = BACKUP_SUFFIX; char *tmpdir = NULL; @@ -71,6 +77,7 @@ char *shell_cmd = NULL; char *log_format = NULL; char *password_file = NULL; char *rsync_path = RSYNC_NAME; +char *backup_dir = NULL; int rsync_port = RSYNC_PORT; int verbose = 0; @@ -78,7 +85,9 @@ int quiet = 0; int always_checksum = 0; int list_only = 0; -void usage(int F) +struct in_addr socket_address = {INADDR_ANY}; + +void usage(enum logcode F) { rprintf(F,"rsync version %s Copyright Andrew Tridgell and Paul Mackerras\n\n", VERSION); @@ -102,6 +111,7 @@ void usage(int F) rprintf(F," -r, --recursive recurse into directories\n"); 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," -u, --update update only (don't overwrite newer files)\n"); rprintf(F," -l, --links preserve soft links\n"); @@ -122,8 +132,12 @@ void usage(int F) rprintf(F," -e, --rsh=COMMAND specify rsh replacement\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"); + rprintf(F," --existing only update files that already exist\n"); 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"); rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n"); @@ -140,12 +154,15 @@ void usage(int F) 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," --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"); @@ -159,7 +176,9 @@ enum {OPT_VERSION, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE, 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_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, - OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY}; + 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}; static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP"; @@ -167,6 +186,7 @@ static struct option long_options[] = { {"version", 0, 0, OPT_VERSION}, {"server", 0, 0, OPT_SERVER}, {"sender", 0, 0, OPT_SENDER}, + {"existing", 0, 0, OPT_EXISTING}, {"delete", 0, 0, OPT_DELETE}, {"delete-excluded", 0, 0, OPT_DELETE_EXCLUDED}, {"force", 0, 0, OPT_FORCE}, @@ -214,9 +234,16 @@ static struct option long_options[] = { {"stats", 0, 0, OPT_STATS}, {"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}, {0,0,0,0}}; @@ -312,6 +339,14 @@ int parse_arguments(int argc, char *argv[], int frommain) delete_mode = 1; break; + case OPT_EXISTING: + only_existing = 1; + break; + + case OPT_DELETE_AFTER: + delete_after = 1; + break; + case OPT_DELETE_EXCLUDED: delete_excluded = 1; delete_mode = 1; @@ -435,10 +470,8 @@ int parse_arguments(int argc, char *argv[], int frommain) preserve_perms=1; preserve_times=1; preserve_gid=1; - if (am_root) { - preserve_devices=1; - preserve_uid=1; - } + preserve_uid=1; + preserve_devices=1; break; case OPT_SERVER: @@ -469,6 +502,10 @@ int parse_arguments(int argc, char *argv[], int frommain) block_size = atoi(optarg); break; + case OPT_MAX_DELETE: + max_delete = atoi(optarg); + break; + case OPT_TIMEOUT: io_timeout = atoi(optarg); break; @@ -501,6 +538,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; @@ -517,6 +562,23 @@ 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: + { + struct in_addr *ia; + if ((ia = ip_address(optarg))) { + socket_address = *ia; + } + } + break; + + case OPT_BACKUP_DIR: + backup_dir = optarg; + break; default: slprintf(err_buf,sizeof(err_buf),"unrecognised option\n"); @@ -527,12 +589,17 @@ int parse_arguments(int argc, char *argv[], int frommain) } +/* need to pass all the valid options from the client to the server */ + void server_options(char **args,int *argc) { int ac = *argc; static char argstr[50]; static char bsize[30]; static char iotime[30]; + static char mdelete[30]; + static char bw[50]; + int i, x; args[ac++] = "--server"; @@ -590,15 +657,25 @@ void server_options(char **args,int *argc) if (x != 1) args[ac++] = argstr; if (block_size != BLOCK_SIZE) { - sprintf(bsize,"-B%d",block_size); + slprintf(bsize,sizeof(bsize),"-B%d",block_size); args[ac++] = bsize; } + if (max_delete && am_sender) { + slprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete); + args[ac++] = mdelete; + } + if (io_timeout) { - sprintf(iotime,"--timeout=%d",io_timeout); + slprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout); args[ac++] = iotime; } + if (bwlimit) { + slprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit); + args[ac++] = bw; + } + if (strcmp(backup_suffix, BACKUP_SUFFIX)) { args[ac++] = "--suffix"; args[ac++] = backup_suffix; @@ -619,6 +696,12 @@ void server_options(char **args,int *argc) if (force_delete) args[ac++] = "--force"; + if (delete_after) + args[ac++] = "--delete-after"; + + if (ignore_errors) + args[ac++] = "--ignore-errors"; + if (copy_unsafe_links) args[ac++] = "--copy-unsafe-links"; @@ -628,11 +711,22 @@ void server_options(char **args,int *argc) if (numeric_ids) args[ac++] = "--numeric-ids"; + if (only_existing && am_sender) + args[ac++] = "--existing"; + if (tmpdir) { args[ac++] = "--temp-dir"; args[ac++] = tmpdir; } + if (backup_dir && am_sender) { + /* only the receiver needs this option, if we are the sender + * then we need to send it to the receiver. + */ + args[ac++] = "--backup-dir"; + args[ac++] = backup_dir; + } + 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