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 (! memchr (label
->header
.name
, '\0', sizeof label
->header
.name
))
643 if (fnmatch (volume_label_option
, label
->header
.name
, 0) == 0)
646 if (!multi_volume_option
)
649 string
= xmalloc (strlen (volume_label_option
)
650 + sizeof VOLUME_LABEL_APPEND
+ 1);
651 strcpy (string
, volume_label_option
);
652 strcat (string
, VOLUME_LABEL_APPEND
);
653 result
= fnmatch (string
, label
->header
.name
, 0) == 0;
658 /* Open an archive file. The argument specifies whether we are
659 reading or writing, or both. */
661 open_archive (enum access_mode wanted_access
)
663 int backed_up_flag
= 0;
665 stdlis
= to_stdout_option
? stderr
: stdout
;
667 if (record_size
== 0)
668 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
670 if (archive_names
== 0)
671 FATAL_ERROR ((0, 0, _("No archive name given")));
673 current_file_name
= 0;
674 current_link_name
= 0;
678 if (multi_volume_option
)
681 FATAL_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
682 record_start
= valloc (record_size
+ (2 * BLOCKSIZE
));
687 record_start
= valloc (record_size
);
689 FATAL_ERROR ((0, 0, _("Cannot allocate memory for blocking factor %d"),
692 current_block
= record_start
;
693 record_end
= record_start
+ blocking_factor
;
694 /* When updating the archive, we start with reading. */
695 access_mode
= wanted_access
== ACCESS_UPDATE
? ACCESS_READ
: wanted_access
;
697 if (use_compress_program_option
)
699 if (multi_volume_option
)
700 FATAL_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
702 FATAL_ERROR ((0, 0, _("Cannot verify compressed archives")));
704 switch (wanted_access
)
707 child_open_for_uncompress ();
711 child_open_for_compress ();
715 FATAL_ERROR ((0, 0, _("Cannot update compressed archives")));
719 if (wanted_access
== ACCESS_WRITE
720 && strcmp (archive_name_array
[0], "-") == 0)
723 else if (strcmp (archive_name_array
[0], "-") == 0)
725 read_full_records_option
= 1; /* could be a pipe, be safe */
727 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
729 switch (wanted_access
)
732 archive
= STDIN_FILENO
;
736 archive
= STDOUT_FILENO
;
741 archive
= STDIN_FILENO
;
743 write_archive_to_stdout
= 1;
747 else if (verify_option
)
748 archive
= rmtopen (archive_name_array
[0], O_RDWR
| O_CREAT
| O_BINARY
,
749 MODE_RW
, rsh_command_option
);
751 switch (wanted_access
)
754 archive
= rmtopen (archive_name_array
[0], O_RDONLY
| O_BINARY
,
755 MODE_RW
, rsh_command_option
);
761 maybe_backup_file (archive_name_array
[0], 1);
764 archive
= rmtcreat (archive_name_array
[0], MODE_RW
,
769 archive
= rmtopen (archive_name_array
[0], O_RDWR
| O_CREAT
| O_BINARY
,
770 MODE_RW
, rsh_command_option
);
775 || (! _isrmt (archive
) && fstat (archive
, &archive_stat
) < 0))
777 int saved_errno
= errno
;
782 open_fatal (archive_name_array
[0]);
787 /* Detect if outputting to "/dev/null". */
789 static char const dev_null
[] = "/dev/null";
790 struct stat dev_null_stat
;
793 (strcmp (archive_name_array
[0], dev_null
) == 0
794 || (! _isrmt (archive
)
795 && S_ISCHR (archive_stat
.st_mode
)
796 && stat (dev_null
, &dev_null_stat
) == 0
797 && archive_stat
.st_dev
== dev_null_stat
.st_dev
798 && archive_stat
.st_ino
== dev_null_stat
.st_ino
));
801 if (!_isrmt (archive
) && S_ISREG (archive_stat
.st_mode
))
803 ar_dev
= archive_stat
.st_dev
;
804 ar_ino
= archive_stat
.st_ino
;
809 #endif /* not MSDOS */
812 setmode (archive
, O_BINARY
);
815 switch (wanted_access
)
819 record_end
= record_start
; /* set up for 1st record = # 0 */
820 find_next_block (); /* read it in, check for EOF */
822 if (volume_label_option
)
824 union block
*label
= find_next_block ();
827 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
828 quote (volume_label_option
)));
829 if (!check_label_pattern (label
))
830 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
831 quote_n (0, label
->header
.name
),
832 quote_n (1, volume_label_option
)));
837 if (volume_label_option
)
839 memset (record_start
, 0, BLOCKSIZE
);
840 if (multi_volume_option
)
841 sprintf (record_start
->header
.name
, "%s Volume 1",
842 volume_label_option
);
844 strcpy (record_start
->header
.name
, volume_label_option
);
846 assign_string (¤t_file_name
, record_start
->header
.name
);
848 record_start
->header
.typeflag
= GNUTYPE_VOLHDR
;
849 TIME_TO_CHARS (start_time
, record_start
->header
.mtime
);
850 finish_header (record_start
);
859 /* Perform a write to flush the buffer. */
866 if (checkpoint_option
&& !(++checkpoint
% 10))
867 WARN ((0, 0, _("Write checkpoint %d"), checkpoint
));
869 if (tape_length_option
&& tape_length_option
<= bytes_written
)
874 else if (dev_null_output
)
875 status
= record_size
;
877 status
= write_archive_buffer ();
878 if (status
!= record_size
&& !multi_volume_option
)
879 archive_write_error (status
);
882 bytes_written
+= status
;
884 if (status
== record_size
)
886 if (multi_volume_option
)
892 assign_string (&real_s_name
, 0);
898 cursor
= save_name
+ FILESYSTEM_PREFIX_LEN (save_name
);
899 while (*cursor
== '/')
902 assign_string (&real_s_name
, cursor
);
903 real_s_totsize
= save_totsize
;
904 real_s_sizeleft
= save_sizeleft
;
909 /* We're multivol. Panic if we didn't get the right kind of response. */
911 /* ENXIO is for the UNIX PC. */
912 if (status
< 0 && errno
!= ENOSPC
&& errno
!= EIO
&& errno
!= ENXIO
)
913 archive_write_error (status
);
915 /* If error indicates a short write, we just move to the next tape. */
917 if (!new_volume (ACCESS_WRITE
))
921 prev_written
+= bytes_written
;
924 if (volume_label_option
&& real_s_name
)
929 else if (volume_label_option
|| real_s_name
)
937 if (volume_label_option
)
939 memset (record_start
, 0, BLOCKSIZE
);
940 sprintf (record_start
->header
.name
, "%s Volume %d",
941 volume_label_option
, volno
);
942 TIME_TO_CHARS (start_time
, record_start
->header
.mtime
);
943 record_start
->header
.typeflag
= GNUTYPE_VOLHDR
;
944 finish_header (record_start
);
951 if (volume_label_option
)
954 memset (record_start
, 0, BLOCKSIZE
);
956 /* FIXME: Michael P Urban writes: [a long name file] is being written
957 when a new volume rolls around [...] Looks like the wrong value is
958 being preserved in real_s_name, though. */
960 strcpy (record_start
->header
.name
, real_s_name
);
961 record_start
->header
.typeflag
= GNUTYPE_MULTIVOL
;
962 OFF_TO_CHARS (real_s_sizeleft
, record_start
->header
.size
);
963 OFF_TO_CHARS (real_s_totsize
- real_s_sizeleft
,
964 record_start
->oldgnu_header
.offset
);
965 tmp
= verbose_option
;
967 finish_header (record_start
);
968 verbose_option
= tmp
;
970 if (volume_label_option
)
974 status
= write_archive_buffer ();
975 if (status
!= record_size
)
976 archive_write_error (status
);
978 bytes_written
+= status
;
982 record_start
+= copy_back
;
983 memcpy (current_block
,
984 record_start
+ blocking_factor
- copy_back
,
985 copy_back
* BLOCKSIZE
);
986 current_block
+= copy_back
;
988 if (real_s_sizeleft
>= copy_back
* BLOCKSIZE
)
989 real_s_sizeleft
-= copy_back
* BLOCKSIZE
;
990 else if ((real_s_sizeleft
+ BLOCKSIZE
- 1) / BLOCKSIZE
<= copy_back
)
991 assign_string (&real_s_name
, 0);
994 char *cursor
= save_name
+ FILESYSTEM_PREFIX_LEN (save_name
);
996 while (*cursor
== '/')
999 assign_string (&real_s_name
, cursor
);
1000 real_s_sizeleft
= save_sizeleft
;
1001 real_s_totsize
= save_totsize
;
1007 /* Handle write errors on the archive. Write errors are always fatal.
1008 Hitting the end of a volume does not cause a write error unless the
1009 write was the first record of the volume. */
1011 archive_write_error (ssize_t status
)
1013 /* It might be useful to know how much was written before the error
1018 print_total_written ();
1022 write_fatal_details (*archive_name_cursor
, status
, record_size
);
1025 /* Handle read errors on the archive. If the read should be retried,
1026 return to the caller. */
1028 archive_read_error (void)
1030 read_error (*archive_name_cursor
);
1032 if (record_start_block
== 0)
1033 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
1035 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
1036 then give up on reading the archive. */
1038 if (read_error_count
++ > READ_ERROR_MAX
)
1039 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
1043 /* Perform a read to flush the buffer. */
1047 ssize_t status
; /* result from system call */
1048 size_t left
; /* bytes left */
1049 char *more
; /* pointer to next byte to read */
1051 if (checkpoint_option
&& !(++checkpoint
% 10))
1052 WARN ((0, 0, _("Read checkpoint %d"), checkpoint
));
1054 /* Clear the count of errors. This only applies to a single call to
1057 read_error_count
= 0; /* clear error count */
1059 if (write_archive_to_stdout
&& record_start_block
!= 0)
1061 archive
= STDOUT_FILENO
;
1062 status
= write_archive_buffer ();
1063 archive
= STDIN_FILENO
;
1064 if (status
!= record_size
)
1065 archive_write_error (status
);
1067 if (multi_volume_option
)
1071 char *cursor
= save_name
+ FILESYSTEM_PREFIX_LEN (save_name
);
1073 while (*cursor
== '/')
1076 assign_string (&real_s_name
, cursor
);
1077 real_s_sizeleft
= save_sizeleft
;
1078 real_s_totsize
= save_totsize
;
1082 assign_string (&real_s_name
, 0);
1084 real_s_sizeleft
= 0;
1089 status
= rmtread (archive
, record_start
->buffer
, record_size
);
1090 if (status
== record_size
)
1094 || (status
< 0 && errno
== ENOSPC
)
1095 || (status
> 0 && !read_full_records_option
))
1096 && multi_volume_option
)
1098 union block
*cursor
;
1101 switch (subcommand_option
)
1103 case APPEND_SUBCOMMAND
:
1104 case CAT_SUBCOMMAND
:
1105 case UPDATE_SUBCOMMAND
:
1106 if (!new_volume (ACCESS_UPDATE
))
1111 if (!new_volume (ACCESS_READ
))
1117 status
= rmtread (archive
, record_start
->buffer
, record_size
);
1120 archive_read_error ();
1123 if (status
!= record_size
)
1126 cursor
= record_start
;
1128 if (cursor
->header
.typeflag
== GNUTYPE_VOLHDR
)
1130 if (volume_label_option
)
1132 if (!check_label_pattern (cursor
))
1134 WARN ((0, 0, _("Volume %s does not match %s"),
1135 quote_n (0, cursor
->header
.name
),
1136 quote_n (1, volume_label_option
)));
1143 fprintf (stdlis
, _("Reading %s\n"), quote (cursor
->header
.name
));
1146 else if (volume_label_option
)
1147 WARN ((0, 0, _("WARNING: No volume header")));
1152 if (cursor
->header
.typeflag
!= GNUTYPE_MULTIVOL
1153 || strcmp (cursor
->header
.name
, real_s_name
))
1155 WARN ((0, 0, _("%s is not continued on this volume"),
1156 quote (real_s_name
)));
1161 s1
= UINTMAX_FROM_HEADER (cursor
->header
.size
);
1162 s2
= UINTMAX_FROM_HEADER (cursor
->oldgnu_header
.offset
);
1163 if (real_s_totsize
!= s1
+ s2
|| s1
+ s2
< s2
)
1165 char totsizebuf
[UINTMAX_STRSIZE_BOUND
];
1166 char s1buf
[UINTMAX_STRSIZE_BOUND
];
1167 char s2buf
[UINTMAX_STRSIZE_BOUND
];
1169 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
1170 quote (cursor
->header
.name
),
1171 STRINGIFY_BIGINT (save_totsize
, totsizebuf
),
1172 STRINGIFY_BIGINT (s1
, s1buf
),
1173 STRINGIFY_BIGINT (s2
, s2buf
)));
1178 if (real_s_totsize
- real_s_sizeleft
1179 != OFF_FROM_HEADER (cursor
->oldgnu_header
.offset
))
1181 WARN ((0, 0, _("This volume is out of sequence")));
1188 current_block
= cursor
;
1191 else if (status
< 0)
1193 archive_read_error ();
1194 goto error_loop
; /* try again */
1198 more
= record_start
->buffer
+ status
;
1199 left
= record_size
- status
;
1201 while (left
% BLOCKSIZE
!= 0
1202 || (left
&& status
&& read_full_records_option
))
1205 while ((status
= rmtread (archive
, more
, left
)) < 0)
1206 archive_read_error ();
1210 if (left
% BLOCKSIZE
!= 0)
1211 ERROR ((0, 0, _("%d garbage bytes ignored at end of archive"),
1212 (int) ((record_size
- left
) % BLOCKSIZE
)));
1216 if (! read_full_records_option
)
1217 FATAL_ERROR ((0, 0, _("Unaligned block (%lu bytes) in archive"),
1218 (unsigned long) (record_size
- left
)));
1220 /* User warned us about this. Fix up. */
1226 /* FIXME: for size=0, multi-volume support. On the first record, warn
1227 about the problem. */
1229 if (!read_full_records_option
&& verbose_option
1230 && record_start_block
== 0 && status
> 0)
1231 WARN ((0, 0, _("Record size = %lu blocks"),
1232 (unsigned long) ((record_size
- left
) / BLOCKSIZE
)));
1234 record_end
= record_start
+ (record_size
- left
) / BLOCKSIZE
;
1237 /* Flush the current buffer to/from the archive. */
1239 flush_archive (void)
1241 record_start_block
+= record_end
- record_start
;
1242 current_block
= record_start
;
1243 record_end
= record_start
+ blocking_factor
;
1245 if (access_mode
== ACCESS_READ
&& time_to_start_writing
)
1247 access_mode
= ACCESS_WRITE
;
1248 time_to_start_writing
= 0;
1250 if (file_to_switch_to
>= 0)
1252 if (rmtclose (archive
) != 0)
1253 close_warn (*archive_name_cursor
);
1255 archive
= file_to_switch_to
;
1258 backspace_output ();
1261 switch (access_mode
)
1276 /* Backspace the archive descriptor by one record worth. If it's a
1277 tape, MTIOCTOP will work. If it's something else, try to seek on
1278 it. If we can't seek, we lose! */
1280 backspace_output (void)
1284 struct mtop operation
;
1286 operation
.mt_op
= MTBSR
;
1287 operation
.mt_count
= 1;
1288 if (rmtioctl (archive
, MTIOCTOP
, (char *) &operation
) >= 0)
1290 if (errno
== EIO
&& rmtioctl (archive
, MTIOCTOP
, (char *) &operation
) >= 0)
1296 off_t position
= rmtlseek (archive
, (off_t
) 0, SEEK_CUR
);
1298 /* Seek back to the beginning of this record and start writing there. */
1300 position
-= record_size
;
1303 if (rmtlseek (archive
, position
, SEEK_SET
) != position
)
1305 /* Lseek failed. Try a different method. */
1308 _("Cannot backspace archive file; it may be unreadable without -i")));
1310 /* Replace the first part of the record with NULs. */
1312 if (record_start
->buffer
!= output_start
)
1313 memset (record_start
->buffer
, 0,
1314 output_start
- record_start
->buffer
);
1319 /* Close the archive file. */
1321 close_archive (void)
1323 if (time_to_start_writing
|| access_mode
== ACCESS_WRITE
)
1328 /* Manage to fully drain a pipe we might be reading, so to not break it on
1329 the producer after the EOF block. FIXME: one of these days, GNU tar
1330 might become clever enough to just stop working, once there is no more
1331 work to do, we might have to revise this area in such time. */
1333 if (access_mode
== ACCESS_READ
1334 && ! _isrmt (archive
)
1335 && S_ISFIFO (archive_stat
.st_mode
))
1336 while (rmtread (archive
, record_start
->buffer
, record_size
) > 0)
1343 if (rmtclose (archive
) != 0)
1344 close_warn (*archive_name_cursor
);
1352 while (waitpid (child_pid
, &wait_status
, 0) == -1)
1355 waitpid_error (use_compress_program_option
);
1359 if (WIFSIGNALED (wait_status
))
1360 ERROR ((0, 0, _("Child died with signal %d"),
1361 WTERMSIG (wait_status
)));
1362 else if (WEXITSTATUS (wait_status
) != 0)
1363 ERROR ((0, 0, _("Child returned status %d"),
1364 WEXITSTATUS (wait_status
)));
1368 if (current_file_name
)
1369 free (current_file_name
);
1370 if (current_link_name
)
1371 free (current_link_name
);
1376 free (multi_volume_option
? record_start
- 2 : record_start
);
1379 /* Called to initialize the global volume number. */
1381 init_volume_number (void)
1383 FILE *file
= fopen (volno_file_option
, "r");
1387 if (fscanf (file
, "%d", &global_volno
) != 1
1388 || global_volno
< 0)
1389 FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
1390 quotearg_colon (volno_file_option
)));
1392 read_error (volno_file_option
);
1393 if (fclose (file
) != 0)
1394 close_error (volno_file_option
);
1396 else if (errno
!= ENOENT
)
1397 open_error (volno_file_option
);
1400 /* Called to write out the closing global volume number. */
1402 closeout_volume_number (void)
1404 FILE *file
= fopen (volno_file_option
, "w");
1408 fprintf (file
, "%d\n", global_volno
);
1410 write_error (volno_file_option
);
1411 if (fclose (file
) != 0)
1412 close_error (volno_file_option
);
1415 open_error (volno_file_option
);
1418 /* We've hit the end of the old volume. Close it and open the next one.
1419 Return nonzero on success. */
1421 new_volume (enum access_mode access
)
1423 static FILE *read_file
;
1426 if (!read_file
&& !info_script_option
)
1427 /* FIXME: if fopen is used, it will never be closed. */
1428 read_file
= archive
== STDIN_FILENO
? fopen (TTY_NAME
, "r") : stdin
;
1435 if (rmtclose (archive
) != 0)
1436 close_warn (*archive_name_cursor
);
1439 if (global_volno
< 0)
1440 FATAL_ERROR ((0, 0, _("Volume number overflow")));
1442 archive_name_cursor
++;
1443 if (archive_name_cursor
== archive_name_array
+ archive_names
)
1445 archive_name_cursor
= archive_name_array
;
1452 /* We have to prompt from now on. */
1454 if (info_script_option
)
1456 if (volno_file_option
)
1457 closeout_volume_number ();
1458 system (info_script_option
);
1463 char input_buffer
[80];
1465 fputc ('\007', stderr
);
1467 _("Prepare volume #%d for %s and hit return: "),
1468 global_volno
, quote (*archive_name_cursor
));
1471 if (fgets (input_buffer
, sizeof input_buffer
, read_file
) == 0)
1473 WARN ((0, 0, _("EOF where user reply was expected")));
1475 if (subcommand_option
!= EXTRACT_SUBCOMMAND
1476 && subcommand_option
!= LIST_SUBCOMMAND
1477 && subcommand_option
!= DIFF_SUBCOMMAND
)
1478 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1482 if (input_buffer
[0] == '\n'
1483 || input_buffer
[0] == 'y'
1484 || input_buffer
[0] == 'Y')
1487 switch (input_buffer
[0])
1491 fprintf (stderr
, _("\
1492 n [name] Give a new file name for the next (and subsequent) volume(s)\n\
1494 ! Spawn a subshell\n\
1495 ? Print this list\n"));
1502 WARN ((0, 0, _("No new volume; exiting.\n")));
1504 if (subcommand_option
!= EXTRACT_SUBCOMMAND
1505 && subcommand_option
!= LIST_SUBCOMMAND
1506 && subcommand_option
!= DIFF_SUBCOMMAND
)
1507 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1512 /* Get new file name. */
1515 char *name
= &input_buffer
[1];
1518 while (*name
== ' ' || *name
== '\t')
1521 while (*cursor
&& *cursor
!= '\n')
1525 /* FIXME: the following allocation is never reclaimed. */
1526 *archive_name_cursor
= xstrdup (name
);
1532 spawnl (P_WAIT
, getenv ("COMSPEC"), "-", 0);
1533 #else /* not MSDOS */
1536 const char *shell
= getenv ("SHELL");
1542 execlp (shell
, "-sh", "-i", 0);
1548 while (waitpid (child
, &wait_status
, 0) == -1)
1551 waitpid_error (shell
);
1556 #endif /* not MSDOS */
1563 archive
= rmtopen (*archive_name_cursor
, O_RDWR
| O_CREAT
, MODE_RW
,
1564 rsh_command_option
);
1569 archive
= rmtopen (*archive_name_cursor
, O_RDONLY
, MODE_RW
,
1570 rsh_command_option
);
1575 maybe_backup_file (*archive_name_cursor
, 1);
1576 archive
= rmtcreat (*archive_name_cursor
, MODE_RW
,
1577 rsh_command_option
);
1581 archive
= rmtopen (*archive_name_cursor
, O_RDWR
| O_CREAT
, MODE_RW
,
1582 rsh_command_option
);
1588 open_warn (*archive_name_cursor
);
1589 if (!verify_option
&& access
== ACCESS_WRITE
&& backup_option
)
1590 undo_last_backup ();
1595 setmode (archive
, O_BINARY
);