瀏覽代碼

(update_archive): Remove call to name_expand; had no effect.
Use chdir_do to change into directory.
Use deref_stat instead of stat.
Use add_avoided_name to mark names to be avoided; the old method of
setting a bit with the name caused all descendants of that name to
be avoided, in some circumstances.

Paul Eggert 25 年之前
父節點
當前提交
e6d8e9279f
共有 1 個文件被更改,包括 7 次插入9 次删除
  1. 7 9
      src/update.c

+ 7 - 9
src/update.c

@@ -1,5 +1,5 @@
 /* Update a tar archive.
-   Copyright (C) 1988, 1992, 1994, 1996, 1997 Free Software Foundation, Inc.
+   Copyright 1988, 1992, 1994, 1996, 1997, 1999 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
@@ -108,8 +108,6 @@ update_archive (void)
   int found_end = 0;
 
   name_gather ();
-  if (subcommand_option == UPDATE_SUBCOMMAND)
-    name_expand ();
   open_archive (ACCESS_UPDATE);
 
   while (!found_end)
@@ -128,14 +126,14 @@ update_archive (void)
 	    if (subcommand_option == UPDATE_SUBCOMMAND
 		&& (name = name_scan (current_file_name), name))
 	      {
-		struct stat stat_data;
+		struct stat s;
 		enum archive_format unused;
 
 		decode_header (current_header, &current_stat, &unused, 0);
-		if (stat (current_file_name, &stat_data) < 0)
-		  ERROR ((0, errno, _("Cannot stat %s"), current_file_name));
-		else if (current_stat.st_mtime >= stat_data.st_mtime)
-		  name->found = 1;
+		chdir_do (name->change_dir);
+		if (deref_stat (dereference_option, current_file_name, &s) == 0
+		    && s.st_mtime <= current_stat.st_mtime)
+		  add_avoided_name (current_file_name);
 	      }
 	    set_next_block_after (current_header);
 	    if (current_header->oldgnu_header.isextended)
@@ -194,7 +192,7 @@ update_archive (void)
 	if (subcommand_option == CAT_SUBCOMMAND)
 	  append_file (path);
 	else
-	  dump_file (path, (dev_t) -1, 1);
+	  dump_file (path, (dev_t) 0, 1);
       }
   }