4
0
Эх сурвалжийг харах

(read_and): Invoke apply_nonancestor_delayed_set_stat on file names
after handling them.
(list_archive): Use consistent message for unexpected EOF.
Use error message functions to report errors consistently.
(read_header): Use xalloc_die to report memory exhaustion.
Use consistent message for unexpected EOF.
(decode_mode): Remove; moved to misc.c.
(skip_file): Use consistent message for unexpected EOF.
(skip_extended_headers): Likewise.

Paul Eggert 25 жил өмнө
parent
commit
c18999bad5
1 өөрчлөгдсөн 34 нэмэгдсэн , 61 устгасан
  1. 34 61
      src/list.c

+ 34 - 61
src/list.c

@@ -89,43 +89,45 @@ read_and (void (*do_something) ())
 	  /* Valid header.  We should decode next field (mode) first.
 	     Ensure incoming names are null terminated.  */
 
-	  if (!name_match (current_file_name)
+	  if (! name_match (current_file_name)
 	      || (newer_mtime_option != TYPE_MINIMUM (time_t)
-		  /* FIXME: We get mtime now, and again later; this
-		     causes duplicate diagnostics if header.mtime is
-		     bogus.  */
+		  /* FIXME: We get mtime now, and again later; this causes
+		     duplicate diagnostics if header.mtime is bogus.  */
 		  && ((current_stat.st_mtime
 		       = TIME_FROM_HEADER (current_header->header.mtime))
 		      < newer_mtime_option))
 	      || excluded_name (current_file_name))
 	    {
-	      char save_typeflag;
-
-	      if (current_header->header.typeflag == GNUTYPE_VOLHDR
-		  || current_header->header.typeflag == GNUTYPE_MULTIVOL
-		  || current_header->header.typeflag == GNUTYPE_NAMES)
+	      char save_typeflag = current_header->header.typeflag;
+	      switch (save_typeflag)
 		{
-		  (*do_something) ();
-		  continue;
-		}
-	      if (show_omitted_dirs_option
-		  && current_header->header.typeflag == DIRTYPE)
-		WARN ((0, 0, _("Omitting %s"), quote (current_file_name)));
+		case GNUTYPE_VOLHDR:
+		case GNUTYPE_MULTIVOL:
+		case GNUTYPE_NAMES:
+		  break;
+		
+		case DIRTYPE:
+		  if (show_omitted_dirs_option)
+		    WARN ((0, 0, _("%s: Omitting"),
+			   quotearg_colon (current_file_name)));
+		  /* Fall through.  */
+		default:
 
-	      /* Skip past it in the archive.  */
+		  /* Skip past it in the archive.  */
 
-	      save_typeflag = current_header->header.typeflag;
-	      set_next_block_after (current_header);
-	      if (current_header->oldgnu_header.isextended)
-		skip_extended_headers ();
+		  set_next_block_after (current_header);
+		  if (current_header->oldgnu_header.isextended)
+		    skip_extended_headers ();
 
-	      /* Skip to the next header on the archive.  */
+		  /* Skip to the next header on the archive.  */
 
-	      if (save_typeflag != DIRTYPE)
-		skip_file (current_stat.st_size);
-	      continue;
-	    }
+		  if (save_typeflag != DIRTYPE)
+		    skip_file (current_stat.st_size);
+		  continue;
+		}
+	      }
 
+	  apply_nonancestor_delayed_set_stat (current_file_name);
 	  (*do_something) ();
 	  continue;
 
@@ -177,7 +179,7 @@ read_and (void (*do_something) ())
       break;
     }
 
-  apply_delayed_set_stat ("");
+  apply_delayed_set_stat ();
   close_archive ();
   names_notfound ();		/* print names not found */
 }
@@ -217,7 +219,7 @@ list_archive (void)
 	  data_block = find_next_block ();
 	  if (!data_block)
 	    {
-	      ERROR ((0, 0, _("EOF in archive file")));
+	      ERROR ((0, 0, _("Unexpected EOF in archive")));
 	      break;		/* FIXME: What happens, then?  */
 	    }
 	  written = available_space_after (data_block);
@@ -229,10 +231,7 @@ list_archive (void)
 				(data_block->buffer + written - 1));
 	  if (check != written)
 	    {
-	      int e = errno;
-	      ERROR ((0, e, _("Only wrote %lu of %lu bytes to file %s"),
-		      (unsigned long) check,
-		      (unsigned long) written, quote (current_file_name)));
+	      write_error_details (current_file_name, check, written);
 	      skip_file (size - written);
 	      break;
 	    }
@@ -359,7 +358,7 @@ read_header (void)
 	    free (*longp);
 	  size = current_stat.st_size;
 	  if (size != current_stat.st_size)
-	    FATAL_ERROR ((0, 0, _("Memory exhausted")));
+	    xalloc_die ();
 	  bp = *longp = xmalloc (size);
 
 	  for (; size > 0; size -= written)
@@ -367,7 +366,7 @@ read_header (void)
 	      data_block = find_next_block ();
 	      if (! data_block)
 		{
-		  ERROR ((0, 0, _("Unexpected EOF on archive file")));
+		  ERROR ((0, 0, _("Unexpected EOF in archive")));
 		  break;
 		}
 	      written = available_space_after (data_block);
@@ -868,32 +867,6 @@ tartime (time_t t)
   return p;
 }
 
-/*-------------------------------------------------------------------------.
-| Decode MODE from its binary form in a stat structure, and encode it into |
-| a 9 characters string STRING, terminated with a NUL.                     |
-`-------------------------------------------------------------------------*/
-
-static void
-decode_mode (mode_t mode, char *string)
-{
-  *string++ = mode & S_IRUSR ? 'r' : '-';
-  *string++ = mode & S_IWUSR ? 'w' : '-';
-  *string++ = (mode & S_ISUID
-	       ? (mode & S_IXUSR ? 's' : 'S')
-	       : (mode & S_IXUSR ? 'x' : '-'));
-  *string++ = mode & S_IRGRP ? 'r' : '-';
-  *string++ = mode & S_IWGRP ? 'w' : '-';
-  *string++ = (mode & S_ISGID
-	       ? (mode & S_IXGRP ? 's' : 'S')
-	       : (mode & S_IXGRP ? 'x' : '-'));
-  *string++ = mode & S_IROTH ? 'r' : '-';
-  *string++ = mode & S_IWOTH ? 'w' : '-';
-  *string++ = (mode & S_ISVTX
-	       ? (mode & S_IXOTH ? 't' : 'T')
-	       : (mode & S_IXOTH ? 'x' : '-'));
-  *string = '\0';
-}
-
 /*-------------------------------------------------------------------------.
 | Actually print it.							   |
 | 									   |
@@ -1153,7 +1126,7 @@ skip_file (off_t size)
     {
       x = find_next_block ();
       if (! x)
-	FATAL_ERROR ((0, 0, _("Unexpected EOF on archive file")));
+	FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
 
       set_next_block_after (x);
       size -= BLOCKSIZE;
@@ -1175,7 +1148,7 @@ skip_extended_headers (void)
     {
       exhdr = find_next_block ();
       if (!exhdr)
-	FATAL_ERROR ((0, 0, _("Unexpected EOF on archive file")));
+	FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
       set_next_block_after (exhdr);
     }
   while (exhdr->sparse_header.isextended);