X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=004a13d30108f9f1ba9b482e8cc1db2c6c8377f4;hb=49ce0ebbea0bbd3c03b87b0cae94aaaf63d10b30;hp=16fdfa7450462cb91bba9e5b48af9a5e982685cc;hpb=d52a1bb3663f9eb595e5f311037fc5cbd13d621e;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 16fdfa7..004a13d 100644 --- a/src/tar.c +++ b/src/tar.c @@ -112,6 +112,40 @@ confirm (const char *message_action, const char *message_name) return reply == 'y' || reply == 'Y'; } } + +void +set_archive_format (char *name) +{ + static struct fmttab { + char *name; + enum archive_format fmt; + } fmttab[] = { + { "v7", V7_FORMAT }, + { "oldgnu", OLDGNU_FORMAT }, + { "posix", POSIX_FORMAT }, +#if 0 /* not fully supported yet */ + { "star", STAR_FORMAT }, +#endif + { "gnu", GNU_FORMAT }, + NULL + }; + struct fmttab *p; + enum archive_format fmt; + + for (p = fmttab; p->name; p++) + { + if (strcmp (p->name, name) == 0) + { + fmt = p->fmt; + break; + } + } + + if (archive_format != DEFAULT_FORMAT && archive_format != fmt) + USAGE_ERROR ((0, 0, _("Conflicting archive format options"))); + + archive_format = fmt; +} /* Options. */ @@ -131,6 +165,7 @@ enum DELETE_OPTION, EXCLUDE_OPTION, FORCE_LOCAL_OPTION, + FORMAT_OPTION, GROUP_OPTION, IGNORE_CASE_OPTION, IGNORE_FAILED_READ_OPTION, @@ -159,18 +194,6 @@ enum VOLNO_FILE_OPTION, WILDCARDS_OPTION, WILDCARDS_MATCH_SLASH_OPTION, - - /* Some cleanup is being made in GNU tar long options. Using old names is - allowed for a while, but will also send a warning to stderr. Take old - names out in 1.14, or in summer 1997, whichever happens last. */ - - OBSOLETE_ABSOLUTE_NAMES, - OBSOLETE_BLOCK_COMPRESS, - OBSOLETE_BLOCKING_FACTOR, - OBSOLETE_BLOCK_NUMBER, - OBSOLETE_READ_FULL_RECORDS, - OBSOLETE_TOUCH, - OBSOLETE_VERSION_CONTROL }; /* If nonzero, display usage information and exit. */ @@ -182,15 +205,12 @@ static int show_version; static struct option long_options[] = { {"absolute-names", no_argument, 0, 'P'}, - {"absolute-paths", no_argument, 0, OBSOLETE_ABSOLUTE_NAMES}, {"after-date", required_argument, 0, 'N'}, {"anchored", no_argument, 0, ANCHORED_OPTION}, {"append", no_argument, 0, 'r'}, {"atime-preserve", no_argument, 0, ATIME_PRESERVE_OPTION}, {"backup", optional_argument, 0, BACKUP_OPTION}, - {"block-compress", no_argument, 0, OBSOLETE_BLOCK_COMPRESS}, {"block-number", no_argument, 0, 'R'}, - {"block-size", required_argument, 0, OBSOLETE_BLOCKING_FACTOR}, {"blocking-factor", required_argument, 0, 'b'}, {"bzip2", no_argument, 0, 'j'}, {"catenate", no_argument, 0, 'A'}, @@ -212,6 +232,7 @@ static struct option long_options[] = {"file", required_argument, 0, 'f'}, {"files-from", required_argument, 0, 'T'}, {"force-local", no_argument, 0, FORCE_LOCAL_OPTION}, + {"format", required_argument, 0, FORMAT_OPTION}, {"get", no_argument, 0, 'x'}, {"group", required_argument, 0, GROUP_OPTION}, {"gunzip", no_argument, 0, 'z'}, @@ -230,7 +251,6 @@ static struct option long_options[] = {"list", no_argument, 0, 't'}, {"listed-incremental", required_argument, 0, 'g'}, {"mode", required_argument, 0, MODE_OPTION}, - {"modification-time", no_argument, 0, OBSOLETE_TOUCH}, {"multi-volume", no_argument, 0, 'M'}, {"new-volume-script", required_argument, 0, 'F'}, {"newer", required_argument, 0, 'N'}, @@ -256,10 +276,8 @@ static struct option long_options[] = {"preserve-permissions", no_argument, 0, 'p'}, {"recursion", no_argument, &recursion_option, FNM_LEADING_DIR}, {"recursive-unlink", no_argument, 0, RECURSIVE_UNLINK_OPTION}, - {"read-full-blocks", no_argument, 0, OBSOLETE_READ_FULL_RECORDS}, {"read-full-records", no_argument, 0, 'B'}, /* FIXME: --partial-blocks might be a synonym for --read-full-records? */ - {"record-number", no_argument, 0, OBSOLETE_BLOCK_NUMBER}, {"record-size", required_argument, 0, RECORD_SIZE_OPTION}, {"remove-files", no_argument, 0, REMOVE_FILES_OPTION}, {"rsh-command", required_argument, 0, RSH_COMMAND_OPTION}, @@ -282,7 +300,6 @@ static struct option long_options[] = {"verbose", no_argument, 0, 'v'}, {"verify", no_argument, 0, 'W'}, {"version", no_argument, &show_version, 1}, - {"version-control", required_argument, 0, OBSOLETE_VERSION_CONTROL}, {"volno-file", required_argument, 0, VOLNO_FILE_OPTION}, {"wildcards", no_argument, 0, WILDCARDS_OPTION}, {"wildcards-match-slash", no_argument, 0, WILDCARDS_MATCH_SLASH_OPTION}, @@ -387,10 +404,16 @@ Device blocking:\n\ fputs (_("\ \n\ Archive format selection:\n\ + --format=FMTNAME create archive of the given format.\n\ + FMTNAME is one of the following:\n\ + v7 old V7 tar format\n\ + oldgnu GNU format as per tar <= 1.12\n\ + posix POSIX 1003.1-2001 tar format\n\ + gnu GNU format\n\ + --old-archive, --portability same as --format=v7\n\ + --posix same as --format=posix\n\ -V, --label=NAME create archive with volume name NAME\n\ PATTERN at list/extract time, a globbing PATTERN\n\ - --old-archive, --portability write a V7 format archive\n\ - --posix write a POSIX format archive\n\ -j, --bzip2 filter the archive through bzip2\n\ -z, --gzip, --ungzip filter the archive through gzip\n\ -Z, --compress, --uncompress filter the archive through compress\n\ @@ -618,14 +641,6 @@ decode_options (int argc, char **argv) set_subcommand_option (CAT_SUBCOMMAND); break; - case OBSOLETE_BLOCK_COMPRESS: - WARN ((0, 0, _("Obsolete option, now implied by --blocking-factor"))); - break; - - case OBSOLETE_BLOCKING_FACTOR: - WARN ((0, 0, _("Obsolete option name replaced by --blocking-factor"))); - /* Fall through. */ - case 'b': { uintmax_t u; @@ -638,11 +653,6 @@ decode_options (int argc, char **argv) } break; - case OBSOLETE_READ_FULL_RECORDS: - WARN ((0, 0, - _("Obsolete option name replaced by --read-full-records"))); - /* Fall through. */ - case 'B': /* Try to reblock input records. For reading 4.2BSD pipes. */ @@ -751,10 +761,6 @@ decode_options (int argc, char **argv) } break; - case OBSOLETE_TOUCH: - WARN ((0, 0, _("Obsolete option name replaced by --touch"))); - /* Fall through. */ - case 'm': touch_option = 1; break; @@ -812,10 +818,6 @@ decode_options (int argc, char **argv) same_permissions_option = 1; break; - case OBSOLETE_ABSOLUTE_NAMES: - WARN ((0, 0, _("Obsolete option name replaced by --absolute-names"))); - /* Fall through. */ - case 'P': absolute_names_option = 1; break; @@ -824,10 +826,6 @@ decode_options (int argc, char **argv) set_subcommand_option (APPEND_SUBCOMMAND); break; - case OBSOLETE_BLOCK_NUMBER: - WARN ((0, 0, _("Obsolete option name replaced by --block-number"))); - /* Fall through. */ - case 'R': /* Print block numbers for debugging bad tar archives. */ @@ -910,10 +908,6 @@ decode_options (int argc, char **argv) set_use_compress_program_option ("compress"); break; - case OBSOLETE_VERSION_CONTROL: - WARN ((0, 0, _("Obsolete option name replaced by --backup"))); - /* Fall through. */ - case ANCHORED_OPTION: exclude_options |= EXCLUDE_ANCHORED; break; @@ -944,6 +938,10 @@ decode_options (int argc, char **argv) force_local_option = 1; break; + case FORMAT_OPTION: + set_archive_format (optarg); + break; + case INDEX_FILE_OPTION: index_file_name = optarg; break; @@ -1027,17 +1025,7 @@ decode_options (int argc, char **argv) break; case POSIX_OPTION: -#if OLDGNU_COMPATIBILITY - if (archive_format == DEFAULT_FORMAT) - archive_format = GNU_FORMAT; - else if (archive_format != GNU_FORMAT) - USAGE_ERROR ((0, 0, _("Conflicting archive format options"))); -#else - if (archive_format == DEFAULT_FORMAT) - archive_format = POSIX_FORMAT; - else if (archive_format != POSIX_FORMAT) - USAGE_ERROR ((0, 0, _("Conflicting archive format options"))); -#endif + set_archive_format ("posix"); break; case PRESERVE_OPTION: @@ -1157,10 +1145,7 @@ decode_options (int argc, char **argv) xrealloc (archive_name_array, sizeof (const char *) * allocated_archive_names); } - archive_name_array[archive_names++] = buf; - - /* FIXME: How comes this works for many archives when buf is - not xstrdup'ed? */ + archive_name_array[archive_names++] = strdup (buf); } break; @@ -1186,10 +1171,7 @@ decode_options (int argc, char **argv) if (subcommand_option == CREATE_SUBCOMMAND) { /* GNU Tar <= 1.13 compatibility */ - if (archive_format == DEFAULT_FORMAT) - archive_format = V7_FORMAT; - else if (archive_format != V7_FORMAT) - USAGE_ERROR ((0, 0, _("Conflicting archive format options"))); + set_archive_format ("v7"); } else { @@ -1227,13 +1209,7 @@ see the file named COPYING for details.")); /* Derive option values and check option consistency. */ if (archive_format == DEFAULT_FORMAT) - { -#if OLDGNU_COMPATIBILITY - archive_format = OLDGNU_FORMAT; -#else - archive_format = GNU_FORMAT; -#endif - } + archive_format = GNU_FORMAT; if (archive_format == GNU_FORMAT && getenv ("POSIXLY_CORRECT")) archive_format = POSIX_FORMAT; @@ -1448,3 +1424,15 @@ main (int argc, char **argv) exit_status = TAREXIT_FAILURE; exit (exit_status); } + +void +destroy_stat (struct tar_stat_info *st) +{ + free (st->orig_file_name); + free (st->file_name); + free (st->link_name); + free (st->uname); + free (st->gname); + memset (st, 0, sizeof (*st)); +} +