]> Dogcows Code - chaz/tar/blobdiff - src/buffer.c
(start_header): Include text of ignored filesystem prefix in warning.
[chaz/tar] / src / buffer.c
index 71843a436972b257970fe5e24d005adc2e4a8568..49ea37f615134c74fff6c37712f98d60551c5972 100644 (file)
    with this program; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
+/* Enable GNU extensions in fnmatch.h.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
 #include "system.h"
 
 #include <signal.h>
@@ -30,9 +35,7 @@ time_t time ();
 # include <sys/inode.h>
 #endif
 
-#ifndef FNM_LEADING_DIR
-# include <fnmatch.h>
-#endif
+#include <fnmatch.h>
 
 #include "common.h"
 #include "rmt.h"
@@ -50,7 +53,7 @@ time_t time ();
 \f
 /* Variables.  */
 
-static tarlong total_written;  /* bytes written on all volumes */
+static tarlong prev_written;   /* bytes written on previous volumes */
 static tarlong bytes_written;  /* bytes written on this volume */
 
 /* FIXME: The following four variables should ideally be static to this
@@ -144,18 +147,11 @@ myfork (void)
 
 #endif /* DEBUG FORK */
 
-void
-init_total_written (void)
-{
-  clear_tarlong (total_written);
-  clear_tarlong (bytes_written);
-}
-
 void
 print_total_written (void)
 {
   fprintf (stderr, _("Total bytes written: "));
-  print_tarlong (total_written, stderr);
+  fprintf (stderr, TARLONG_FORMAT, prev_written + bytes_written);
   fprintf (stderr, "\n");
 }
 
@@ -307,13 +303,10 @@ is_regular_file (const char *name)
 {
   struct stat stbuf;
 
-  if (stat (name, &stbuf) < 0)
-    return 1;
-
-  if (S_ISREG (stbuf.st_mode))
-    return 1;
-
-  return 0;
+  if (stat (name, &stbuf) == 0)
+    return S_ISREG (stbuf.st_mode);
+  else
+    return errno == ENOENT;
 }
 
 static ssize_t
@@ -365,8 +358,8 @@ child_open_for_compress (void)
 
   program_name = _("tar (child)");
 
-  xdup2 (parent_pipe[PREAD], STDIN_FILENO, _("(child) Pipe to stdin"));
   xclose (parent_pipe[PWRITE]);
+  xdup2 (parent_pipe[PREAD], STDIN_FILENO, _("(child) Pipe to stdin"));
 
   /* Check if we need a grandchild tar.  This happens only if either:
      a) we are writing stdout: to force reblocking;
@@ -457,7 +450,7 @@ child_open_for_compress (void)
 
          if (size < BLOCKSIZE)
            size = BLOCKSIZE;
-         status = full_read (STDIN_FILENO, cursor, size);
+         status = safe_read (STDIN_FILENO, cursor, size);
          if (status <= 0)
            break;
        }
@@ -808,8 +801,7 @@ open_archive (enum access_mode access)
 
       if (backed_up_flag)
        undo_last_backup ();
-      FATAL_ERROR ((0, saved_errno, _("Cannot open %s"),
-                   archive_name_array[0]));
+      FATAL_ERROR ((0, saved_errno, "%s", archive_name_array[0]));
     }
 
 #if !MSDOS
@@ -822,8 +814,9 @@ open_archive (enum access_mode access)
     dev_null_output =
       (strcmp (archive_name_array[0], dev_null) == 0
        || (! _isrmt (archive)
-          && stat (dev_null, &dev_null_stat) == 0
           && S_ISCHR (archive_stat.st_mode)
+          && stat (dev_null, &dev_null_stat) == 0
+          && S_ISCHR (dev_null_stat.st_mode)
           && archive_stat.st_rdev == dev_null_stat.st_rdev));
   }
 
@@ -874,7 +867,7 @@ open_archive (enum access_mode access)
          assign_string (&current_file_name, record_start->header.name);
 
          record_start->header.typeflag = GNUTYPE_VOLHDR;
-         TIME_TO_OCT (time (0), record_start->header.mtime);
+         TIME_TO_CHARS (time (0), record_start->header.mtime);
          finish_header (record_start);
 #if 0
          current_block++;
@@ -897,8 +890,7 @@ flush_write (void)
   if (checkpoint_option && !(++checkpoint % 10))
     WARN ((0, 0, _("Write checkpoint %d"), checkpoint));
 
-  if (!zerop_tarlong (tape_length_option)
-      && !lessp_tarlong (bytes_written, tape_length_option))
+  if (tape_length_option && tape_length_option <= bytes_written)
     {
       errno = ENOSPC;          /* FIXME: errno should be read-only */
       status = 0;
@@ -909,11 +901,9 @@ flush_write (void)
     status = write_archive_buffer ();
   if (status != record_size && !multi_volume_option)
     write_error (status);
-  else if (totals_option)
-    add_to_tarlong (total_written, record_size);
 
   if (status > 0)
-    add_to_tarlong (bytes_written, status);
+    bytes_written += status;
 
   if (status == record_size)
     {
@@ -929,11 +919,7 @@ flush_write (void)
              return;
            }
 
-         cursor = save_name;
-#if MSDOS
-         if (cursor[1] == ':')
-           cursor += 2;
-#endif
+         cursor = save_name + FILESYSTEM_PREFIX_LEN (save_name);
          while (*cursor == '/')
            cursor++;
 
@@ -955,7 +941,9 @@ flush_write (void)
   if (!new_volume (ACCESS_WRITE))
     return;
 
-  clear_tarlong (bytes_written);
+  if (totals_option)
+    prev_written += bytes_written;
+  bytes_written = 0;
 
   if (volume_label_option && real_s_name[0])
     {
@@ -974,7 +962,7 @@ flush_write (void)
     {
       memset ((void *) record_start, 0, BLOCKSIZE);
       sprintf (record_start->header.name, "%s Volume %d", volume_label_option, volno);
-      TIME_TO_OCT (time (0), record_start->header.mtime);
+      TIME_TO_CHARS (time (0), record_start->header.mtime);
       record_start->header.typeflag = GNUTYPE_VOLHDR;
       finish_header (record_start);
     }
@@ -994,9 +982,9 @@ flush_write (void)
 
       strcpy (record_start->header.name, real_s_name);
       record_start->header.typeflag = GNUTYPE_MULTIVOL;
-      OFF_TO_OCT (real_s_sizeleft, record_start->header.size);
-      OFF_TO_OCT (real_s_totsize - real_s_sizeleft, 
-                 record_start->oldgnu_header.offset);
+      OFF_TO_CHARS (real_s_sizeleft, record_start->header.size);
+      OFF_TO_CHARS (real_s_totsize - real_s_sizeleft, 
+                   record_start->oldgnu_header.offset);
       tmp = verbose_option;
       verbose_option = 0;
       finish_header (record_start);
@@ -1009,10 +997,9 @@ flush_write (void)
   status = write_archive_buffer ();
   if (status != record_size)
     write_error (status);
-  else if (totals_option)
-    add_to_tarlong (total_written, record_size);
 
-  add_to_tarlong (bytes_written, record_size);
+  bytes_written += status;
+
   if (copy_back)
     {
       record_start += copy_back;
@@ -1027,12 +1014,8 @@ flush_write (void)
        real_s_name[0] = '\0';
       else
        {
-         char *cursor = save_name;
+         char *cursor = save_name + FILESYSTEM_PREFIX_LEN (save_name);
 
-#if MSDOS
-         if (cursor[1] == ':')
-           cursor += 2;
-#endif
          while (*cursor == '/')
            cursor++;
 
@@ -1119,12 +1102,8 @@ flush_read (void)
     {
       if (save_name)
        {
-         char *cursor = save_name;
+         char *cursor = save_name + FILESYSTEM_PREFIX_LEN (save_name);
 
-#if MSDOS
-         if (cursor[1] == ':')
-           cursor += 2;
-#endif
          while (*cursor == '/')
            cursor++;
 
@@ -1212,8 +1191,8 @@ error_loop:
              global_volno--;
              goto try_volume;
            }
-         s1 = UINTMAX_FROM_OCT (cursor->header.size);
-         s2 = UINTMAX_FROM_OCT (cursor->oldgnu_header.offset);
+         s1 = UINTMAX_FROM_CHARS (cursor->header.size);
+         s2 = UINTMAX_FROM_CHARS (cursor->oldgnu_header.offset);
          if (real_s_totsize != s1 + s2 || s1 + s2 < s2)
            {
              char totsizebuf[UINTMAX_STRSIZE_BOUND];
@@ -1230,7 +1209,7 @@ error_loop:
              goto try_volume;
            }
          if (real_s_totsize - real_s_sizeleft
-             != OFF_FROM_OCT (cursor->oldgnu_header.offset))
+             != OFF_FROM_CHARS (cursor->oldgnu_header.offset))
            {
              WARN ((0, 0, _("This volume is out of sequence")));
              volno--;
@@ -1553,7 +1532,7 @@ new_volume (enum access_mode access)
       looped = 1;
     }
 
-tryagain:
+ tryagain:
   if (looped)
     {
       /* We have to prompt from now on.  */
@@ -1584,6 +1563,7 @@ tryagain:
                    && subcommand_option != DIFF_SUBCOMMAND)
                  WARN ((0, 0, _("WARNING: Archive is incomplete")));
 
+               apply_delayed_set_stat ();
                exit (TAREXIT_FAILURE);
              }
            if (input_buffer[0] == '\n'
@@ -1613,6 +1593,7 @@ tryagain:
                    && subcommand_option != DIFF_SUBCOMMAND)
                  WARN ((0, 0, _("WARNING: Archive is incomplete")));
 
+               apply_delayed_set_stat ();
                exit (TAREXIT_FAILURE);
 
              case 'n':
This page took 0.027859 seconds and 4 git commands to generate.