]> Dogcows Code - chaz/tar/commitdiff
Use mv_.* functions uniformly instead of fiddling with the global variables.
authorSergey Poznyakoff <gray@gnu.org.ua>
Wed, 9 Nov 2005 13:08:42 +0000 (13:08 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Wed, 9 Nov 2005 13:08:42 +0000 (13:08 +0000)
src/compare.c
src/create.c
src/extract.c
src/incremen.c
src/list.c

index 0173363df18be998266ed6a3b906071096cac9f8..cdbf9455e221b191b18b4fe1d4e2668451c5ae2f 100644 (file)
@@ -134,14 +134,15 @@ process_dumpdir (size_t bytes, char *buffer)
    address of the chunk it can work with.  The PROCESSOR should return
    nonzero for success.  It it return error once, continue skipping
    without calling PROCESSOR anymore.  */
+
 static void
-read_and_process (off_t size, int (*processor) (size_t, char *))
+read_and_process (struct tar_stat_info *st, int (*processor) (size_t, char *))
 {
   union block *data_block;
   size_t data_size;
-
-  if (multi_volume_option)
-    save_sizeleft = size;
+  size_t size = st->stat.st_size;
+  
+  mv_begin (st);
   while (size)
     {
       data_block = find_next_block ();
@@ -159,9 +160,9 @@ read_and_process (off_t size, int (*processor) (size_t, char *))
       set_next_block_after ((union block *)
                            (data_block->buffer + data_size - 1));
       size -= data_size;
-      if (multi_volume_option)
-       save_sizeleft -= data_size;
+      mv_size_left (size);
     }
+  mv_end ();
 }
 
 /* Call either stat or lstat over STAT_DATA, depending on
@@ -250,21 +251,7 @@ diff_file (void)
              if (current_stat_info.is_sparse)
                sparse_diff_file (diff_handle, &current_stat_info);
              else
-               {
-                 if (multi_volume_option)
-                   {
-                     assign_string (&save_name,
-                                     current_stat_info.orig_file_name);
-                     save_totsize = current_stat_info.stat.st_size;
-                     /* save_sizeleft is set in read_and_process.  */
-                   }
-
-                 read_and_process (current_stat_info.stat.st_size,
-                                   process_rawdata);
-
-                 if (multi_volume_option)
-                   assign_string (&save_name, 0);
-               }
+               read_and_process (&current_stat_info, process_rawdata);
 
              status = close (diff_handle);
              if (status != 0)
@@ -373,24 +360,14 @@ diff_dumpdir (void)
       
   dumpdir_buffer = get_directory_contents (current_stat_info.file_name, dev);
 
-  if (multi_volume_option)
-    {
-      assign_string (&save_name, current_stat_info.orig_file_name);
-      save_totsize = current_stat_info.stat.st_size;
-      /* save_sizeleft is set in read_and_process.  */
-    }
-
   if (dumpdir_buffer)
     {
       dumpdir_cursor = dumpdir_buffer;
-      read_and_process (current_stat_info.stat.st_size, process_dumpdir);
+      read_and_process (&current_stat_info, process_dumpdir);
       free (dumpdir_buffer);
     }
   else
-    read_and_process (current_stat_info.stat.st_size, process_noop);
-
-  if (multi_volume_option)
-    assign_string (&save_name, 0);
+    read_and_process (&current_stat_info, process_noop);
 }
 
 static void
@@ -441,18 +418,8 @@ diff_multivol (void)
       return;
     }
 
-  if (multi_volume_option)
-    {
-      assign_string (&save_name, current_stat_info.orig_file_name);
-      save_totsize = stat_data.st_size;
-      /* save_sizeleft is set in read_and_process.  */
-    }
-
-  read_and_process (current_stat_info.stat.st_size, process_rawdata);
-
-  if (multi_volume_option)
-    assign_string (&save_name, 0);
-
+  read_and_process (&current_stat_info, process_rawdata);
+  
   status = close (fd);
   if (status != 0)
     close_error (current_stat_info.file_name);
index 645bcb65428634659bd36f54490ce291f43dbd07..6f553fe1077a280778658b2f22092942041456b1 100644 (file)
@@ -452,7 +452,7 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
   finish_header (st, header, -1);
 
   header = find_next_block ();
-
+  
   bufsize = available_space_after (header);
 
   while (bufsize < size)
@@ -576,8 +576,8 @@ write_long_name (struct tar_stat_info *st)
   return write_short_name (st);
 }
 
-static union block *
-write_extended (struct tar_stat_info *st, union block *old_header)
+union block *
+write_extended (char type, struct tar_stat_info *st, union block *old_header)
 {
   union block *header, hp;
   char *p;
@@ -588,7 +588,7 @@ write_extended (struct tar_stat_info *st, union block *old_header)
   xheader_finish (&extended_header);
   memcpy (hp.buffer, old_header, sizeof (hp));
   p = xheader_xhdr_name (st);
-  xheader_write (XHDTYPE, p, &extended_header);
+  xheader_write (type, p, &extended_header);
   free (p);
   header = find_next_block ();
   memcpy (header, &hp.buffer, sizeof (hp.buffer));
@@ -852,7 +852,7 @@ finish_header (struct tar_stat_info *st,
       print_header (st, block_ordinal);
     }
 
-  header = write_extended (st, header);
+  header = write_extended (XHDTYPE, st, header);
   simple_finish_header (header);
 }
 \f
@@ -863,7 +863,7 @@ pad_archive (off_t size_left)
   union block *blk;
   while (size_left > 0)
     {
-      save_sizeleft = size_left;
+      mv_size_left (size_left);
       blk = find_next_block ();
       memset (blk->buffer, 0, BLOCKSIZE);
       set_next_block_after (blk);
@@ -889,16 +889,13 @@ dump_regular_file (int fd, struct tar_stat_info *st)
 
   finish_header (st, blk, block_ordinal);
 
+  mv_begin (st);
   while (size_left > 0)
     {
       size_t bufsize, count;
 
-      if (multi_volume_option)
-       {
-         assign_string (&save_name, st->orig_file_name);
-         save_sizeleft = size_left;
-         save_totsize = st->stat.st_size;
-       }
+      mv_size_left (size_left);
+
       blk = find_next_block ();
 
       bufsize = available_space_after (blk);
@@ -1054,7 +1051,7 @@ dump_dir0 (char *directory,
              const char *buffer, *p_buffer;
              
              block_ordinal = current_block_ordinal ();
-             buffer = gnu_list_name->dir_contents; /* FOO */
+             buffer = gnu_list_name->dir_contents; 
              if (buffer)
                totsize = dumpdir_size (buffer);
              else
@@ -1063,14 +1060,12 @@ dump_dir0 (char *directory,
              finish_header (st, blk, block_ordinal);
              p_buffer = buffer;
              size_left = totsize;
+             
+             mv_begin (st);
+             mv_total_size (totsize);
              while (size_left > 0)
                {
-                 if (multi_volume_option)
-                   {
-                     assign_string (&save_name, st->orig_file_name);
-                     save_sizeleft = size_left;
-                     save_totsize = totsize;
-                   }
+                 mv_size_left (size_left);
                  blk = find_next_block ();
                  bufsize = available_space_after (blk);
                  if (size_left < bufsize)
@@ -1085,8 +1080,7 @@ dump_dir0 (char *directory,
                  p_buffer += bufsize;
                  set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE);
                }
-             if (multi_volume_option)
-               assign_string (&save_name, 0);
+             mv_end ();
            }
          return;
        }
@@ -1504,14 +1498,12 @@ dump_file0 (struct tar_stat_info *st, char *p,
          switch (status)
            {
            case dump_status_ok:
-             if (multi_volume_option)
-               assign_string (&save_name, 0);
+             mv_end ();
              dump_regular_finish (fd, st, original_ctime);
              break;
 
            case dump_status_short:
-             if (multi_volume_option)
-               assign_string (&save_name, 0);
+             mv_end ();
              close (fd);
              break;
 
index fbb93edd8a85a864feaadd85807841e7faed9e96..3ef7f2883b562d63a88adcafc0d827a85073e9e6 100644 (file)
@@ -739,37 +739,33 @@ extract_file (char *file_name, int typeflag)
        }
     }
 
+  mv_begin (&current_stat_info);
   if (current_stat_info.is_sparse)
     sparse_extract_file (fd, &current_stat_info, &size);
   else
     for (size = current_stat_info.stat.st_size; size > 0; )
       {
-       if (multi_volume_option)
-         {
-           assign_string (&save_name, current_stat_info.orig_file_name);
-           save_totsize = current_stat_info.stat.st_size;
-           save_sizeleft = size;
-         }
-
+       mv_size_left (size);
+       
        /* Locate data, determine max length writeable, write it,
           block that we have used the data, then check if the write
           worked.  */
-
+       
        data_block = find_next_block ();
        if (! data_block)
          {
            ERROR ((0, 0, _("Unexpected EOF in archive")));
            break;              /* FIXME: What happens, then?  */
          }
-
+       
        written = available_space_after (data_block);
-
+       
        if (written > size)
          written = size;
        errno = 0;
        count = full_write (fd, data_block->buffer, written);
        size -= written;
-
+       
        set_next_block_after ((union block *)
                              (data_block->buffer + written - 1));
        if (count != written)
@@ -783,9 +779,8 @@ extract_file (char *file_name, int typeflag)
 
   skip_file (size);
 
-  if (multi_volume_option)
-    assign_string (&save_name, 0);
-
+  mv_end ();
+  
   /* If writing to stdout, don't try to do anything to the filename;
      it doesn't exist, or we don't want to touch it anyway.  */
 
index 48de66805defe2be728eb72e36e5d318dbbea4db..cc5856a5272569b9098081f4d0653581f81457b5 100644 (file)
@@ -648,15 +648,11 @@ get_gnu_dumpdir ()
   to = archive_dir;
 
   set_next_block_after (current_header);
-  if (multi_volume_option)
-    {
-      assign_string (&save_name, current_stat_info.orig_file_name);
-      save_totsize = current_stat_info.stat.st_size;
-    }
+  mv_begin (&current_stat_info);
+
   for (; size > 0; size -= copied)
     {
-      if (multi_volume_option)
-       save_sizeleft = size;
+      mv_size_left (size);
       data_block = find_next_block ();
       if (!data_block)
        ERROR ((1, 0, _("Unexpected EOF in archive")));
@@ -668,8 +664,8 @@ get_gnu_dumpdir ()
       set_next_block_after ((union block *)
                            (data_block->buffer + copied - 1));
     }
-  if (multi_volume_option)
-    assign_string (&save_name, 0);
+
+  mv_end ();
   
   current_stat_info.stat.st_size = 0; /* For skip_member() and friends
                                         to work correctly */
index 5bbd3cbe25ac594ea0aba28bb9c0bc05d12d3858..0c3e223a03e8b19c3485f8f41734cf88bf2f6509 100644 (file)
@@ -222,13 +222,11 @@ list_archive (void)
        }
     }
 
-  if (multi_volume_option)
-    assign_string (&save_name, current_stat_info.orig_file_name);
+  mv_begin (&current_stat_info);
 
   skip_member ();
 
-  if (multi_volume_option)
-    assign_string (&save_name, 0);
+  mv_end ();
 }
 
 /* Check header checksum */
@@ -400,6 +398,7 @@ read_header (bool raw_extended_headers)
            {
              xheader_read (header, OFF_FROM_HEADER (header->header.size));
              xheader_decode_global ();
+             xheader_destroy (&extended_header);
            }
 
          /* Loop!  */
@@ -1269,25 +1268,19 @@ skip_file (off_t size)
 {
   union block *x;
 
-  if (multi_volume_option)
-    {
-      save_totsize = size;
-      save_sizeleft = size;
-    }
+  /* FIXME: Make sure mv_begin is always called before it */
 
   if (seekable_archive)
     {
       off_t nblk = seek_archive (size);
       if (nblk >= 0)
-       {
-         size -= nblk * BLOCKSIZE;
-         if (multi_volume_option) /* Argh.. */
-           save_sizeleft -= nblk * BLOCKSIZE;
-       }
+       size -= nblk * BLOCKSIZE;
       else
        seekable_archive = false;
     }
 
+  mv_size_left (size);
+  
   while (size > 0)
     {
       x = find_next_block ();
@@ -1296,8 +1289,7 @@ skip_file (off_t size)
 
       set_next_block_after (x);
       size -= BLOCKSIZE;
-      if (multi_volume_option)
-       save_sizeleft -= BLOCKSIZE;
+      mv_size_left (size);
     }
 }
 
@@ -1309,10 +1301,12 @@ skip_member (void)
   char save_typeflag = current_header->header.typeflag;
   set_next_block_after (current_header);
 
-  assign_string (&save_name, current_stat_info.orig_file_name);
+  mv_begin (&current_stat_info);
 
   if (current_stat_info.is_sparse)
     sparse_skip_file (&current_stat_info);
   else if (save_typeflag != DIRTYPE)
     skip_file (current_stat_info.stat.st_size);
+
+  mv_end ();
 }
This page took 0.041373 seconds and 4 git commands to generate.