X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=004a13d30108f9f1ba9b482e8cc1db2c6c8377f4;hb=879ae47aa16752580616c6c52d6b4757a2705dd3;hp=059e0c99ce11606332ce7a2a441a8aad2e6a2312;hpb=42d05fcb6e724c52cd66c85828b0b8b9d2338e72;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 059e0c9..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,19 +205,17 @@ 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'}, {"checkpoint", no_argument, 0, CHECKPOINT_OPTION}, + {"check-links", no_argument, &check_links_option, 1}, {"compare", no_argument, 0, 'd'}, {"compress", no_argument, 0, 'Z'}, {"concatenate", no_argument, 0, 'A'}, @@ -211,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'}, @@ -229,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'}, @@ -255,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}, @@ -281,11 +300,10 @@ 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}, - + {0, 0, 0, 0} }; @@ -386,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\ - -o, --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\ @@ -435,6 +459,7 @@ Informative output:\n\ --version print tar program version number, then exit\n\ -v, --verbose verbosely list files processed\n\ --checkpoint print directory names while reading the archive\n\ + --check-links print a message if not all links are dumped\n\ --totals print total bytes written while creating archive\n\ --index-file=FILE send verbose output to FILE\n\ -R, --block-number show block number within archive with each message\n\ @@ -443,6 +468,13 @@ Informative output:\n\ stdout); fputs (_("\ \n\ +Compatibility options:\n\ + -o when creating, same as --old-archive\n\ + when extracting, same as --no-same-owner\n"), + stdout); + + fputs (_("\ +\n\ The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\ The version control may be set with --backup or VERSION_CONTROL, values are:\n\ \n\ @@ -508,7 +540,8 @@ decode_options (int argc, char **argv) char const *backup_suffix_string; char const *version_control_string = 0; int exclude_options = EXCLUDE_WILDCARDS; - + int o_option = 0; + /* Set some default option values. */ subcommand_option = UNKNOWN_SUBCOMMAND; @@ -608,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; @@ -628,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. */ @@ -741,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; @@ -791,10 +807,7 @@ decode_options (int argc, char **argv) #endif /* not MSDOS */ case 'o': - if (archive_format == DEFAULT_FORMAT) - archive_format = V7_FORMAT; - else if (archive_format != V7_FORMAT) - USAGE_ERROR ((0, 0, _("Conflicting archive format options"))); + o_option = 1; break; case 'O': @@ -805,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; @@ -817,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. */ @@ -903,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; @@ -937,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; @@ -1020,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: @@ -1150,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; @@ -1165,6 +1157,29 @@ decode_options (int argc, char **argv) #endif /* not DEVICE_PREFIX */ } + /* Special handling for 'o' option: + + GNU tar used to say "output old format". + UNIX98 tar says don't chown files after extracting (we use + "--no-same-owner" for this). + + The old GNU tar semantics is retained when used with --create + option, otherwise UNIX98 semantics is assumed */ + + if (o_option) + { + if (subcommand_option == CREATE_SUBCOMMAND) + { + /* GNU Tar <= 1.13 compatibility */ + set_archive_format ("v7"); + } + else + { + /* UNIX98 compatibility */ + same_owner_option = 1; + } + } + /* Handle operands after any "--" argument. */ for (; optind < argc; optind++) { @@ -1194,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; @@ -1396,6 +1405,9 @@ main (int argc, char **argv) break; } + if (check_links_option) + check_links (); + if (volno_file_option) closeout_volume_number (); @@ -1412,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)); +} +