소스 검색

(print_total_written): Adjust to new human.h interface.
(child_open_for_compress): Do not increase size to BLOCKSIZE.
(open_archive): Open index file name.
Strip trailng slahes from file names.
(flush_write): Set size to 0 if not saving names.
(flush_write, flush_read): Use safer_name_suffix rather than
inline code.

Paul Eggert 22 년 전
부모
커밋
664f2dbdd9
1개의 변경된 파일32개의 추가작업 그리고 41개의 파일을 삭제
  1. 32 41
      src/buffer.c

+ 32 - 41
src/buffer.c

@@ -1,7 +1,7 @@
 /* Buffer management for tar.
 
-   Copyright 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001 Free
-   Software Foundation, Inc.
+   Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
+   2003 Free Software Foundation, Inc.
 
    Written by John Gilmore, on 1985-08-25.
 
@@ -66,14 +66,13 @@ static struct stat archive_stat; /* stat block for archive file */
 
 static off_t record_start_block; /* block ordinal at record_start */
 
-/* Where we write list messages (not errors, not interactions) to.  Stdout
-   unless we're writing a pipe, in which case stderr.  */
+/* Where we write list messages (not errors, not interactions) to.  */
 FILE *stdlis;
 
-static void backspace_output PARAMS ((void));
-static int new_volume PARAMS ((enum access_mode));
-static void archive_write_error PARAMS ((ssize_t)) __attribute__ ((noreturn));
-static void archive_read_error PARAMS ((void));
+static void backspace_output (void);
+static int new_volume (enum access_mode);
+static void archive_write_error (ssize_t) __attribute__ ((noreturn));
+static void archive_read_error (void);
 
 #if !MSDOS
 /* Obnoxious test to see if dimwit is trying to dump the archive.  */
@@ -137,6 +136,7 @@ print_total_written (void)
   char abbr[LONGEST_HUMAN_READABLE + 1];
   char rate[LONGEST_HUMAN_READABLE + 1];
   double seconds;
+  int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
 
 #if HAVE_CLOCK_GETTIME
   struct timespec now;
@@ -150,10 +150,10 @@ print_total_written (void)
   sprintf (bytes, TARLONG_FORMAT, written);
 
   /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*".  */
-  fprintf (stderr, _("Total bytes written: %s (%sB, %sB/s)\n"), bytes,
-	   human_readable ((uintmax_t) written, abbr, 1, -1024),
+  fprintf (stderr, _("Total bytes written: %s (%s, %s/s)\n"), bytes,
+	   human_readable (written, abbr, human_opts, 1, 1),
 	   (0 < seconds && written / seconds < (uintmax_t) -1
-	    ? human_readable ((uintmax_t) (written / seconds), rate, 1, -1024)
+	    ? human_readable (written / seconds, rate, human_opts, 1, 1)
 	    : "?"));
 }
 
@@ -419,8 +419,6 @@ child_open_for_compress (void)
 	{
 	  size_t size = record_size - length;
 
-	  if (size < BLOCKSIZE)
-	    size = BLOCKSIZE;
 	  status = safe_read (STDIN_FILENO, cursor, size);
 	  if (status <= 0)
 	    break;
@@ -656,7 +654,14 @@ open_archive (enum access_mode wanted_access)
 {
   int backed_up_flag = 0;
 
-  stdlis = to_stdout_option ? stderr : stdout;
+  if (index_file_name)
+    {
+      stdlis = fopen (index_file_name, "w");
+      if (! stdlis)
+	open_error (index_file_name);
+    }
+  else
+    stdlis = to_stdout_option ? stderr : stdout;
 
   if (record_size == 0)
     FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
@@ -841,10 +846,11 @@ open_archive (enum access_mode wanted_access)
 	    strcpy (record_start->header.name, volume_label_option);
 
 	  assign_string (&current_file_name, record_start->header.name);
+	  current_trailing_slash = strip_trailing_slashes (current_file_name);
 
 	  record_start->header.typeflag = GNUTYPE_VOLHDR;
 	  TIME_TO_CHARS (start_time, record_start->header.mtime);
-	  finish_header (record_start);
+	  finish_header (record_start, -1);
 #if 0
 	  current_block++;
 #endif
@@ -885,23 +891,18 @@ flush_write (void)
     {
       if (multi_volume_option)
 	{
-	  char *cursor;
-
-	  if (!save_name)
+	  if (save_name)
+	    {
+	      assign_string (&real_s_name, safer_name_suffix (save_name, 0));
+	      real_s_totsize = save_totsize;
+	      real_s_sizeleft = save_sizeleft;
+	    }
+	  else
 	    {
 	      assign_string (&real_s_name, 0);
 	      real_s_totsize = 0;
 	      real_s_sizeleft = 0;
-	      return;
 	    }
-
-	  cursor = save_name + FILESYSTEM_PREFIX_LEN (save_name);
-	  while (ISSLASH (*cursor))
-	    cursor++;
-
-	  assign_string (&real_s_name, cursor);
-	  real_s_totsize = save_totsize;
-	  real_s_sizeleft = save_sizeleft;
 	}
       return;
     }
@@ -941,7 +942,7 @@ flush_write (void)
 	       volume_label_option, volno);
       TIME_TO_CHARS (start_time, record_start->header.mtime);
       record_start->header.typeflag = GNUTYPE_VOLHDR;
-      finish_header (record_start);
+      finish_header (record_start, -1);
     }
 
   if (real_s_name)
@@ -964,7 +965,7 @@ flush_write (void)
 		    record_start->oldgnu_header.offset);
       tmp = verbose_option;
       verbose_option = 0;
-      finish_header (record_start);
+      finish_header (record_start, -1);
       verbose_option = tmp;
 
       if (volume_label_option)
@@ -991,12 +992,7 @@ flush_write (void)
 	assign_string (&real_s_name, 0);
       else
 	{
-	  char *cursor = save_name + FILESYSTEM_PREFIX_LEN (save_name);
-
-	  while (ISSLASH (*cursor))
-	    cursor++;
-
-	  assign_string (&real_s_name, cursor);
+	  assign_string (&real_s_name, safer_name_suffix (save_name, 0));
 	  real_s_sizeleft = save_sizeleft;
 	  real_s_totsize = save_totsize;
 	}
@@ -1068,12 +1064,7 @@ flush_read (void)
     {
       if (save_name)
 	{
-	  char *cursor = save_name + FILESYSTEM_PREFIX_LEN (save_name);
-
-	  while (ISSLASH (*cursor))
-	    cursor++;
-
-	  assign_string (&real_s_name, cursor);
+	  assign_string (&real_s_name, safer_name_suffix (save_name, 0));
 	  real_s_sizeleft = save_sizeleft;
 	  real_s_totsize = save_totsize;
 	}