X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=79475048e7e89f4d514b2ae5b87664bb61edb869;hb=HEAD;hp=f36e1518455baa8e91abac3473abca73608de25f;hpb=29a6964af3e1baabe978ce608e0466e1250d08ab;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index f36e151..7947504 100644 --- a/src/tar.c +++ b/src/tar.c @@ -1,6 +1,6 @@ /* A tar (tape archiver) program. - Copyright 1988, 1992-1997, 1999-2001, 2003-2007, 2012-2014 Free + Copyright 1988, 1992-1997, 1999-2001, 2003-2007, 2012-2015 Free Software Foundation, Inc. Written by John Gilmore, starting 1985-08-25. @@ -167,6 +167,14 @@ set_archive_format (char const *name) archive_format = p->fmt; } +static void +set_xattr_option (int value) +{ + if (value == 1) + set_archive_format ("posix"); + xattrs_option = value; +} + const char * archive_format_string (enum archive_format fmt) { @@ -276,10 +284,13 @@ enum EXCLUDE_CACHES_UNDER_OPTION, EXCLUDE_CACHES_ALL_OPTION, EXCLUDE_OPTION, + EXCLUDE_IGNORE_OPTION, + EXCLUDE_IGNORE_RECURSIVE_OPTION, EXCLUDE_TAG_OPTION, EXCLUDE_TAG_UNDER_OPTION, EXCLUDE_TAG_ALL_OPTION, EXCLUDE_VCS_OPTION, + EXCLUDE_VCS_IGNORES_OPTION, FORCE_LOCAL_OPTION, FULL_TIME_OPTION, GROUP_OPTION, @@ -312,6 +323,7 @@ enum NO_SEEK_OPTION, NO_SELINUX_CONTEXT_OPTION, NO_UNQUOTE_OPTION, + NO_VERBATIM_FILES_FROM_OPTION, NO_WILDCARDS_MATCH_SLASH_OPTION, NO_WILDCARDS_OPTION, NO_XATTR_OPTION, @@ -353,6 +365,7 @@ enum TRANSFORM_OPTION, UNQUOTE_OPTION, UTC_OPTION, + VERBATIM_FILES_FROM_OPTION, VOLNO_FILE_OPTION, WARNING_OPTION, WILDCARDS_MATCH_SLASH_OPTION, @@ -702,13 +715,19 @@ static struct argp_option options[] = { {"files-from", 'T', N_("FILE"), 0, N_("get names to extract or create from FILE"), GRID+1 }, {"null", NULL_OPTION, 0, 0, - N_("-T reads null-terminated names, disable -C"), GRID+1 }, + N_("-T reads null-terminated names; implies --verbatim-files-from"), + GRID+1 }, {"no-null", NO_NULL_OPTION, 0, 0, N_("disable the effect of the previous --null option"), GRID+1 }, {"unquote", UNQUOTE_OPTION, 0, 0, - N_("unquote filenames read with -T (default)"), GRID+1 }, + N_("unquote input file or member names (default)"), GRID+1 }, {"no-unquote", NO_UNQUOTE_OPTION, 0, 0, - N_("do not unquote filenames read with -T"), GRID+1 }, + N_("do not unquote input file or member names"), GRID+1 }, + {"verbatim-files-from", VERBATIM_FILES_FROM_OPTION, 0, 0, + N_("-T reads file names verbatim (no option handling)"), GRID+1 }, + {"no-verbatim-files-from", NO_VERBATIM_FILES_FROM_OPTION, 0, 0, + N_("-T treats file names starting with dash as options (default)"), + GRID+1 }, {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0, N_("exclude files, given as a PATTERN"), GRID+1 }, {"exclude-from", 'X', N_("FILE"), 0, @@ -724,12 +743,20 @@ static struct argp_option options[] = { {"exclude-tag", EXCLUDE_TAG_OPTION, N_("FILE"), 0, N_("exclude contents of directories containing FILE, except" " for FILE itself"), GRID+1 }, + {"exclude-ignore", EXCLUDE_IGNORE_OPTION, N_("FILE"), 0, + N_("read exclude patterns for each directory from FILE, if it exists"), + GRID+1 }, + {"exclude-ignore-recursive", EXCLUDE_IGNORE_RECURSIVE_OPTION, N_("FILE"), 0, + N_("read exclude patterns for each directory and its subdirectories " + "from FILE, if it exists"), GRID+1 }, {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION, N_("FILE"), 0, N_("exclude everything under directories containing FILE"), GRID+1 }, {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION, N_("FILE"), 0, N_("exclude directories containing FILE"), GRID+1 }, {"exclude-vcs", EXCLUDE_VCS_OPTION, NULL, 0, N_("exclude version control system directories"), GRID+1 }, + {"exclude-vcs-ignores", EXCLUDE_VCS_IGNORES_OPTION, NULL, 0, + N_("read exclude patterns from the VCS ignore files"), GRID+1 }, {"exclude-backups", EXCLUDE_BACKUPS_OPTION, NULL, 0, N_("exclude backup and lock files"), GRID+1 }, {"no-recursion", NO_RECURSION_OPTION, 0, 0, @@ -1322,14 +1349,18 @@ static char filename_terminator; static char const *const sort_mode_arg[] = { "none", "name", +#if D_INO_IN_DIRENT "inode", +#endif NULL }; static int sort_mode_flag[] = { SAVEDIR_SORT_NONE, SAVEDIR_SORT_NAME, +#if D_INO_IN_DIRENT SAVEDIR_SORT_INODE +#endif }; ARGMATCH_VERIFY (sort_mode_arg, sort_mode_flag); @@ -1622,7 +1653,8 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case 'T': - name_add_file (arg, filename_terminator); + name_add_file (arg, filename_terminator, verbatim_files_from_option, + MAKE_INCL_OPTIONS (args)); /* Indicate we've been given -T option. This is for backward compatibility only, so that `tar cfT archive /dev/null will succeed */ @@ -1768,6 +1800,14 @@ parse_opt (int key, char *arg, struct argp_state *state) cachedir_file_p); break; + case EXCLUDE_IGNORE_OPTION: + excfile_add (arg, EXCL_NON_RECURSIVE); + break; + + case EXCLUDE_IGNORE_RECURSIVE_OPTION: + excfile_add (arg, EXCL_RECURSIVE); + break; + case EXCLUDE_TAG_OPTION: add_exclusion_tag (arg, exclusion_tag_contents, NULL); break; @@ -1784,6 +1824,10 @@ parse_opt (int key, char *arg, struct argp_state *state) add_exclude_array (vcs_file_table, 0); break; + case EXCLUDE_VCS_IGNORES_OPTION: + exclude_vcs_ignores (); + break; + case FORCE_LOCAL_OPTION: force_local_option = true; break; @@ -1871,10 +1915,12 @@ parse_opt (int key, char *arg, struct argp_state *state) case NULL_OPTION: filename_terminator = '\0'; + verbatim_files_from_option = true; break; case NO_NULL_OPTION: filename_terminator = '\n'; + verbatim_files_from_option = false; break; case NUMERIC_OWNER_OPTION: @@ -2095,16 +2141,16 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case XATTR_OPTION: - set_archive_format ("posix"); - xattrs_option = 1; + set_xattr_option (1); break; case NO_XATTR_OPTION: - xattrs_option = -1; + set_xattr_option (-1); break; case XATTR_INCLUDE: case XATTR_EXCLUDE: + set_xattr_option (1); xattrs_mask_add (arg, (key == XATTR_INCLUDE)); break; @@ -2124,6 +2170,14 @@ parse_opt (int key, char *arg, struct argp_state *state) unquote_option = false; break; + case VERBATIM_FILES_FROM_OPTION: + verbatim_files_from_option = true; + break; + + case NO_VERBATIM_FILES_FROM_OPTION: + verbatim_files_from_option = false; + break; + case WARNING_OPTION: set_warning_option (arg); break; @@ -2296,6 +2350,7 @@ decode_options (int argc, char **argv) blocking_factor = DEFAULT_BLOCKING; record_size = DEFAULT_BLOCKING * BLOCKSIZE; excluded = new_exclude (); + newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t); newer_mtime_option.tv_nsec = -1; recursion_option = FNM_LEADING_DIR; @@ -2549,22 +2604,22 @@ decode_options (int argc, char **argv) { char *base; - if (!IS_SUBCOMMAND_CLASS (SUBCL_READ)) - option_conflict_error ("--one-top-level", - subcommand_string (subcommand_option)); if (absolute_names_option) option_conflict_error ("--one-top-level", "--absolute-names"); - /* If the user wants to guarantee that everything is under one directory, - determine its name now and let it be created later. */ - base = base_name (archive_name_array[0]); - one_top_level_dir = strip_compression_suffix (base); - free (base); - if (!one_top_level_dir) - USAGE_ERROR ((0, 0, - _("Cannot deduce top-level directory name; " - "please set it explicitly with --one-top-level=DIR"))); + { + /* If the user wants to guarantee that everything is under one + directory, determine its name now and let it be created later. */ + base = base_name (archive_name_array[0]); + one_top_level_dir = strip_compression_suffix (base); + free (base); + + if (!one_top_level_dir) + USAGE_ERROR ((0, 0, + _("Cannot deduce top-level directory name; " + "please set it explicitly with --one-top-level=DIR"))); + } } /* If ready to unlink hierarchies, so we are for simpler files. */ @@ -2841,6 +2896,7 @@ tar_stat_destroy (struct tar_stat_info *st) free (st->sparse_map); free (st->dumpdir); xheader_destroy (&st->xhdr); + info_free_exclist (st); memset (st, 0, sizeof (*st)); }