]> Dogcows Code - chaz/tar/blobdiff - src/update.c
Update THANKS
[chaz/tar] / src / update.c
index 1806fcfafe4a67a33be7c730c3ca28029c8b13e1..b0151759d9b0430b34086d013a29efae722d99ce 100644 (file)
@@ -1,11 +1,11 @@
 /* Update a tar archive.
 
    Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
 /* Update a tar archive.
 
    Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
-   2004, 2005 Free Software Foundation, Inc.
+   2004, 2005, 2007, 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
@@ -110,11 +110,13 @@ update_archive (void)
 
   name_gather ();
   open_archive (ACCESS_UPDATE);
 
   name_gather ();
   open_archive (ACCESS_UPDATE);
-  xheader_write_global ();
+  buffer_write_global_xheader ();
 
   while (!found_end)
     {
 
   while (!found_end)
     {
-      enum read_header status = read_header (false);
+      enum read_header status = read_header (&current_header, 
+                                             &current_stat_info, 
+                                             read_header_auto);
 
       switch (status)
        {
 
       switch (status)
        {
@@ -131,19 +133,41 @@ update_archive (void)
            archive_format = current_format;
 
            if (subcommand_option == UPDATE_SUBCOMMAND
            archive_format = current_format;
 
            if (subcommand_option == UPDATE_SUBCOMMAND
-               && (name = name_scan (current_stat_info.file_name, false)) != NULL)
+               && (name = name_scan (current_stat_info.file_name)) != NULL)
              {
                struct stat s;
 
                chdir_do (name->change_dir);
                if (deref_stat (dereference_option,
              {
                struct stat s;
 
                chdir_do (name->change_dir);
                if (deref_stat (dereference_option,
-                               current_stat_info.file_name, &s) == 0
-                   && (tar_timespec_cmp (get_stat_mtime (&s),
-                                         current_stat_info.mtime)
-                       <= 0))
-                 add_avoided_name (current_stat_info.file_name);
+                               current_stat_info.file_name, &s) == 0)
+                 {
+                   if (S_ISDIR (s.st_mode))
+                     {
+                       char *p, *dirp;
+                       dirp = savedir (name->name);
+                       if (!dirp)
+                         savedir_error (name->name);
+                       else
+                         {
+                           namebuf_t nbuf = namebuf_create (name->name);
+                           
+                           for (p = dirp; *p; p += strlen (p) + 1)
+                             addname (namebuf_name (nbuf, p),
+                                      0, false, NULL);
+                           
+                           namebuf_free (nbuf);
+                           free (dirp);
+                           
+                           remname (name);
+                         }
+                     }
+                   else if (tar_timespec_cmp (get_stat_mtime (&s),
+                                              current_stat_info.mtime)
+                            <= 0)
+                     remname (name);
+                 }
              }
              }
-
+           
            skip_member ();
            break;
          }
            skip_member ();
            break;
          }
@@ -181,7 +205,6 @@ update_archive (void)
        }
 
       tar_stat_destroy (&current_stat_info);
        }
 
       tar_stat_destroy (&current_stat_info);
-      xheader_destroy (&extended_header);
       previous_status = status;
     }
 
       previous_status = status;
     }
 
@@ -190,10 +213,10 @@ update_archive (void)
   output_start = current_block->buffer;
 
   {
   output_start = current_block->buffer;
 
   {
-    char *file_name;
-
-    while ((file_name = name_from_list ()) != NULL)
+    struct name const *p;
+    while ((p = name_from_list ()) != NULL)
       {
       {
+       char *file_name = p->name;
        if (excluded_name (file_name))
          continue;
        if (interactive_option && !confirm ("add", file_name))
        if (excluded_name (file_name))
          continue;
        if (interactive_option && !confirm ("add", file_name))
This page took 0.022648 seconds and 4 git commands to generate.