]> Dogcows Code - chaz/tar/blobdiff - src/buffer.c
Improve compression format recognition
[chaz/tar] / src / buffer.c
index 648b6baa4180d00fa113e7eb2019c91da4ff943b..1a96595d9a982168d1da56f53863fdd6ee069f11 100644 (file)
@@ -1,7 +1,7 @@
 /* Buffer management for tar.
 
-   Copyright 1988, 1992-1994, 1996-1997, 1999-2010, 2013 Free Software
-   Foundation, Inc.
+   Copyright 1988, 1992-1994, 1996-1997, 1999-2010, 2013-2014 Free
+   Software Foundation, Inc.
 
    This file is part of GNU tar.
 
@@ -391,7 +391,10 @@ check_compressed_archive (bool *pshort)
   /* Restore global values */
   read_full_records = sfr;
 
-  if (tar_checksum (record_start, true) == HEADER_SUCCESS)
+  if ((strcmp (record_start->header.magic, TMAGIC) == 0 ||
+       strcmp (record_start->buffer + offsetof (struct posix_header, magic),
+              OLDGNU_MAGIC) == 0) &&
+      tar_checksum (record_start, true) == HEADER_SUCCESS)
     /* Probably a valid header */
     return ct_tar;
 
@@ -492,20 +495,20 @@ open_compressed_archive (void)
 static int
 print_stats (FILE *fp, const char *text, tarlong numbytes)
 {
-  char bytes[sizeof (tarlong) * CHAR_BIT];
   char abbr[LONGEST_HUMAN_READABLE + 1];
   char rate[LONGEST_HUMAN_READABLE + 1];
-
+  int n = 0;
+  
   int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
 
-  sprintf (bytes, TARLONG_FORMAT, numbytes);
-
-  return fprintf (fp, "%s: %s (%s, %s/s)",
-                 text, bytes,
-                 human_readable (numbytes, abbr, human_opts, 1, 1),
-                 (0 < duration && numbytes / duration < (uintmax_t) -1
-                  ? human_readable (numbytes / duration, rate, human_opts, 1, 1)
-                  : "?"));
+  if (text && text[0])
+    n += fprintf (fp, "%s: ", gettext (text));
+  return n + fprintf (fp, TARLONG_FORMAT " (%s, %s/s)",
+                     numbytes,
+                     human_readable (numbytes, abbr, human_opts, 1, 1),
+                     (0 < duration && numbytes / duration < (uintmax_t) -1
+                      ? human_readable (numbytes / duration, rate, human_opts, 1, 1)
+                      : "?"));
 }
 
 /* Format totals to file FP.  FORMATS is an array of strings to output
@@ -524,27 +527,28 @@ format_total_stats (FILE *fp, const char **formats, int eor, int eol)
     case CAT_SUBCOMMAND:
     case UPDATE_SUBCOMMAND:
     case APPEND_SUBCOMMAND:
-      n = print_stats (fp, _(formats[TF_WRITE]),
+      n = print_stats (fp, formats[TF_WRITE],
                       prev_written + bytes_written);
       break;
 
     case DELETE_SUBCOMMAND:
       {
         char buf[UINTMAX_STRSIZE_BOUND];
-        n = print_stats (fp, _(formats[TF_READ]),
+        n = print_stats (fp, formats[TF_READ],
                         records_read * record_size);
 
        fputc (eor, fp);
        n++;
        
-        n += print_stats (fp, _(formats[TF_WRITE]),
+        n += print_stats (fp, formats[TF_WRITE],
                          prev_written + bytes_written);
 
        fputc (eor, fp);
        n++;
-       
-        n += fprintf (fp, "%s: %s",
-                     _(formats[TF_DELETED]),
+
+       if (formats[TF_DELETED] && formats[TF_DELETED][0])
+         n += fprintf (fp, "%s: ", gettext (formats[TF_DELETED]));
+        n += fprintf (fp, "%s",
                      STRINGIFY_BIGINT ((records_read - records_skipped)
                                        * record_size
                                        - (prev_written + bytes_written), buf));
@@ -667,6 +671,22 @@ init_buffer (void)
   record_end = record_start + blocking_factor;
 }
 
+static void
+check_tty (enum access_mode mode)
+{
+  /* Refuse to read archive from and write it to a tty. */
+  if (strcmp (archive_name_array[0], "-") == 0
+      && isatty (mode == ACCESS_READ ? STDIN_FILENO : STDOUT_FILENO))
+    {
+      FATAL_ERROR ((0, 0,
+                   mode == ACCESS_READ
+                   ? _("Refusing to read archive contents from terminal "
+                       "(missing -f option?)")
+                   : _("Refusing to write archive contents to terminal "
+                       "(missing -f option?)")));
+    }
+}
+
 /* Open an archive file.  The argument specifies whether we are
    reading or writing, or both.  */
 static void
@@ -687,6 +707,7 @@ _open_archive (enum access_mode wanted_access)
 
   /* When updating the archive, we start with reading.  */
   access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
+  check_tty (access_mode);
 
   read_full_records = read_full_records_option;
 
@@ -730,7 +751,6 @@ _open_archive (enum access_mode wanted_access)
             enum compress_type type;
 
             archive = STDIN_FILENO;
-
             type = check_compressed_archive (&shortfile);
             if (type != ct_tar && type != ct_none)
               FATAL_ERROR ((0, 0,
This page took 0.026941 seconds and 4 git commands to generate.