1 /* Buffer management for tar.
2 Copyright 1988, 92, 93, 94, 96, 97, 99, 2000 Free Software Foundation, Inc.
3 Written by John Gilmore, on 1985-08-25.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any later
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
13 Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
32 # include <sys/inode.h>
42 #define PREAD 0 /* read file descriptor from pipe() */
43 #define PWRITE 1 /* write file descriptor from pipe() */
45 /* Number of retries before giving up on read. */
46 #define READ_ERROR_MAX 10
48 /* Globbing pattern to append to volume label if initial match failed. */
49 #define VOLUME_LABEL_APPEND " Volume [1-9]*"
53 static tarlong prev_written
; /* bytes written on previous volumes */
54 static tarlong bytes_written
; /* bytes written on this volume */
56 /* FIXME: The following four variables should ideally be static to this
57 module. However, this cannot be done yet, as update.c uses the first
58 three a lot, and compare.c uses the fourth. The cleanup continues! */
60 union block
*record_start
; /* start of record of archive */
61 union block
*record_end
; /* last+1 block of archive record */
62 union block
*current_block
; /* current block of archive */
63 enum access_mode access_mode
; /* how do we handle the archive */
64 static struct stat archive_stat
; /* stat block for archive file */
66 static off_t record_start_block
; /* block ordinal at record_start */
68 /* Where we write list messages (not errors, not interactions) to. Stdout
69 unless we're writing a pipe, in which case stderr. */
72 static void backspace_output
PARAMS ((void));
73 static int new_volume
PARAMS ((enum access_mode
));
74 static void archive_write_error
PARAMS ((ssize_t
)) __attribute__ ((noreturn
));
75 static void archive_read_error
PARAMS ((void));
78 /* Obnoxious test to see if dimwit is trying to dump the archive. */
83 /* PID of child program, if compress_option or remote archive access. */
84 static pid_t child_pid
;
86 /* Error recovery stuff */
87 static int read_error_count
;
89 /* Have we hit EOF yet? */
92 /* Checkpointing counter */
93 static int checkpoint
;
95 /* We're reading, but we just read the last block and its time to update. */
96 /* As least EXTERN like this one as possible. FIXME! */
97 extern int time_to_start_writing
;
99 int file_to_switch_to
= -1; /* if remote update, close archive, and use
100 this descriptor to write to */
102 static int volno
= 1; /* which volume of a multi-volume tape we're
104 static int global_volno
= 1; /* volume number to print in external
107 /* The pointer save_name, which is set in function dump_file() of module
108 create.c, points to the original long filename instead of the new,
109 shorter mangled name that is set in start_header() of module create.c.
110 The pointer save_name is only used in multi-volume mode when the file
111 being processed is non-sparse; if a file is split between volumes, the
112 save_name is used in generating the LF_MULTIVOL record on the second
113 volume. (From Pierce Cantrell, 1991-08-13.) */
115 char *save_name
; /* name of the file we are currently writing */
116 off_t save_totsize
; /* total size of file we are writing, only
117 valid if save_name is nonzero */
118 off_t save_sizeleft
; /* where we are in the file we are writing,
119 only valid if save_name is nonzero */
121 int write_archive_to_stdout
;
123 /* Used by flush_read and flush_write to store the real info about saved
125 static char *real_s_name
;
126 static off_t real_s_totsize
;
127 static off_t real_s_sizeleft
;
132 print_total_written (void)
134 tarlong written
= prev_written
+ bytes_written
;
135 char bytes
[sizeof (tarlong
) * CHAR_BIT
];
136 char abbr
[LONGEST_HUMAN_READABLE
+ 1];
137 char rate
[LONGEST_HUMAN_READABLE
+ 1];
140 #if HAVE_CLOCK_GETTIME
142 if (clock_gettime (CLOCK_REALTIME
, &now
) == 0)
143 seconds
= ((now
.tv_sec
- start_timespec
.tv_sec
)
144 + (now
.tv_nsec
- start_timespec
.tv_nsec
) / 1e9
);
147 seconds
= time (0) - start_time
;
149 sprintf (bytes
, TARLONG_FORMAT
, written
);
151 /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */
152 fprintf (stderr
, _("Total bytes written: %s (%sB, %sB/s)\n"), bytes
,
153 human_readable ((uintmax_t) written
, abbr
, 1, -1024),
154 (0 < seconds
&& written
/ seconds
< (uintmax_t) -1
155 ? human_readable ((uintmax_t) (written
/ seconds
), rate
, 1, -1024)
159 /* Compute and return the block ordinal at current_block. */
161 current_block_ordinal (void)
163 return record_start_block
+ (current_block
- record_start
);
166 /* If the EOF flag is set, reset it, as well as current_block, etc. */
173 current_block
= record_start
;
174 record_end
= record_start
+ blocking_factor
;
175 access_mode
= ACCESS_WRITE
;
179 /* Return the location of the next available input or output block.
180 Return zero for EOF. Once we have returned zero, we just keep returning
181 it, to avoid accidentally going on to the next file on the tape. */
183 find_next_block (void)
185 if (current_block
== record_end
)
190 if (current_block
== record_end
)
196 return current_block
;
199 /* Indicate that we have used all blocks up thru BLOCK.
200 FIXME: should the arg have an off-by-1? */
202 set_next_block_after (union block
*block
)
204 while (block
>= current_block
)
207 /* Do *not* flush the archive here. If we do, the same argument to
208 set_next_block_after could mean the next block (if the input record
209 is exactly one block long), which is not what is intended. */
211 if (current_block
> record_end
)
215 /* Return the number of bytes comprising the space between POINTER
216 through the end of the current buffer of blocks. This space is
217 available for filling with data, or taking data from. POINTER is
218 usually (but not always) the result previous find_next_block call. */
220 available_space_after (union block
*pointer
)
222 return record_end
->buffer
- pointer
->buffer
;
225 /* Close file having descriptor FD, and abort if close unsuccessful. */
230 close_error (_("(pipe)"));
233 /* Duplicate file descriptor FROM into becoming INTO.
234 INTO is closed first and has to be the next available slot. */
236 xdup2 (int from
, int into
)
240 int status
= close (into
);
242 if (status
!= 0 && errno
!= EBADF
)
245 FATAL_ERROR ((0, e
, _("Cannot close")));
253 FATAL_ERROR ((0, e
, _("Cannot dup")));
263 /* Set ARCHIVE for writing, then compressing an archive. */
265 child_open_for_compress (void)
267 FATAL_ERROR ((0, 0, _("Cannot use compressed or remote archives")));
270 /* Set ARCHIVE for uncompressing, then reading an archive. */
272 child_open_for_uncompress (void)
274 FATAL_ERROR ((0, 0, _("Cannot use compressed or remote archives")));
277 #else /* not MSDOS */
279 /* Return nonzero if NAME is the name of a regular file, or if the file
280 does not exist (so it would be created as a regular file). */
282 is_regular_file (const char *name
)
286 if (stat (name
, &stbuf
) == 0)
287 return S_ISREG (stbuf
.st_mode
);
289 return errno
== ENOENT
;
293 write_archive_buffer (void)
298 while (0 <= (status
= rmtwrite (archive
, record_start
->buffer
+ written
,
299 record_size
- written
)))
302 if (written
== record_size
303 || _isrmt (archive
) || ! S_ISFIFO (archive_stat
.st_mode
))
307 return written
? written
: status
;
310 /* Set ARCHIVE for writing, then compressing an archive. */
312 child_open_for_compress (void)
316 pid_t grandchild_pid
;
320 child_pid
= xfork ();
324 /* The parent tar is still here! Just clean up. */
326 archive
= parent_pipe
[PWRITE
];
327 xclose (parent_pipe
[PREAD
]);
331 /* The new born child tar is here! */
333 program_name
= _("tar (child)");
335 xdup2 (parent_pipe
[PREAD
], STDIN_FILENO
);
336 xclose (parent_pipe
[PWRITE
]);
338 /* Check if we need a grandchild tar. This happens only if either:
339 a) we are writing stdout: to force reblocking;
340 b) the file is to be accessed by rmt: compressor doesn't know how;
341 c) the file is not a plain file. */
343 if (strcmp (archive_name_array
[0], "-") != 0
344 && !_remdev (archive_name_array
[0])
345 && is_regular_file (archive_name_array
[0]))
348 maybe_backup_file (archive_name_array
[0], 1);
350 /* We don't need a grandchild tar. Open the archive and launch the
353 archive
= creat (archive_name_array
[0], MODE_RW
);
356 int saved_errno
= errno
;
361 open_fatal (archive_name_array
[0]);
363 xdup2 (archive
, STDOUT_FILENO
);
364 execlp (use_compress_program_option
, use_compress_program_option
,
366 exec_fatal (use_compress_program_option
);
369 /* We do need a grandchild tar. */
372 grandchild_pid
= xfork ();
374 if (grandchild_pid
== 0)
376 /* The newborn grandchild tar is here! Launch the compressor. */
378 program_name
= _("tar (grandchild)");
380 xdup2 (child_pipe
[PWRITE
], STDOUT_FILENO
);
381 xclose (child_pipe
[PREAD
]);
382 execlp (use_compress_program_option
, use_compress_program_option
,
384 exec_fatal (use_compress_program_option
);
387 /* The child tar is still here! */
389 /* Prepare for reblocking the data from the compressor into the archive. */
391 xdup2 (child_pipe
[PREAD
], STDIN_FILENO
);
392 xclose (child_pipe
[PWRITE
]);
394 if (strcmp (archive_name_array
[0], "-") == 0)
395 archive
= STDOUT_FILENO
;
398 archive
= rmtcreat (archive_name_array
[0], MODE_RW
, rsh_command_option
);
400 open_fatal (archive_name_array
[0]);
403 /* Let's read out of the stdin pipe and write an archive. */
411 /* Assemble a record. */
413 for (length
= 0, cursor
= record_start
->buffer
;
414 length
< record_size
;
415 length
+= status
, cursor
+= status
)
417 size_t size
= record_size
- length
;
419 if (size
< BLOCKSIZE
)
421 status
= safe_read (STDIN_FILENO
, cursor
, size
);
427 read_fatal (use_compress_program_option
);
429 /* Copy the record. */
433 /* We hit the end of the file. Write last record at
434 full length, as the only role of the grandchild is
435 doing proper reblocking. */
439 memset (record_start
->buffer
+ length
, 0, record_size
- length
);
440 status
= write_archive_buffer ();
441 if (status
!= record_size
)
442 archive_write_error (status
);
445 /* There is nothing else to read, break out. */
449 status
= write_archive_buffer ();
450 if (status
!= record_size
)
451 archive_write_error (status
);
458 /* Propagate any failure of the grandchild back to the parent. */
460 while (waitpid (grandchild_pid
, &wait_status
, 0) == -1)
463 waitpid_error (use_compress_program_option
);
467 if (WIFSIGNALED (wait_status
))
469 kill (child_pid
, WTERMSIG (wait_status
));
470 exit_status
= TAREXIT_FAILURE
;
472 else if (WEXITSTATUS (wait_status
) != 0)
473 exit_status
= WEXITSTATUS (wait_status
);
478 /* Set ARCHIVE for uncompressing, then reading an archive. */
480 child_open_for_uncompress (void)
484 pid_t grandchild_pid
;
488 child_pid
= xfork ();
492 /* The parent tar is still here! Just clean up. */
494 read_full_records_option
= 1;
495 archive
= parent_pipe
[PREAD
];
496 xclose (parent_pipe
[PWRITE
]);
500 /* The newborn child tar is here! */
502 program_name
= _("tar (child)");
504 xdup2 (parent_pipe
[PWRITE
], STDOUT_FILENO
);
505 xclose (parent_pipe
[PREAD
]);
507 /* Check if we need a grandchild tar. This happens only if either:
508 a) we're reading stdin: to force unblocking;
509 b) the file is to be accessed by rmt: compressor doesn't know how;
510 c) the file is not a plain file. */
512 if (strcmp (archive_name_array
[0], "-") != 0
513 && !_remdev (archive_name_array
[0])
514 && is_regular_file (archive_name_array
[0]))
516 /* We don't need a grandchild tar. Open the archive and lauch the
519 archive
= open (archive_name_array
[0], O_RDONLY
| O_BINARY
, MODE_RW
);
521 open_fatal (archive_name_array
[0]);
522 xdup2 (archive
, STDIN_FILENO
);
523 execlp (use_compress_program_option
, use_compress_program_option
,
525 exec_fatal (use_compress_program_option
);
528 /* We do need a grandchild tar. */
531 grandchild_pid
= xfork ();
533 if (grandchild_pid
== 0)
535 /* The newborn grandchild tar is here! Launch the uncompressor. */
537 program_name
= _("tar (grandchild)");
539 xdup2 (child_pipe
[PREAD
], STDIN_FILENO
);
540 xclose (child_pipe
[PWRITE
]);
541 execlp (use_compress_program_option
, use_compress_program_option
,
543 exec_fatal (use_compress_program_option
);
546 /* The child tar is still here! */
548 /* Prepare for unblocking the data from the archive into the
551 xdup2 (child_pipe
[PWRITE
], STDOUT_FILENO
);
552 xclose (child_pipe
[PREAD
]);
554 if (strcmp (archive_name_array
[0], "-") == 0)
555 archive
= STDIN_FILENO
;
557 archive
= rmtopen (archive_name_array
[0], O_RDONLY
| O_BINARY
,
558 MODE_RW
, rsh_command_option
);
560 open_fatal (archive_name_array
[0]);
562 /* Let's read the archive and pipe it into stdout. */
571 read_error_count
= 0;
574 status
= rmtread (archive
, record_start
->buffer
, record_size
);
577 archive_read_error ();
582 cursor
= record_start
->buffer
;
586 count
= maximum
< BLOCKSIZE
? maximum
: BLOCKSIZE
;
587 status
= full_write (STDOUT_FILENO
, cursor
, count
);
589 write_error (use_compress_program_option
);
593 ERROR ((0, 0, _("Write to compression program short %lu bytes"),
594 (unsigned long) (count
- status
)));
603 xclose (STDOUT_FILENO
);
608 /* Propagate any failure of the grandchild back to the parent. */
610 while (waitpid (grandchild_pid
, &wait_status
, 0) == -1)
613 waitpid_error (use_compress_program_option
);
617 if (WIFSIGNALED (wait_status
))
619 kill (child_pid
, WTERMSIG (wait_status
));
620 exit_status
= TAREXIT_FAILURE
;
622 else if (WEXITSTATUS (wait_status
) != 0)
623 exit_status
= WEXITSTATUS (wait_status
);
628 #endif /* not MSDOS */
630 /* Check the LABEL block against the volume label, seen as a globbing
631 pattern. Return true if the pattern matches. In case of failure,
632 retry matching a volume sequence number before giving up in
633 multi-volume mode. */
635 check_label_pattern (union block
*label
)
640 if (fnmatch (volume_label_option
, label
->header
.name
, 0) == 0)
643 if (!multi_volume_option
)
646 string
= xmalloc (strlen (volume_label_option
)
647 + sizeof VOLUME_LABEL_APPEND
+ 1);
648 strcpy (string
, volume_label_option
);
649 strcat (string
, VOLUME_LABEL_APPEND
);
650 result
= fnmatch (string
, label
->header
.name
, 0) == 0;
655 /* Open an archive file. The argument specifies whether we are
656 reading or writing, or both. */
658 open_archive (enum access_mode wanted_access
)
660 int backed_up_flag
= 0;
662 stdlis
= to_stdout_option
? stderr
: stdout
;
664 if (record_size
== 0)
665 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
667 if (archive_names
== 0)
668 FATAL_ERROR ((0, 0, _("No archive name given")));
670 current_file_name
= 0;
671 current_link_name
= 0;
675 if (multi_volume_option
)
678 FATAL_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
679 record_start
= valloc (record_size
+ (2 * BLOCKSIZE
));
684 record_start
= valloc (record_size
);
686 FATAL_ERROR ((0, 0, _("Cannot allocate memory for blocking factor %d"),
689 current_block
= record_start
;
690 record_end
= record_start
+ blocking_factor
;
691 /* When updating the archive, we start with reading. */
692 access_mode
= wanted_access
== ACCESS_UPDATE
? ACCESS_READ
: wanted_access
;
694 if (use_compress_program_option
)
696 if (multi_volume_option
)
697 FATAL_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
699 FATAL_ERROR ((0, 0, _("Cannot verify compressed archives")));
701 switch (wanted_access
)
704 child_open_for_uncompress ();
708 child_open_for_compress ();
712 FATAL_ERROR ((0, 0, _("Cannot update compressed archives")));
716 if (wanted_access
== ACCESS_WRITE
717 && strcmp (archive_name_array
[0], "-") == 0)
720 else if (strcmp (archive_name_array
[0], "-") == 0)
722 read_full_records_option
= 1; /* could be a pipe, be safe */
724 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
726 switch (wanted_access
)
729 archive
= STDIN_FILENO
;
733 archive
= STDOUT_FILENO
;
738 archive
= STDIN_FILENO
;
740 write_archive_to_stdout
= 1;
744 else if (verify_option
)
745 archive
= rmtopen (archive_name_array
[0], O_RDWR
| O_CREAT
| O_BINARY
,
746 MODE_RW
, rsh_command_option
);
748 switch (wanted_access
)
751 archive
= rmtopen (archive_name_array
[0], O_RDONLY
| O_BINARY
,
752 MODE_RW
, rsh_command_option
);
758 maybe_backup_file (archive_name_array
[0], 1);
761 archive
= rmtcreat (archive_name_array
[0], MODE_RW
,
766 archive
= rmtopen (archive_name_array
[0], O_RDWR
| O_CREAT
| O_BINARY
,
767 MODE_RW
, rsh_command_option
);
772 || (! _isrmt (archive
) && fstat (archive
, &archive_stat
) < 0))
774 int saved_errno
= errno
;
779 open_fatal (archive_name_array
[0]);
784 /* Detect if outputting to "/dev/null". */
786 static char const dev_null
[] = "/dev/null";
787 struct stat dev_null_stat
;
790 (strcmp (archive_name_array
[0], dev_null
) == 0
791 || (! _isrmt (archive
)
792 && S_ISCHR (archive_stat
.st_mode
)
793 && stat (dev_null
, &dev_null_stat
) == 0
794 && archive_stat
.st_dev
== dev_null_stat
.st_dev
795 && archive_stat
.st_ino
== dev_null_stat
.st_ino
));
798 if (!_isrmt (archive
) && S_ISREG (archive_stat
.st_mode
))
800 ar_dev
= archive_stat
.st_dev
;
801 ar_ino
= archive_stat
.st_ino
;
806 #endif /* not MSDOS */
809 setmode (archive
, O_BINARY
);
812 switch (wanted_access
)
816 record_end
= record_start
; /* set up for 1st record = # 0 */
817 find_next_block (); /* read it in, check for EOF */
819 if (volume_label_option
)
821 union block
*label
= find_next_block ();
824 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
825 quote (volume_label_option
)));
826 if (!check_label_pattern (label
))
827 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
828 quote_n (0, label
->header
.name
),
829 quote_n (1, volume_label_option
)));
834 if (volume_label_option
)
836 memset (record_start
, 0, BLOCKSIZE
);
837 if (multi_volume_option
)
838 sprintf (record_start
->header
.name
, "%s Volume 1",
839 volume_label_option
);
841 strcpy (record_start
->header
.name
, volume_label_option
);
843 assign_string (¤t_file_name
, record_start
->header
.name
);
845 record_start
->header
.typeflag
= GNUTYPE_VOLHDR
;
846 TIME_TO_CHARS (start_time
, record_start
->header
.mtime
);
847 finish_header (record_start
);
856 /* Perform a write to flush the buffer. */
863 if (checkpoint_option
&& !(++checkpoint
% 10))
864 WARN ((0, 0, _("Write checkpoint %d"), checkpoint
));
866 if (tape_length_option
&& tape_length_option
<= bytes_written
)
871 else if (dev_null_output
)
872 status
= record_size
;
874 status
= write_archive_buffer ();
875 if (status
!= record_size
&& !multi_volume_option
)
876 archive_write_error (status
);
879 bytes_written
+= status
;
881 if (status
== record_size
)
883 if (multi_volume_option
)
889 assign_string (&real_s_name
, 0);
895 cursor
= save_name
+ FILESYSTEM_PREFIX_LEN (save_name
);
896 while (*cursor
== '/')
899 assign_string (&real_s_name
, cursor
);
900 real_s_totsize
= save_totsize
;
901 real_s_sizeleft
= save_sizeleft
;
906 /* We're multivol. Panic if we didn't get the right kind of response. */
908 /* ENXIO is for the UNIX PC. */
909 if (status
< 0 && errno
!= ENOSPC
&& errno
!= EIO
&& errno
!= ENXIO
)
910 archive_write_error (status
);
912 /* If error indicates a short write, we just move to the next tape. */
914 if (!new_volume (ACCESS_WRITE
))
918 prev_written
+= bytes_written
;
921 if (volume_label_option
&& real_s_name
)
926 else if (volume_label_option
|| real_s_name
)
934 if (volume_label_option
)
936 memset (record_start
, 0, BLOCKSIZE
);
937 sprintf (record_start
->header
.name
, "%s Volume %d",
938 volume_label_option
, volno
);
939 TIME_TO_CHARS (start_time
, record_start
->header
.mtime
);
940 record_start
->header
.typeflag
= GNUTYPE_VOLHDR
;
941 finish_header (record_start
);
948 if (volume_label_option
)
951 memset (record_start
, 0, BLOCKSIZE
);
953 /* FIXME: Michael P Urban writes: [a long name file] is being written
954 when a new volume rolls around [...] Looks like the wrong value is
955 being preserved in real_s_name, though. */
957 strcpy (record_start
->header
.name
, real_s_name
);
958 record_start
->header
.typeflag
= GNUTYPE_MULTIVOL
;
959 OFF_TO_CHARS (real_s_sizeleft
, record_start
->header
.size
);
960 OFF_TO_CHARS (real_s_totsize
- real_s_sizeleft
,
961 record_start
->oldgnu_header
.offset
);
962 tmp
= verbose_option
;
964 finish_header (record_start
);
965 verbose_option
= tmp
;
967 if (volume_label_option
)
971 status
= write_archive_buffer ();
972 if (status
!= record_size
)
973 archive_write_error (status
);
975 bytes_written
+= status
;
979 record_start
+= copy_back
;
980 memcpy (current_block
,
981 record_start
+ blocking_factor
- copy_back
,
982 copy_back
* BLOCKSIZE
);
983 current_block
+= copy_back
;
985 if (real_s_sizeleft
>= copy_back
* BLOCKSIZE
)
986 real_s_sizeleft
-= copy_back
* BLOCKSIZE
;
987 else if ((real_s_sizeleft
+ BLOCKSIZE
- 1) / BLOCKSIZE
<= copy_back
)
988 assign_string (&real_s_name
, 0);
991 char *cursor
= save_name
+ FILESYSTEM_PREFIX_LEN (save_name
);
993 while (*cursor
== '/')
996 assign_string (&real_s_name
, cursor
);
997 real_s_sizeleft
= save_sizeleft
;
998 real_s_totsize
= save_totsize
;
1004 /* Handle write errors on the archive. Write errors are always fatal.
1005 Hitting the end of a volume does not cause a write error unless the
1006 write was the first record of the volume. */
1008 archive_write_error (ssize_t status
)
1010 /* It might be useful to know how much was written before the error
1015 print_total_written ();
1019 write_fatal_details (*archive_name_cursor
, status
, record_size
);
1022 /* Handle read errors on the archive. If the read should be retried,
1023 return to the caller. */
1025 archive_read_error (void)
1027 read_error (*archive_name_cursor
);
1029 if (record_start_block
== 0)
1030 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
1032 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
1033 then give up on reading the archive. */
1035 if (read_error_count
++ > READ_ERROR_MAX
)
1036 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
1040 /* Perform a read to flush the buffer. */
1044 ssize_t status
; /* result from system call */
1045 size_t left
; /* bytes left */
1046 char *more
; /* pointer to next byte to read */
1048 if (checkpoint_option
&& !(++checkpoint
% 10))
1049 WARN ((0, 0, _("Read checkpoint %d"), checkpoint
));
1051 /* Clear the count of errors. This only applies to a single call to
1054 read_error_count
= 0; /* clear error count */
1056 if (write_archive_to_stdout
&& record_start_block
!= 0)
1058 archive
= STDOUT_FILENO
;
1059 status
= write_archive_buffer ();
1060 archive
= STDIN_FILENO
;
1061 if (status
!= record_size
)
1062 archive_write_error (status
);
1064 if (multi_volume_option
)
1068 char *cursor
= save_name
+ FILESYSTEM_PREFIX_LEN (save_name
);
1070 while (*cursor
== '/')
1073 assign_string (&real_s_name
, cursor
);
1074 real_s_sizeleft
= save_sizeleft
;
1075 real_s_totsize
= save_totsize
;
1079 assign_string (&real_s_name
, 0);
1081 real_s_sizeleft
= 0;
1086 status
= rmtread (archive
, record_start
->buffer
, record_size
);
1087 if (status
== record_size
)
1091 || (status
< 0 && errno
== ENOSPC
)
1092 || (status
> 0 && !read_full_records_option
))
1093 && multi_volume_option
)
1095 union block
*cursor
;
1098 switch (subcommand_option
)
1100 case APPEND_SUBCOMMAND
:
1101 case CAT_SUBCOMMAND
:
1102 case UPDATE_SUBCOMMAND
:
1103 if (!new_volume (ACCESS_UPDATE
))
1108 if (!new_volume (ACCESS_READ
))
1114 status
= rmtread (archive
, record_start
->buffer
, record_size
);
1117 archive_read_error ();
1120 if (status
!= record_size
)
1123 cursor
= record_start
;
1125 if (cursor
->header
.typeflag
== GNUTYPE_VOLHDR
)
1127 if (volume_label_option
)
1129 if (!check_label_pattern (cursor
))
1131 WARN ((0, 0, _("Volume %s does not match %s"),
1132 quote_n (0, cursor
->header
.name
),
1133 quote_n (1, volume_label_option
)));
1140 fprintf (stdlis
, _("Reading %s\n"), quote (cursor
->header
.name
));
1143 else if (volume_label_option
)
1144 WARN ((0, 0, _("WARNING: No volume header")));
1149 if (cursor
->header
.typeflag
!= GNUTYPE_MULTIVOL
1150 || strcmp (cursor
->header
.name
, real_s_name
))
1152 WARN ((0, 0, _("%s is not continued on this volume"),
1153 quote (real_s_name
)));
1158 s1
= UINTMAX_FROM_HEADER (cursor
->header
.size
);
1159 s2
= UINTMAX_FROM_HEADER (cursor
->oldgnu_header
.offset
);
1160 if (real_s_totsize
!= s1
+ s2
|| s1
+ s2
< s2
)
1162 char totsizebuf
[UINTMAX_STRSIZE_BOUND
];
1163 char s1buf
[UINTMAX_STRSIZE_BOUND
];
1164 char s2buf
[UINTMAX_STRSIZE_BOUND
];
1166 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
1167 quote (cursor
->header
.name
),
1168 STRINGIFY_BIGINT (save_totsize
, totsizebuf
),
1169 STRINGIFY_BIGINT (s1
, s1buf
),
1170 STRINGIFY_BIGINT (s2
, s2buf
)));
1175 if (real_s_totsize
- real_s_sizeleft
1176 != OFF_FROM_HEADER (cursor
->oldgnu_header
.offset
))
1178 WARN ((0, 0, _("This volume is out of sequence")));
1185 current_block
= cursor
;
1188 else if (status
< 0)
1190 archive_read_error ();
1191 goto error_loop
; /* try again */
1195 more
= record_start
->buffer
+ status
;
1196 left
= record_size
- status
;
1198 while (left
% BLOCKSIZE
!= 0)
1201 while ((status
= rmtread (archive
, more
, left
)) < 0)
1202 archive_read_error ();
1206 ERROR ((0, 0, _("%d garbage bytes ignored at end of archive"),
1207 (int) ((record_size
- left
) % BLOCKSIZE
)));
1211 if (! read_full_records_option
)
1212 FATAL_ERROR ((0, 0, _("Unaligned block (%lu bytes) in archive"),
1213 (unsigned long) (record_size
- left
)));
1215 /* User warned us about this. Fix up. */
1221 /* FIXME: for size=0, multi-volume support. On the first record, warn
1222 about the problem. */
1224 if (!read_full_records_option
&& verbose_option
1225 && record_start_block
== 0 && status
> 0)
1226 WARN ((0, 0, _("Record size = %lu blocks"),
1227 (unsigned long) ((record_size
- left
) / BLOCKSIZE
)));
1229 record_end
= record_start
+ (record_size
- left
) / BLOCKSIZE
;
1232 /* Flush the current buffer to/from the archive. */
1234 flush_archive (void)
1236 record_start_block
+= record_end
- record_start
;
1237 current_block
= record_start
;
1238 record_end
= record_start
+ blocking_factor
;
1240 if (access_mode
== ACCESS_READ
&& time_to_start_writing
)
1242 access_mode
= ACCESS_WRITE
;
1243 time_to_start_writing
= 0;
1245 if (file_to_switch_to
>= 0)
1247 if (rmtclose (archive
) != 0)
1248 close_warn (*archive_name_cursor
);
1250 archive
= file_to_switch_to
;
1253 backspace_output ();
1256 switch (access_mode
)
1271 /* Backspace the archive descriptor by one record worth. If it's a
1272 tape, MTIOCTOP will work. If it's something else, try to seek on
1273 it. If we can't seek, we lose! */
1275 backspace_output (void)
1279 struct mtop operation
;
1281 operation
.mt_op
= MTBSR
;
1282 operation
.mt_count
= 1;
1283 if (rmtioctl (archive
, MTIOCTOP
, (char *) &operation
) >= 0)
1285 if (errno
== EIO
&& rmtioctl (archive
, MTIOCTOP
, (char *) &operation
) >= 0)
1291 off_t position
= rmtlseek (archive
, (off_t
) 0, SEEK_CUR
);
1293 /* Seek back to the beginning of this record and start writing there. */
1295 position
-= record_size
;
1298 if (rmtlseek (archive
, position
, SEEK_SET
) != position
)
1300 /* Lseek failed. Try a different method. */
1303 _("Cannot backspace archive file; it may be unreadable without -i")));
1305 /* Replace the first part of the record with NULs. */
1307 if (record_start
->buffer
!= output_start
)
1308 memset (record_start
->buffer
, 0,
1309 output_start
- record_start
->buffer
);
1314 /* Close the archive file. */
1316 close_archive (void)
1318 if (time_to_start_writing
|| access_mode
== ACCESS_WRITE
)
1323 /* Manage to fully drain a pipe we might be reading, so to not break it on
1324 the producer after the EOF block. FIXME: one of these days, GNU tar
1325 might become clever enough to just stop working, once there is no more
1326 work to do, we might have to revise this area in such time. */
1328 if (access_mode
== ACCESS_READ
1329 && ! _isrmt (archive
)
1330 && S_ISFIFO (archive_stat
.st_mode
))
1331 while (rmtread (archive
, record_start
->buffer
, record_size
) > 0)
1338 if (rmtclose (archive
) != 0)
1339 close_warn (*archive_name_cursor
);
1347 while (waitpid (child_pid
, &wait_status
, 0) == -1)
1350 waitpid_error (use_compress_program_option
);
1354 if (WIFSIGNALED (wait_status
))
1355 ERROR ((0, 0, _("Child died with signal %d"),
1356 WTERMSIG (wait_status
)));
1357 else if (WEXITSTATUS (wait_status
) != 0)
1358 ERROR ((0, 0, _("Child returned status %d"),
1359 WEXITSTATUS (wait_status
)));
1363 if (current_file_name
)
1364 free (current_file_name
);
1365 if (current_link_name
)
1366 free (current_link_name
);
1371 free (multi_volume_option
? record_start
- 2 : record_start
);
1374 /* Called to initialize the global volume number. */
1376 init_volume_number (void)
1378 FILE *file
= fopen (volno_file_option
, "r");
1382 fscanf (file
, "%d", &global_volno
);
1384 read_error (volno_file_option
);
1385 if (fclose (file
) != 0)
1386 close_error (volno_file_option
);
1388 else if (errno
!= ENOENT
)
1389 open_error (volno_file_option
);
1392 /* Called to write out the closing global volume number. */
1394 closeout_volume_number (void)
1396 FILE *file
= fopen (volno_file_option
, "w");
1400 fprintf (file
, "%d\n", global_volno
);
1402 write_error (volno_file_option
);
1403 if (fclose (file
) != 0)
1404 close_error (volno_file_option
);
1407 open_error (volno_file_option
);
1410 /* We've hit the end of the old volume. Close it and open the next one.
1411 Return nonzero on success. */
1413 new_volume (enum access_mode access
)
1415 static FILE *read_file
;
1418 if (!read_file
&& !info_script_option
)
1419 /* FIXME: if fopen is used, it will never be closed. */
1420 read_file
= archive
== STDIN_FILENO
? fopen (TTY_NAME
, "r") : stdin
;
1427 if (rmtclose (archive
) != 0)
1428 close_warn (*archive_name_cursor
);
1432 archive_name_cursor
++;
1433 if (archive_name_cursor
== archive_name_array
+ archive_names
)
1435 archive_name_cursor
= archive_name_array
;
1442 /* We have to prompt from now on. */
1444 if (info_script_option
)
1446 if (volno_file_option
)
1447 closeout_volume_number ();
1448 system (info_script_option
);
1453 char input_buffer
[80];
1455 fputc ('\007', stderr
);
1457 _("Prepare volume #%d for %s and hit return: "),
1458 global_volno
, quote (*archive_name_cursor
));
1461 if (fgets (input_buffer
, sizeof input_buffer
, read_file
) == 0)
1463 WARN ((0, 0, _("EOF where user reply was expected")));
1465 if (subcommand_option
!= EXTRACT_SUBCOMMAND
1466 && subcommand_option
!= LIST_SUBCOMMAND
1467 && subcommand_option
!= DIFF_SUBCOMMAND
)
1468 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1472 if (input_buffer
[0] == '\n'
1473 || input_buffer
[0] == 'y'
1474 || input_buffer
[0] == 'Y')
1477 switch (input_buffer
[0])
1481 fprintf (stderr
, _("\
1482 n [name] Give a new file name for the next (and subsequent) volume(s)\n\
1484 ! Spawn a subshell\n\
1485 ? Print this list\n"));
1492 WARN ((0, 0, _("No new volume; exiting.\n")));
1494 if (subcommand_option
!= EXTRACT_SUBCOMMAND
1495 && subcommand_option
!= LIST_SUBCOMMAND
1496 && subcommand_option
!= DIFF_SUBCOMMAND
)
1497 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1502 /* Get new file name. */
1505 char *name
= &input_buffer
[1];
1508 while (*name
== ' ' || *name
== '\t')
1511 while (*cursor
&& *cursor
!= '\n')
1515 /* FIXME: the following allocation is never reclaimed. */
1516 *archive_name_cursor
= xstrdup (name
);
1522 spawnl (P_WAIT
, getenv ("COMSPEC"), "-", 0);
1523 #else /* not MSDOS */
1526 const char *shell
= getenv ("SHELL");
1532 execlp (shell
, "-sh", "-i", 0);
1538 while (waitpid (child
, &wait_status
, 0) == -1)
1541 waitpid_error (shell
);
1546 #endif /* not MSDOS */
1553 archive
= rmtopen (*archive_name_cursor
, O_RDWR
| O_CREAT
, MODE_RW
,
1554 rsh_command_option
);
1559 archive
= rmtopen (*archive_name_cursor
, O_RDONLY
, MODE_RW
,
1560 rsh_command_option
);
1565 maybe_backup_file (*archive_name_cursor
, 1);
1566 archive
= rmtcreat (*archive_name_cursor
, MODE_RW
,
1567 rsh_command_option
);
1571 archive
= rmtopen (*archive_name_cursor
, O_RDWR
| O_CREAT
, MODE_RW
,
1572 rsh_command_option
);
1578 open_warn (*archive_name_cursor
);
1579 if (!verify_option
&& access
== ACCESS_WRITE
&& backup_option
)
1580 undo_last_backup ();
1585 setmode (archive
, O_BINARY
);