]> Dogcows Code - chaz/tar/blobdiff - src/delete.c
tar: optimize -c --sparse when file is entirely sparse
[chaz/tar] / src / delete.c
index e369a7af7efbbfd06f8fad57b991c18e0c85ac14..a0a6d67c0b76033b09761fc7ad33ae1b741910c3 100644 (file)
@@ -1,11 +1,11 @@
 /* Delete entries from a tar archive.
 
    Copyright (C) 1988, 1992, 1994, 1996, 1997, 2000, 2001, 2003, 2004,
 /* Delete entries from a tar archive.
 
    Copyright (C) 1988, 1992, 1994, 1996, 1997, 2000, 2001, 2003, 2004,
-   2005, 2006 Free Software Foundation, Inc.
+   2005, 2006, 2010 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
 
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2, or (at your option) any later
+   Free Software Foundation; either version 3, or (at your option) any later
    version.
 
    This program is distributed in the hope that it will be useful, but
    version.
 
    This program is distributed in the hope that it will be useful, but
@@ -35,7 +35,6 @@ extern union block *current_block;
 extern union block *recent_long_name;
 extern union block *recent_long_link;
 extern off_t records_read;
 extern union block *recent_long_name;
 extern union block *recent_long_link;
 extern off_t records_read;
-extern off_t records_written;
 
 /* The number of records skipped at the start of the archive, when
    passing over members that are not deleted.  */
 
 /* The number of records skipped at the start of the archive, when
    passing over members that are not deleted.  */
@@ -166,7 +165,9 @@ delete_archive_members (void)
 
   do
     {
 
   do
     {
-      enum read_header status = read_header (true);
+      enum read_header status = read_header (&current_header,
+                                             &current_stat_info,
+                                             read_header_x_raw);
 
       switch (status)
        {
 
       switch (status)
        {
@@ -174,7 +175,7 @@ delete_archive_members (void)
          abort ();
 
        case HEADER_SUCCESS:
          abort ();
 
        case HEADER_SUCCESS:
-         if ((name = name_scan (current_stat_info.file_name, false)) == NULL)
+         if ((name = name_scan (current_stat_info.file_name)) == NULL)
            {
              skip_member ();
              break;
            {
              skip_member ();
              break;
@@ -261,7 +262,8 @@ delete_archive_members (void)
 
          if (current_block == record_end)
            flush_archive ();
 
          if (current_block == record_end)
            flush_archive ();
-         status = read_header (false);
+         status = read_header (&current_header, &current_stat_info,
+                               read_header_auto);
 
          xheader_decode (&current_stat_info);
 
 
          xheader_decode (&current_stat_info);
 
@@ -285,7 +287,7 @@ delete_archive_members (void)
 
          /* Found another header.  */
 
 
          /* Found another header.  */
 
-         if ((name = name_scan (current_stat_info.file_name, false)) != NULL)
+         if ((name = name_scan (current_stat_info.file_name)) != NULL)
            {
              name->found_count++;
              if (ISFOUND(name))
            {
              name->found_count++;
              if (ISFOUND(name))
@@ -294,7 +296,7 @@ delete_archive_members (void)
                  set_next_block_after (current_header);
                  blocks_to_skip = (current_stat_info.stat.st_size
                                    + BLOCKSIZE - 1) / BLOCKSIZE;
                  set_next_block_after (current_header);
                  blocks_to_skip = (current_stat_info.stat.st_size
                                    + BLOCKSIZE - 1) / BLOCKSIZE;
-                 
+
                  while (record_end - current_block <= blocks_to_skip)
                    {
                      blocks_to_skip -= (record_end - current_block);
                  while (record_end - current_block <= blocks_to_skip)
                    {
                      blocks_to_skip -= (record_end - current_block);
@@ -307,10 +309,10 @@ delete_archive_members (void)
            }
          /* Copy header.  */
 
            }
          /* Copy header.  */
 
-         if (extended_header.size)
+         if (current_stat_info.xhdr.size)
            {
            {
-             write_recent_bytes (extended_header.buffer,
-                                 extended_header.size);
+             write_recent_bytes (current_stat_info.xhdr.buffer,
+                                 current_stat_info.xhdr.size);
            }
          else
            {
            }
          else
            {
This page took 0.024744 seconds and 4 git commands to generate.