X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/3696674bc62b0c1250027dbeedafdd7ebafdcf8b..1a2e41af941573e69c02370329afe0192b61f213:/options.c diff --git a/options.c b/options.c index 5af0a319..ee981e37 100644 --- a/options.c +++ b/options.c @@ -29,8 +29,8 @@ extern int local_server; extern int sanitize_paths; extern int daemon_over_rsh; extern unsigned int module_dirlen; -extern struct filter_list_struct filter_list; -extern struct filter_list_struct daemon_filter_list; +extern filter_rule_list filter_list; +extern filter_rule_list daemon_filter_list; int make_backups = 0; @@ -204,18 +204,18 @@ struct chmod_mode_struct *chmod_modes = NULL; static const char *debug_verbosity[] = { /*0*/ NULL, /*1*/ NULL, - /*2*/ "bind,cmd,connect,del,deltasum,dup,filter,flist,iconv", - /*3*/ "acl,backup,deltasum2,del2,exit,filter2,flist2,fuzzy,genr,own,recv,send,time", - /*4*/ "cmd2,deltasum3,del3,exit2,flist3,iconv2,own2,proto,time2", - /*5*/ "chdir,deltasum4,flist4,fuzzy2,hash,hlink", + /*2*/ "BIND,CMD,CONNECT,DEL,DELTASUM,DUP,FILTER,FLIST,ICONV", + /*3*/ "ACL,BACKUP,DELTASUM2,DEL2,EXIT,FILTER2,FLIST2,FUZZY,GENR,OWN,RECV,SEND,TIME", + /*4*/ "CMD2,DELTASUM3,DEL3,EXIT2,FLIST3,ICONV2,OWN2,PROTO,TIME2", + /*5*/ "CHDIR,DELTASUM4,FLIST4,FUZZY2,HASH,HLINK", }; #define MAX_VERBOSITY ((int)(sizeof debug_verbosity / sizeof debug_verbosity[0]) - 1) static const char *info_verbosity[1+MAX_VERBOSITY] = { /*0*/ NULL, - /*1*/ "copy,del,flist,misc,name,stats,symsafe", - /*2*/ "backup,mount,name2,remove,skip", + /*1*/ "COPY,DEL,FLIST,MISC,NAME,STATS,SYMSAFE", + /*2*/ "BACKUP,MOUNT,NAME2,REMOVE,SKIP", }; #define MAX_OUT_LEVEL 4 /* The largest N allowed for any flagN word. */ @@ -596,7 +596,7 @@ static void print_rsync_version(enum logcode f) #ifdef ICONV_OPTION iconv = ""; #endif -#if defined HAVE_LUTIMES && defined HAVE_UTIMES +#ifdef CAN_SET_SYMLINK_TIMES symtimes = ""; #endif @@ -1399,17 +1399,18 @@ int parse_arguments(int *argc_p, const char ***argv_p) break; case OPT_FILTER: - parse_rule(&filter_list, poptGetOptArg(pc), 0, 0); + parse_filter_str(&filter_list, poptGetOptArg(pc), + rule_template(0), 0); break; case OPT_EXCLUDE: - parse_rule(&filter_list, poptGetOptArg(pc), - 0, XFLG_OLD_PREFIXES); + parse_filter_str(&filter_list, poptGetOptArg(pc), + rule_template(0), XFLG_OLD_PREFIXES); break; case OPT_INCLUDE: - parse_rule(&filter_list, poptGetOptArg(pc), - MATCHFLG_INCLUDE, XFLG_OLD_PREFIXES); + parse_filter_str(&filter_list, poptGetOptArg(pc), + rule_template(FILTRULE_INCLUDE), XFLG_OLD_PREFIXES); break; case OPT_EXCLUDE_FROM: @@ -1432,7 +1433,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) goto options_rejected; } parse_filter_file(&filter_list, arg, - opt == OPT_INCLUDE_FROM ? MATCHFLG_INCLUDE : 0, + rule_template(opt == OPT_INCLUDE_FROM ? FILTRULE_INCLUDE : 0), XFLG_FATAL_ERRORS | XFLG_OLD_PREFIXES); break; @@ -1489,10 +1490,10 @@ int parse_arguments(int *argc_p, const char ***argv_p) case 'F': switch (++F_option_cnt) { case 1: - parse_rule(&filter_list,": /.rsync-filter",0,0); + parse_filter_str(&filter_list,": /.rsync-filter",rule_template(0),0); break; case 2: - parse_rule(&filter_list,"- .rsync-filter",0,0); + parse_filter_str(&filter_list,"- .rsync-filter",rule_template(0),0); break; } break; @@ -1854,6 +1855,12 @@ int parse_arguments(int *argc_p, const char ***argv_p) "--read-batch cannot be used with --files-from\n"); return 0; } + if (read_batch && remove_source_files) { + snprintf(err_buf, sizeof err_buf, + "--read-batch cannot be used with --remove-%s-files\n", + remove_source_files == 1 ? "source" : "sent"); + return 0; + } if (batch_name && strlen(batch_name) > MAX_BATCH_NAME_LEN) { snprintf(err_buf, sizeof err_buf, "the batch-file name must be %d characters or less.\n", @@ -1889,7 +1896,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) list_only |= 1; if (xfer_dirs >= 4) { - parse_rule(&filter_list, "- /*/*", 0, 0); + parse_filter_str(&filter_list, "- /*/*", rule_template(0), 0); recurse = xfer_dirs = 1; } else if (recurse) xfer_dirs = 1; @@ -1966,7 +1973,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) backup_dir = sanitize_path(NULL, backup_dir, NULL, 0, SP_DEFAULT); } if (daemon_filter_list.head && !am_sender) { - struct filter_list_struct *elp = &daemon_filter_list; + filter_rule_list *elp = &daemon_filter_list; if (tmpdir) { char *dir; if (!*tmpdir) @@ -2008,18 +2015,26 @@ int parse_arguments(int *argc_p, const char ***argv_p) "the --backup-dir path is WAY too long.\n"); return 0; } - if (backup_dir_len && backup_dir_buf[backup_dir_len - 1] != '/') { + if (!backup_dir_len) { + backup_dir_len = -1; + backup_dir = NULL; + } else if (backup_dir_buf[backup_dir_len - 1] != '/') { backup_dir_buf[backup_dir_len++] = '/'; backup_dir_buf[backup_dir_len] = '\0'; } + } + if (backup_dir) { + /* No need for a suffix or a protect rule. */ } else if (!backup_suffix_len && (!am_server || !am_sender)) { snprintf(err_buf, sizeof err_buf, - "--suffix cannot be a null string without --backup-dir\n"); + "--suffix cannot be empty %s\n", backup_dir_len < 0 + ? "when --backup-dir is the same as the dest dir" + : "without a --backup-dir"); return 0; } else if (make_backups && delete_mode && !delete_excluded && !am_server) { snprintf(backup_dir_buf, sizeof backup_dir_buf, "P *%s", backup_suffix); - parse_rule(&filter_list, backup_dir_buf, 0, 0); + parse_filter_str(&filter_list, backup_dir_buf, rule_template(0), 0); } if (make_backups && !backup_dir) { @@ -2343,7 +2358,7 @@ void server_options(char **args, int *argc_p) argstr[x++] = '.'; if (allow_inc_recurse) argstr[x++] = 'i'; -#if defined HAVE_LUTIMES && defined HAVE_UTIMES +#ifdef CAN_SET_SYMLINK_TIMES argstr[x++] = 'L'; #endif #ifdef ICONV_OPTION