X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/524eaa8245e3d9314055759403ead1fee9e136cc..e208631a5b488a8bc6d0ad1d0a71a60faab2266e:/options.c diff --git a/options.c b/options.c index 1da74e56..82fb24c7 100644 --- a/options.c +++ b/options.c @@ -6,8 +6,9 @@ * Copyright (C) 2002-2007 Wayne Davison * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 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 @@ -15,8 +16,7 @@ * 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., - * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + * with this program; if not, visit the http://fsf.org website. */ #include "rsync.h" @@ -25,6 +25,7 @@ extern int module_id; extern int sanitize_paths; +extern int daemon_over_rsh; extern struct filter_list_struct filter_list; extern struct filter_list_struct server_filter_list; @@ -95,7 +96,6 @@ int recurse = 0; int allow_inc_recurse = 1; int xfer_dirs = -1; int am_daemon = 0; -int daemon_over_rsh = 0; int do_stats = 0; int do_progress = 0; int keep_partial = 0; @@ -109,7 +109,7 @@ size_t bwlimit_writemax = 0; int ignore_existing = 0; int ignore_non_existing = 0; int need_messages_from_generator = 0; -int max_delete = -1; +int max_delete = INT_MIN; OFF_T max_size = 0; OFF_T min_size = 0; int ignore_errors = 0; @@ -119,6 +119,7 @@ int checksum_seed = 0; int inplace = 0; int delay_updates = 0; long block_size = 0; /* "long" because popt can't set an int32. */ +char *skip_compress = NULL; /** Network address family. **/ #ifdef INET6 @@ -328,15 +329,15 @@ void usage(enum logcode F) rprintf(F," -A, --acls preserve ACLs (implies --perms)\n"); #endif #ifdef SUPPORT_XATTRS - rprintf(F," -X, --xattrs preserve extended attributes (implies --perms)\n"); + rprintf(F," -X, --xattrs preserve extended attributes\n"); #endif rprintf(F," -o, --owner preserve owner (super-user only)\n"); rprintf(F," -g, --group preserve group\n"); rprintf(F," --devices preserve device files (super-user only)\n"); rprintf(F," --specials preserve special files\n"); rprintf(F," -D same as --devices --specials\n"); - rprintf(F," -t, --times preserve times\n"); - rprintf(F," -O, --omit-dir-times omit directories when preserving times\n"); + rprintf(F," -t, --times preserve modification times\n"); + rprintf(F," -O, --omit-dir-times omit directories from --times\n"); rprintf(F," --super receiver attempts super-user activities\n"); #ifdef SUPPORT_XATTRS rprintf(F," --fake-super store/recover privileged attrs using xattrs\n"); @@ -379,6 +380,7 @@ void usage(enum logcode F) rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n"); rprintf(F," -z, --compress compress file data during the transfer\n"); rprintf(F," --compress-level=NUM explicitly set compression level\n"); + rprintf(F," --skip-compress=LIST skip compressing files with a suffix in LIST\n"); rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n"); rprintf(F," -f, --filter=RULE add a file-filtering RULE\n"); rprintf(F," -F same as --filter='dir-merge /.rsync-filter'\n"); @@ -549,6 +551,7 @@ static struct poptOption long_options[] = { {"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 }, {"compress", 'z', POPT_ARG_NONE, 0, 'z', 0, 0 }, {"no-compress", 0, POPT_ARG_VAL, &do_compression, 0, 0, 0 }, + {"skip-compress", 0, POPT_ARG_STRING, &skip_compress, 0, 0, 0 }, {"no-z", 0, POPT_ARG_VAL, &do_compression, 0, 0, 0 }, {"compress-level", 0, POPT_ARG_INT, &def_compress_level, 'z', 0, 0 }, {0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 }, @@ -1187,7 +1190,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) case 'X': #ifdef SUPPORT_XATTRS preserve_xattrs++; - preserve_perms = 1; break; #else snprintf(err_buf,sizeof(err_buf), @@ -1288,6 +1290,11 @@ int parse_arguments(int *argc, const char ***argv, int frommain) return 0; } + if (max_delete < 0 && max_delete != INT_MIN) { + /* Negative numbers are treated as "no deletions". */ + max_delete = 0; + } + if (compare_dest + copy_dest + link_dest > 1) { snprintf(err_buf, sizeof err_buf, "You may not mix --compare-dest, --copy-dest, and --link-dest.\n"); @@ -1609,7 +1616,7 @@ void server_options(char **args,int *argc) /* This should always remain first on the server's command-line. */ args[ac++] = "--server"; - if (daemon_over_rsh) { + if (daemon_over_rsh > 0) { args[ac++] = "--daemon"; *argc = ac; /* if we're passing --daemon, we're done */ @@ -1777,22 +1784,6 @@ void server_options(char **args,int *argc) args[ac++] = arg; } - if (max_delete >= 0 && am_sender) { - if (asprintf(&arg, "--max-delete=%d", max_delete) < 0) - goto oom; - args[ac++] = arg; - } - - if (min_size && am_sender) { - args[ac++] = "--min-size"; - args[ac++] = min_size_arg; - } - - if (max_size && am_sender) { - args[ac++] = "--max-size"; - args[ac++] = max_size_arg; - } - if (io_timeout) { if (asprintf(&arg, "--timeout=%d", io_timeout) < 0) goto oom; @@ -1819,6 +1810,20 @@ void server_options(char **args,int *argc) } if (am_sender) { + if (max_delete > 0) { + if (asprintf(&arg, "--max-delete=%d", max_delete) < 0) + goto oom; + args[ac++] = arg; + } else if (max_delete == 0) + args[ac++] = "--max_delete=-1"; + if (min_size) { + args[ac++] = "--min-size"; + args[ac++] = min_size_arg; + } + if (max_size) { + args[ac++] = "--max-size"; + args[ac++] = max_size_arg; + } if (delete_before) args[ac++] = "--delete-before"; else if (delete_during == 2) @@ -1839,6 +1844,12 @@ void server_options(char **args,int *argc) args[ac++] = "--super"; if (size_only) args[ac++] = "--size-only"; + } else { + if (skip_compress) { + if (asprintf(&arg, "--skip-compress=%s", skip_compress) < 0) + goto oom; + args[ac++] = arg; + } } if (modify_window_set) { @@ -1875,6 +1886,9 @@ void server_options(char **args,int *argc) if (numeric_ids) args[ac++] = "--numeric-ids"; + if (!allow_inc_recurse) + args[ac++] = "--no-ir"; + if (am_sender) { if (ignore_existing) args[ac++] = "--ignore-existing"; @@ -1966,7 +1980,7 @@ char *check_for_hostspec(char *s, char **host_ptr, int *port_ptr) if (p[1] == ':') *port_ptr = atoi(p+2); } else { - if ((p = strchr(s, ':')) != NULL) { + if ((p = strchr(s, ':')) != NULL && p < s + hostlen) { hostlen = p - s; *port_ptr = atoi(p+1); }