1 /* Buffer management for tar.
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
7 Written by John Gilmore, on 1985-08-25.
9 This program is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 3, or (at your option) any later
14 This program is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
17 Public License for more details.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
24 #include <system-ioctl.h>
36 /* Number of retries before giving up on read. */
37 #define READ_ERROR_MAX 10
41 static tarlong prev_written
; /* bytes written on previous volumes */
42 static tarlong bytes_written
; /* bytes written on this volume */
43 static void *record_buffer
[2]; /* allocated memory */
44 union block
*record_buffer_aligned
[2];
45 static int record_index
;
47 /* FIXME: The following variables should ideally be static to this
48 module. However, this cannot be done yet. The cleanup continues! */
50 union block
*record_start
; /* start of record of archive */
51 union block
*record_end
; /* last+1 block of archive record */
52 union block
*current_block
; /* current block of archive */
53 enum access_mode access_mode
; /* how do we handle the archive */
54 off_t records_read
; /* number of records read from this archive */
55 off_t records_written
; /* likewise, for records written */
56 extern off_t records_skipped
; /* number of records skipped at the start
57 of the archive, defined in delete.c */
59 static off_t record_start_block
; /* block ordinal at record_start */
61 /* Where we write list messages (not errors, not interactions) to. */
64 static void backspace_output (void);
66 /* PID of child program, if compress_option or remote archive access. */
67 static pid_t child_pid
;
69 /* Error recovery stuff */
70 static int read_error_count
;
72 /* Have we hit EOF yet? */
75 static bool read_full_records
= false;
77 /* We're reading, but we just read the last block and it's time to update.
80 FIXME: Either eliminate it or move it to common.h.
82 extern bool time_to_start_writing
;
84 bool write_archive_to_stdout
;
86 void (*flush_write_ptr
) (size_t);
87 void (*flush_read_ptr
) (void);
91 char *continued_file_name
;
92 uintmax_t continued_file_size
;
93 uintmax_t continued_file_offset
;
96 static int volno
= 1; /* which volume of a multi-volume tape we're
98 static int global_volno
= 1; /* volume number to print in external
101 bool write_archive_to_stdout
;
104 /* Multi-volume tracking support */
106 /* When creating a multi-volume archive, each `bufmap' represents
107 a member stored (perhaps partly) in the current record buffer.
108 After flushing the record to the output media, all bufmaps that
109 represent fully written members are removed from the list, then
110 the sizeleft and start numbers in the remaining bufmaps are updated.
112 When reading from a multi-volume archive, the list degrades to a
113 single element, which keeps information about the member currently
119 struct bufmap
*next
; /* Pointer to the next map entry */
120 size_t start
; /* Offset of the first data block */
121 char *file_name
; /* Name of the stored file */
122 off_t sizetotal
; /* Size of the stored file */
123 off_t sizeleft
; /* Size left to read/write */
125 static struct bufmap
*bufmap_head
, *bufmap_tail
;
127 /* This variable, when set, inhibits updating the bufmap chain after
128 a write. This is necessary when writing extended POSIX headers. */
129 static int inhibit_map
;
132 mv_begin_write (const char *file_name
, off_t totsize
, off_t sizeleft
)
134 if (multi_volume_option
)
136 struct bufmap
*bp
= xmalloc (sizeof bp
[0]);
138 bufmap_tail
->next
= bp
;
144 bp
->start
= current_block
- record_start
;
145 bp
->file_name
= xstrdup (file_name
);
146 bp
->sizetotal
= totsize
;
147 bp
->sizeleft
= sizeleft
;
151 static struct bufmap
*
152 bufmap_locate (size_t off
)
156 for (map
= bufmap_head
; map
; map
= map
->next
)
159 || off
< map
->next
->start
* BLOCKSIZE
)
166 bufmap_free (struct bufmap
*mark
)
169 for (map
= bufmap_head
; map
&& map
!= mark
; )
171 struct bufmap
*next
= map
->next
;
172 free (map
->file_name
);
178 bufmap_tail
= bufmap_head
;
182 bufmap_reset (struct bufmap
*map
, ssize_t fixup
)
187 for (; map
; map
= map
->next
)
193 static struct tar_stat_info dummy
;
196 buffer_write_global_xheader ()
198 xheader_write_global (&dummy
.xhdr
);
202 mv_begin_read (struct tar_stat_info
*st
)
204 mv_begin_write (st
->orig_file_name
, st
->stat
.st_size
, st
->stat
.st_size
);
210 if (multi_volume_option
)
215 mv_size_left (off_t size
)
218 bufmap_head
->sizeleft
= size
;
225 clear_read_error_count (void)
227 read_error_count
= 0;
231 /* Time-related functions */
238 gettime (&start_time
);
239 volume_start_time
= start_time
;
240 last_stat_time
= start_time
;
244 set_volume_start_time (void)
246 gettime (&volume_start_time
);
247 last_stat_time
= volume_start_time
;
255 duration
+= ((now
.tv_sec
- last_stat_time
.tv_sec
)
256 + (now
.tv_nsec
- last_stat_time
.tv_nsec
) / 1e9
);
257 gettime (&last_stat_time
);
261 /* Compression detection */
264 ct_tar
, /* Plain tar file */
265 ct_none
, /* Unknown compression type */
277 enum compress_type type
;
284 static struct zip_magic
const magic
[] = {
287 { ct_compress
, 2, "\037\235", COMPRESS_PROGRAM
, "-Z" },
288 { ct_gzip
, 2, "\037\213", GZIP_PROGRAM
, "-z" },
289 { ct_bzip2
, 3, "BZh", BZIP2_PROGRAM
, "-j" },
290 { ct_lzip
, 4, "LZIP", LZIP_PROGRAM
, "--lzip" },
291 { ct_lzma
, 6, "\xFFLZMA", LZMA_PROGRAM
, "--lzma" },
292 { ct_lzop
, 4, "\211LZO", LZOP_PROGRAM
, "--lzop" },
293 { ct_xz
, 6, "\xFD" "7zXZ", XZ_PROGRAM
, "-J" },
296 #define NMAGIC (sizeof(magic)/sizeof(magic[0]))
298 #define compress_option(t) magic[t].option
299 #define compress_program(t) magic[t].program
301 /* Check if the file ARCHIVE is a compressed archive. */
302 static enum compress_type
303 check_compressed_archive (bool *pshort
)
305 struct zip_magic
const *p
;
312 /* Prepare global data needed for find_next_block: */
313 record_end
= record_start
; /* set up for 1st record = # 0 */
314 sfr
= read_full_records
;
315 read_full_records
= true; /* Suppress fatal error on reading a partial
317 *pshort
= find_next_block () == 0;
319 /* Restore global values */
320 read_full_records
= sfr
;
322 if (tar_checksum (record_start
, true) == HEADER_SUCCESS
)
323 /* Probably a valid header */
326 for (p
= magic
+ 2; p
< magic
+ NMAGIC
; p
++)
327 if (memcmp (record_start
->buffer
, p
->magic
, p
->length
) == 0)
333 /* Guess if the archive is seekable. */
335 guess_seekable_archive (void)
339 if (subcommand_option
== DELETE_SUBCOMMAND
)
341 /* The current code in delete.c is based on the assumption that
342 skip_member() reads all data from the archive. So, we should
343 make sure it won't use seeks. On the other hand, the same code
344 depends on the ability to backspace a record in the archive,
345 so setting seekable_archive to false is technically incorrect.
346 However, it is tested only in skip_member(), so it's not a
348 seekable_archive
= false;
351 if (seek_option
!= -1)
353 seekable_archive
= !!seek_option
;
357 if (!multi_volume_option
&& !use_compress_program_option
358 && fstat (archive
, &st
) == 0)
359 seekable_archive
= S_ISREG (st
.st_mode
);
361 seekable_archive
= false;
364 /* Open an archive named archive_name_array[0]. Detect if it is
365 a compressed archive of known type and use corresponding decompression
368 open_compressed_archive (void)
370 archive
= rmtopen (archive_name_array
[0], O_RDONLY
| O_BINARY
,
371 MODE_RW
, rsh_command_option
);
375 if (!multi_volume_option
)
377 if (!use_compress_program_option
)
380 enum compress_type type
= check_compressed_archive (&shortfile
);
386 ERROR ((0, 0, _("This does not look like a tar archive")));
391 ERROR ((0, 0, _("This does not look like a tar archive")));
392 set_compression_program_by_suffix (archive_name_array
[0], NULL
);
393 if (!use_compress_program_option
)
398 use_compress_program_option
= compress_program (type
);
403 /* FD is not needed any more */
406 hit_eof
= false; /* It might have been set by find_next_block in
407 check_compressed_archive */
409 /* Open compressed archive */
410 child_pid
= sys_child_open_for_uncompress ();
411 read_full_records
= true;
415 record_end
= record_start
; /* set up for 1st record = # 0 */
422 print_stats (FILE *fp
, const char *text
, tarlong numbytes
)
424 char bytes
[sizeof (tarlong
) * CHAR_BIT
];
425 char abbr
[LONGEST_HUMAN_READABLE
+ 1];
426 char rate
[LONGEST_HUMAN_READABLE
+ 1];
428 int human_opts
= human_autoscale
| human_base_1024
| human_SI
| human_B
;
430 sprintf (bytes
, TARLONG_FORMAT
, numbytes
);
432 fprintf (fp
, "%s: %s (%s, %s/s)\n",
434 human_readable (numbytes
, abbr
, human_opts
, 1, 1),
435 (0 < duration
&& numbytes
/ duration
< (uintmax_t) -1
436 ? human_readable (numbytes
/ duration
, rate
, human_opts
, 1, 1)
443 switch (subcommand_option
)
445 case CREATE_SUBCOMMAND
:
447 case UPDATE_SUBCOMMAND
:
448 case APPEND_SUBCOMMAND
:
449 /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */
450 print_stats (stderr
, _("Total bytes written"),
451 prev_written
+ bytes_written
);
454 case DELETE_SUBCOMMAND
:
456 char buf
[UINTMAX_STRSIZE_BOUND
];
457 print_stats (stderr
, _("Total bytes read"),
458 records_read
* record_size
);
459 print_stats (stderr
, _("Total bytes written"),
460 prev_written
+ bytes_written
);
461 fprintf (stderr
, _("Total bytes deleted: %s\n"),
462 STRINGIFY_BIGINT ((records_read
- records_skipped
)
464 - (prev_written
+ bytes_written
), buf
));
468 case EXTRACT_SUBCOMMAND
:
469 case LIST_SUBCOMMAND
:
470 case DIFF_SUBCOMMAND
:
471 print_stats (stderr
, _("Total bytes read"),
472 records_read
* record_size
);
480 /* Compute and return the block ordinal at current_block. */
482 current_block_ordinal (void)
484 return record_start_block
+ (current_block
- record_start
);
487 /* If the EOF flag is set, reset it, as well as current_block, etc. */
494 current_block
= record_start
;
495 record_end
= record_start
+ blocking_factor
;
496 access_mode
= ACCESS_WRITE
;
500 /* Return the location of the next available input or output block.
501 Return zero for EOF. Once we have returned zero, we just keep returning
502 it, to avoid accidentally going on to the next file on the tape. */
504 find_next_block (void)
506 if (current_block
== record_end
)
511 if (current_block
== record_end
)
517 return current_block
;
520 /* Indicate that we have used all blocks up thru BLOCK. */
522 set_next_block_after (union block
*block
)
524 while (block
>= current_block
)
527 /* Do *not* flush the archive here. If we do, the same argument to
528 set_next_block_after could mean the next block (if the input record
529 is exactly one block long), which is not what is intended. */
531 if (current_block
> record_end
)
535 /* Return the number of bytes comprising the space between POINTER
536 through the end of the current buffer of blocks. This space is
537 available for filling with data, or taking data from. POINTER is
538 usually (but not always) the result of previous find_next_block call. */
540 available_space_after (union block
*pointer
)
542 return record_end
->buffer
- pointer
->buffer
;
545 /* Close file having descriptor FD, and abort if close unsuccessful. */
550 close_error (_("(pipe)"));
556 if (! record_buffer_aligned
[record_index
])
557 record_buffer_aligned
[record_index
] =
558 page_aligned_alloc (&record_buffer
[record_index
], record_size
);
560 record_start
= record_buffer_aligned
[record_index
];
561 current_block
= record_start
;
562 record_end
= record_start
+ blocking_factor
;
565 /* Open an archive file. The argument specifies whether we are
566 reading or writing, or both. */
568 _open_archive (enum access_mode wanted_access
)
570 int backed_up_flag
= 0;
572 if (record_size
== 0)
573 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
575 if (archive_names
== 0)
576 FATAL_ERROR ((0, 0, _("No archive name given")));
578 tar_stat_destroy (¤t_stat_info
);
583 /* When updating the archive, we start with reading. */
584 access_mode
= wanted_access
== ACCESS_UPDATE
? ACCESS_READ
: wanted_access
;
586 read_full_records
= read_full_records_option
;
590 if (use_compress_program_option
)
592 switch (wanted_access
)
595 child_pid
= sys_child_open_for_uncompress ();
596 read_full_records
= true;
597 record_end
= record_start
; /* set up for 1st record = # 0 */
601 child_pid
= sys_child_open_for_compress ();
605 abort (); /* Should not happen */
610 && wanted_access
== ACCESS_WRITE
611 && strcmp (archive_name_array
[0], "-") == 0)
614 else if (strcmp (archive_name_array
[0], "-") == 0)
616 read_full_records
= true; /* could be a pipe, be safe */
618 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
620 switch (wanted_access
)
625 enum compress_type type
;
627 archive
= STDIN_FILENO
;
629 type
= check_compressed_archive (&shortfile
);
630 if (type
!= ct_tar
&& type
!= ct_none
)
632 _("Archive is compressed. Use %s option"),
633 compress_option (type
)));
635 ERROR ((0, 0, _("This does not look like a tar archive")));
640 archive
= STDOUT_FILENO
;
641 if (!index_file_name
)
646 archive
= STDIN_FILENO
;
647 write_archive_to_stdout
= true;
648 record_end
= record_start
; /* set up for 1st record = # 0 */
649 if (!index_file_name
)
654 else if (verify_option
)
655 archive
= rmtopen (archive_name_array
[0], O_RDWR
| O_CREAT
| O_BINARY
,
656 MODE_RW
, rsh_command_option
);
658 switch (wanted_access
)
661 archive
= open_compressed_archive ();
663 guess_seekable_archive ();
669 maybe_backup_file (archive_name_array
[0], 1);
672 archive
= rmtcreat (archive_name_array
[0], MODE_RW
,
677 archive
= rmtopen (archive_name_array
[0],
678 O_RDWR
| O_CREAT
| O_BINARY
,
679 MODE_RW
, rsh_command_option
);
681 switch (check_compressed_archive (NULL
))
689 _("Cannot update compressed archives")));
695 || (! _isrmt (archive
) && !sys_get_archive_stat ()))
697 int saved_errno
= errno
;
702 open_fatal (archive_name_array
[0]);
705 sys_detect_dev_null_output ();
706 sys_save_archive_dev_ino ();
707 SET_BINARY_MODE (archive
);
709 switch (wanted_access
)
712 find_next_block (); /* read it in, check for EOF */
722 /* Perform a write to flush the buffer. */
728 checkpoint_run (true);
729 if (tape_length_option
&& tape_length_option
<= bytes_written
)
734 else if (dev_null_output
)
735 status
= record_size
;
737 status
= sys_write_archive_buffer ();
739 if (status
&& multi_volume_option
&& !inhibit_map
)
741 struct bufmap
*map
= bufmap_locate (status
);
744 size_t delta
= status
- map
->start
* BLOCKSIZE
;
745 if (delta
> map
->sizeleft
)
746 delta
= map
->sizeleft
;
747 map
->sizeleft
-= delta
;
748 if (map
->sizeleft
== 0)
750 bufmap_reset (map
, map
? (- map
->start
) : 0);
756 /* Handle write errors on the archive. Write errors are always fatal.
757 Hitting the end of a volume does not cause a write error unless the
758 write was the first record of the volume. */
760 archive_write_error (ssize_t status
)
762 /* It might be useful to know how much was written before the error
767 print_total_stats ();
771 write_fatal_details (*archive_name_cursor
, status
, record_size
);
774 /* Handle read errors on the archive. If the read should be retried,
775 return to the caller. */
777 archive_read_error (void)
779 read_error (*archive_name_cursor
);
781 if (record_start_block
== 0)
782 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
784 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
785 then give up on reading the archive. */
787 if (read_error_count
++ > READ_ERROR_MAX
)
788 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
793 archive_is_dev (void)
797 if (fstat (archive
, &st
))
799 stat_diag (*archive_name_cursor
);
802 return S_ISBLK (st
.st_mode
) || S_ISCHR (st
.st_mode
);
806 short_read (size_t status
)
808 size_t left
; /* bytes left */
809 char *more
; /* pointer to next byte to read */
811 more
= record_start
->buffer
+ status
;
812 left
= record_size
- status
;
814 if (left
&& left
% BLOCKSIZE
== 0
816 && record_start_block
== 0 && status
!= 0
817 && archive_is_dev ())
819 unsigned long rsize
= status
/ BLOCKSIZE
;
821 ngettext ("Record size = %lu block",
822 "Record size = %lu blocks",
827 while (left
% BLOCKSIZE
!= 0
828 || (left
&& status
&& read_full_records
))
831 while ((status
= rmtread (archive
, more
, left
)) == SAFE_READ_ERROR
)
832 archive_read_error ();
837 if (! read_full_records
)
839 unsigned long rest
= record_size
- left
;
842 ngettext ("Unaligned block (%lu byte) in archive",
843 "Unaligned block (%lu bytes) in archive",
852 record_end
= record_start
+ (record_size
- left
) / BLOCKSIZE
;
856 /* Flush the current buffer to/from the archive. */
860 size_t buffer_level
= current_block
->buffer
- record_start
->buffer
;
861 record_start_block
+= record_end
- record_start
;
862 current_block
= record_start
;
863 record_end
= record_start
+ blocking_factor
;
865 if (access_mode
== ACCESS_READ
&& time_to_start_writing
)
867 access_mode
= ACCESS_WRITE
;
868 time_to_start_writing
= false;
879 flush_write_ptr (buffer_level
);
887 /* Backspace the archive descriptor by one record worth. If it's a
888 tape, MTIOCTOP will work. If it's something else, try to seek on
889 it. If we can't seek, we lose! */
891 backspace_output (void)
895 struct mtop operation
;
897 operation
.mt_op
= MTBSR
;
898 operation
.mt_count
= 1;
899 if (rmtioctl (archive
, MTIOCTOP
, (char *) &operation
) >= 0)
901 if (errno
== EIO
&& rmtioctl (archive
, MTIOCTOP
, (char *) &operation
) >= 0)
907 off_t position
= rmtlseek (archive
, (off_t
) 0, SEEK_CUR
);
909 /* Seek back to the beginning of this record and start writing there. */
911 position
-= record_size
;
914 if (rmtlseek (archive
, position
, SEEK_SET
) != position
)
916 /* Lseek failed. Try a different method. */
919 _("Cannot backspace archive file; it may be unreadable without -i")));
921 /* Replace the first part of the record with NULs. */
923 if (record_start
->buffer
!= output_start
)
924 memset (record_start
->buffer
, 0,
925 output_start
- record_start
->buffer
);
931 seek_archive (off_t size
)
933 off_t start
= current_block_ordinal ();
936 off_t skipped
= (blocking_factor
- (current_block
- record_start
))
942 /* Compute number of records to skip */
943 nrec
= (size
- skipped
) / record_size
;
946 offset
= rmtlseek (archive
, nrec
* record_size
, SEEK_CUR
);
950 if (offset
% record_size
)
951 FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
953 /* Convert to number of records */
955 /* Compute number of skipped blocks */
956 nblk
= offset
- start
;
958 /* Update buffering info */
959 records_read
+= nblk
/ blocking_factor
;
960 record_start_block
= offset
- blocking_factor
;
961 current_block
= record_end
;
966 /* Close the archive file. */
970 if (time_to_start_writing
|| access_mode
== ACCESS_WRITE
)
973 if (current_block
> record_start
)
981 if (rmtclose (archive
) != 0)
982 close_error (*archive_name_cursor
);
984 sys_wait_for_child (child_pid
, hit_eof
);
986 tar_stat_destroy (¤t_stat_info
);
987 free (record_buffer
[0]);
988 free (record_buffer
[1]);
992 /* Called to initialize the global volume number. */
994 init_volume_number (void)
996 FILE *file
= fopen (volno_file_option
, "r");
1000 if (fscanf (file
, "%d", &global_volno
) != 1
1001 || global_volno
< 0)
1002 FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
1003 quotearg_colon (volno_file_option
)));
1005 read_error (volno_file_option
);
1006 if (fclose (file
) != 0)
1007 close_error (volno_file_option
);
1009 else if (errno
!= ENOENT
)
1010 open_error (volno_file_option
);
1013 /* Called to write out the closing global volume number. */
1015 closeout_volume_number (void)
1017 FILE *file
= fopen (volno_file_option
, "w");
1021 fprintf (file
, "%d\n", global_volno
);
1023 write_error (volno_file_option
);
1024 if (fclose (file
) != 0)
1025 close_error (volno_file_option
);
1028 open_error (volno_file_option
);
1033 increase_volume_number (void)
1036 if (global_volno
< 0)
1037 FATAL_ERROR ((0, 0, _("Volume number overflow")));
1042 change_tape_menu (FILE *read_file
)
1044 char *input_buffer
= NULL
;
1050 fputc ('\007', stderr
);
1052 _("Prepare volume #%d for %s and hit return: "),
1053 global_volno
+ 1, quote (*archive_name_cursor
));
1056 if (getline (&input_buffer
, &size
, read_file
) <= 0)
1058 WARN ((0, 0, _("EOF where user reply was expected")));
1060 if (subcommand_option
!= EXTRACT_SUBCOMMAND
1061 && subcommand_option
!= LIST_SUBCOMMAND
1062 && subcommand_option
!= DIFF_SUBCOMMAND
)
1063 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1068 if (input_buffer
[0] == '\n'
1069 || input_buffer
[0] == 'y'
1070 || input_buffer
[0] == 'Y')
1073 switch (input_buffer
[0])
1077 fprintf (stderr
, _("\
1078 n name Give a new file name for the next (and subsequent) volume(s)\n\
1080 y or newline Continue operation\n"));
1081 if (!restrict_option
)
1082 fprintf (stderr
, _(" ! Spawn a subshell\n"));
1083 fprintf (stderr
, _(" ? Print this list\n"));
1090 WARN ((0, 0, _("No new volume; exiting.\n")));
1092 if (subcommand_option
!= EXTRACT_SUBCOMMAND
1093 && subcommand_option
!= LIST_SUBCOMMAND
1094 && subcommand_option
!= DIFF_SUBCOMMAND
)
1095 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1100 /* Get new file name. */
1106 for (name
= input_buffer
+ 1;
1107 *name
== ' ' || *name
== '\t';
1111 for (cursor
= name
; *cursor
&& *cursor
!= '\n'; cursor
++)
1117 /* FIXME: the following allocation is never reclaimed. */
1118 *archive_name_cursor
= xstrdup (name
);
1122 fprintf (stderr
, "%s",
1123 _("File name not specified. Try again.\n"));
1128 if (!restrict_option
)
1136 fprintf (stderr
, _("Invalid input. Type ? for help.\n"));
1139 free (input_buffer
);
1142 /* We've hit the end of the old volume. Close it and open the next one.
1143 Return nonzero on success.
1146 new_volume (enum access_mode mode
)
1148 static FILE *read_file
;
1152 if (!read_file
&& !info_script_option
)
1153 /* FIXME: if fopen is used, it will never be closed. */
1154 read_file
= archive
== STDIN_FILENO
? fopen (TTY_NAME
, "r") : stdin
;
1161 assign_string (&volume_label
, NULL
);
1162 assign_string (&continued_file_name
, NULL
);
1163 continued_file_size
= continued_file_offset
= 0;
1164 current_block
= record_start
;
1166 if (rmtclose (archive
) != 0)
1167 close_error (*archive_name_cursor
);
1169 archive_name_cursor
++;
1170 if (archive_name_cursor
== archive_name_array
+ archive_names
)
1172 archive_name_cursor
= archive_name_array
;
1180 /* We have to prompt from now on. */
1182 if (info_script_option
)
1184 if (volno_file_option
)
1185 closeout_volume_number ();
1186 if (sys_exec_info_script (archive_name_cursor
, global_volno
+1))
1187 FATAL_ERROR ((0, 0, _("%s command failed"),
1188 quote (info_script_option
)));
1191 change_tape_menu (read_file
);
1194 if (strcmp (archive_name_cursor
[0], "-") == 0)
1196 read_full_records
= true;
1197 archive
= STDIN_FILENO
;
1199 else if (verify_option
)
1200 archive
= rmtopen (*archive_name_cursor
, O_RDWR
| O_CREAT
, MODE_RW
,
1201 rsh_command_option
);
1206 archive
= rmtopen (*archive_name_cursor
, O_RDONLY
, MODE_RW
,
1207 rsh_command_option
);
1208 guess_seekable_archive ();
1213 maybe_backup_file (*archive_name_cursor
, 1);
1214 archive
= rmtcreat (*archive_name_cursor
, MODE_RW
,
1215 rsh_command_option
);
1219 archive
= rmtopen (*archive_name_cursor
, O_RDWR
| O_CREAT
, MODE_RW
,
1220 rsh_command_option
);
1226 open_warn (*archive_name_cursor
);
1227 if (!verify_option
&& mode
== ACCESS_WRITE
&& backup_option
)
1228 undo_last_backup ();
1233 SET_BINARY_MODE (archive
);
1239 read_header0 (struct tar_stat_info
*info
)
1241 enum read_header rc
;
1243 tar_stat_init (info
);
1244 rc
= read_header (¤t_header
, info
, read_header_auto
);
1245 if (rc
== HEADER_SUCCESS
)
1247 set_next_block_after (current_header
);
1250 ERROR ((0, 0, _("This does not look like a tar archive")));
1255 try_new_volume (void)
1258 union block
*header
;
1259 enum access_mode acc
;
1261 switch (subcommand_option
)
1263 case APPEND_SUBCOMMAND
:
1264 case CAT_SUBCOMMAND
:
1265 case UPDATE_SUBCOMMAND
:
1266 acc
= ACCESS_UPDATE
;
1274 if (!new_volume (acc
))
1277 while ((status
= rmtread (archive
, record_start
->buffer
, record_size
))
1279 archive_read_error ();
1281 if (status
!= record_size
)
1282 short_read (status
);
1284 header
= find_next_block ();
1288 switch (header
->header
.typeflag
)
1292 tar_stat_init (&dummy
);
1293 if (read_header (&header
, &dummy
, read_header_x_global
)
1294 != HEADER_SUCCESS_EXTENDED
)
1296 ERROR ((0, 0, _("This does not look like a tar archive")));
1300 xheader_decode (&dummy
); /* decodes values from the global header */
1301 tar_stat_destroy (&dummy
);
1303 /* The initial global header must be immediately followed by
1304 an extended PAX header for the first member in this volume.
1305 However, in some cases tar may split volumes in the middle
1306 of a PAX header. This is incorrect, and should be fixed
1307 in the future versions. In the meantime we must be
1308 prepared to correctly list and extract such archives.
1310 If this happens, the following call to read_header returns
1311 HEADER_FAILURE, which is ignored.
1313 See also tests/multiv07.at */
1315 switch (read_header (&header
, &dummy
, read_header_auto
))
1317 case HEADER_SUCCESS
:
1318 set_next_block_after (header
);
1321 case HEADER_FAILURE
:
1325 ERROR ((0, 0, _("This does not look like a tar archive")));
1331 case GNUTYPE_VOLHDR
:
1332 if (!read_header0 (&dummy
))
1334 tar_stat_destroy (&dummy
);
1335 assign_string (&volume_label
, current_header
->header
.name
);
1336 set_next_block_after (header
);
1337 header
= find_next_block ();
1338 if (header
->header
.typeflag
!= GNUTYPE_MULTIVOL
)
1342 case GNUTYPE_MULTIVOL
:
1343 if (!read_header0 (&dummy
))
1345 tar_stat_destroy (&dummy
);
1346 assign_string (&continued_file_name
, current_header
->header
.name
);
1347 continued_file_size
=
1348 UINTMAX_FROM_HEADER (current_header
->header
.size
);
1349 continued_file_offset
=
1350 UINTMAX_FROM_HEADER (current_header
->oldgnu_header
.offset
);
1360 if (!continued_file_name
1361 || strcmp (continued_file_name
, bufmap_head
->file_name
))
1363 if ((archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
1364 && strlen (bufmap_head
->file_name
) >= NAME_FIELD_SIZE
1365 && strncmp (continued_file_name
, bufmap_head
->file_name
,
1366 NAME_FIELD_SIZE
) == 0)
1368 _("%s is possibly continued on this volume: header contains truncated name"),
1369 quote (bufmap_head
->file_name
)));
1372 WARN ((0, 0, _("%s is not continued on this volume"),
1373 quote (bufmap_head
->file_name
)));
1378 s
= continued_file_size
+ continued_file_offset
;
1380 if (bufmap_head
->sizetotal
!= s
|| s
< continued_file_offset
)
1382 char totsizebuf
[UINTMAX_STRSIZE_BOUND
];
1383 char s1buf
[UINTMAX_STRSIZE_BOUND
];
1384 char s2buf
[UINTMAX_STRSIZE_BOUND
];
1386 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
1387 quote (continued_file_name
),
1388 STRINGIFY_BIGINT (bufmap_head
->sizetotal
, totsizebuf
),
1389 STRINGIFY_BIGINT (continued_file_size
, s1buf
),
1390 STRINGIFY_BIGINT (continued_file_offset
, s2buf
)));
1394 if (bufmap_head
->sizetotal
- bufmap_head
->sizeleft
!=
1395 continued_file_offset
)
1397 char totsizebuf
[UINTMAX_STRSIZE_BOUND
];
1398 char s1buf
[UINTMAX_STRSIZE_BOUND
];
1399 char s2buf
[UINTMAX_STRSIZE_BOUND
];
1401 WARN ((0, 0, _("This volume is out of sequence (%s - %s != %s)"),
1402 STRINGIFY_BIGINT (bufmap_head
->sizetotal
, totsizebuf
),
1403 STRINGIFY_BIGINT (bufmap_head
->sizeleft
, s1buf
),
1404 STRINGIFY_BIGINT (continued_file_offset
, s2buf
)));
1410 increase_volume_number ();
1415 #define VOLUME_TEXT " Volume "
1416 #define VOLUME_TEXT_LEN (sizeof VOLUME_TEXT - 1)
1419 drop_volume_label_suffix (const char *label
)
1422 size_t len
= strlen (label
);
1427 for (p
= label
+ len
- 1; p
> label
&& isdigit ((unsigned char) *p
); p
--)
1429 if (p
> label
&& p
- (VOLUME_TEXT_LEN
- 1) > label
)
1431 p
-= VOLUME_TEXT_LEN
- 1;
1432 if (memcmp (p
, VOLUME_TEXT
, VOLUME_TEXT_LEN
) == 0)
1434 char *s
= xmalloc ((len
= p
- label
) + 1);
1435 memcpy (s
, label
, len
);
1444 /* Check LABEL against the volume label, seen as a globbing
1445 pattern. Return true if the pattern matches. In case of failure,
1446 retry matching a volume sequence number before giving up in
1447 multi-volume mode. */
1449 check_label_pattern (const char *label
)
1452 bool result
= false;
1454 if (fnmatch (volume_label_option
, label
, 0) == 0)
1457 if (!multi_volume_option
)
1460 string
= drop_volume_label_suffix (label
);
1463 result
= fnmatch (string
, volume_label_option
, 0) == 0;
1469 /* Check if the next block contains a volume label and if this matches
1470 the one given in the command line */
1472 match_volume_label (void)
1476 union block
*label
= find_next_block ();
1479 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1480 quote (volume_label_option
)));
1481 if (label
->header
.typeflag
== GNUTYPE_VOLHDR
)
1483 if (memchr (label
->header
.name
, '\0', sizeof label
->header
.name
))
1484 assign_string (&volume_label
, label
->header
.name
);
1487 volume_label
= xmalloc (sizeof (label
->header
.name
) + 1);
1488 memcpy (volume_label
, label
->header
.name
,
1489 sizeof (label
->header
.name
));
1490 volume_label
[sizeof (label
->header
.name
)] = 0;
1493 else if (label
->header
.typeflag
== XGLTYPE
)
1495 struct tar_stat_info st
;
1496 tar_stat_init (&st
);
1497 xheader_read (&st
.xhdr
, label
,
1498 OFF_FROM_HEADER (label
->header
.size
));
1499 xheader_decode (&st
);
1500 tar_stat_destroy (&st
);
1505 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1506 quote (volume_label_option
)));
1508 if (!check_label_pattern (volume_label
))
1509 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
1510 quote_n (0, volume_label
),
1511 quote_n (1, volume_label_option
)));
1514 /* Mark the archive with volume label STR. */
1516 _write_volume_label (const char *str
)
1518 if (archive_format
== POSIX_FORMAT
)
1519 xheader_store ("GNU.volume.label", &dummy
, str
);
1522 union block
*label
= find_next_block ();
1524 memset (label
, 0, BLOCKSIZE
);
1526 strcpy (label
->header
.name
, str
);
1527 assign_string (¤t_stat_info
.file_name
,
1528 label
->header
.name
);
1529 current_stat_info
.had_trailing_slash
=
1530 strip_trailing_slashes (current_stat_info
.file_name
);
1532 label
->header
.typeflag
= GNUTYPE_VOLHDR
;
1533 TIME_TO_CHARS (start_time
.tv_sec
, label
->header
.mtime
);
1534 finish_header (¤t_stat_info
, label
, -1);
1535 set_next_block_after (label
);
1539 #define VOL_SUFFIX "Volume"
1541 /* Add a volume label to a part of multi-volume archive */
1543 add_volume_label (void)
1545 char buf
[UINTMAX_STRSIZE_BOUND
];
1546 char *p
= STRINGIFY_BIGINT (volno
, buf
);
1547 char *s
= xmalloc (strlen (volume_label_option
) + sizeof VOL_SUFFIX
1549 sprintf (s
, "%s %s %s", volume_label_option
, VOL_SUFFIX
, p
);
1550 _write_volume_label (s
);
1555 add_chunk_header (struct bufmap
*map
)
1557 if (archive_format
== POSIX_FORMAT
)
1559 off_t block_ordinal
;
1561 struct tar_stat_info st
;
1563 memset (&st
, 0, sizeof st
);
1564 st
.orig_file_name
= st
.file_name
= map
->file_name
;
1565 st
.stat
.st_mode
= S_IFREG
|S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
;
1566 st
.stat
.st_uid
= getuid ();
1567 st
.stat
.st_gid
= getgid ();
1568 st
.orig_file_name
= xheader_format_name (&st
,
1569 "%d/GNUFileParts.%p/%f.%n",
1571 st
.file_name
= st
.orig_file_name
;
1572 st
.archive_file_size
= st
.stat
.st_size
= map
->sizeleft
;
1574 block_ordinal
= current_block_ordinal ();
1575 blk
= start_header (&st
);
1577 abort (); /* FIXME */
1578 finish_header (&st
, blk
, block_ordinal
);
1579 free (st
.orig_file_name
);
1584 /* Add a volume label to the current archive */
1586 write_volume_label (void)
1588 if (multi_volume_option
)
1589 add_volume_label ();
1591 _write_volume_label (volume_label_option
);
1594 /* Write GNU multi-volume header */
1596 gnu_add_multi_volume_header (struct bufmap
*map
)
1599 union block
*block
= find_next_block ();
1601 if (strlen (map
->file_name
) > NAME_FIELD_SIZE
)
1603 _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
1604 quotearg_colon (map
->file_name
)));
1606 memset (block
, 0, BLOCKSIZE
);
1608 strncpy (block
->header
.name
, map
->file_name
, NAME_FIELD_SIZE
);
1609 block
->header
.typeflag
= GNUTYPE_MULTIVOL
;
1611 OFF_TO_CHARS (map
->sizeleft
, block
->header
.size
);
1612 OFF_TO_CHARS (map
->sizetotal
- map
->sizeleft
,
1613 block
->oldgnu_header
.offset
);
1615 tmp
= verbose_option
;
1617 finish_header (¤t_stat_info
, block
, -1);
1618 verbose_option
= tmp
;
1619 set_next_block_after (block
);
1622 /* Add a multi volume header to the current archive. The exact header format
1623 depends on the archive format. */
1625 add_multi_volume_header (struct bufmap
*map
)
1627 if (archive_format
== POSIX_FORMAT
)
1629 off_t d
= map
->sizetotal
- map
->sizeleft
;
1630 xheader_store ("GNU.volume.filename", &dummy
, map
->file_name
);
1631 xheader_store ("GNU.volume.size", &dummy
, &map
->sizeleft
);
1632 xheader_store ("GNU.volume.offset", &dummy
, &d
);
1635 gnu_add_multi_volume_header (map
);
1639 /* Low-level flush functions */
1641 /* Simple flush read (no multi-volume or label extensions) */
1643 simple_flush_read (void)
1645 size_t status
; /* result from system call */
1647 checkpoint_run (false);
1649 /* Clear the count of errors. This only applies to a single call to
1652 read_error_count
= 0; /* clear error count */
1654 if (write_archive_to_stdout
&& record_start_block
!= 0)
1656 archive
= STDOUT_FILENO
;
1657 status
= sys_write_archive_buffer ();
1658 archive
= STDIN_FILENO
;
1659 if (status
!= record_size
)
1660 archive_write_error (status
);
1665 status
= rmtread (archive
, record_start
->buffer
, record_size
);
1666 if (status
== record_size
)
1671 if (status
== SAFE_READ_ERROR
)
1673 archive_read_error ();
1674 continue; /* try again */
1678 short_read (status
);
1681 /* Simple flush write (no multi-volume or label extensions) */
1683 simple_flush_write (size_t level
__attribute__((unused
)))
1687 status
= _flush_write ();
1688 if (status
!= record_size
)
1689 archive_write_error (status
);
1693 bytes_written
+= status
;
1698 /* GNU flush functions. These support multi-volume and archive labels in
1699 GNU and PAX archive formats. */
1702 _gnu_flush_read (void)
1704 size_t status
; /* result from system call */
1706 checkpoint_run (false);
1708 /* Clear the count of errors. This only applies to a single call to
1711 read_error_count
= 0; /* clear error count */
1713 if (write_archive_to_stdout
&& record_start_block
!= 0)
1715 archive
= STDOUT_FILENO
;
1716 status
= sys_write_archive_buffer ();
1717 archive
= STDIN_FILENO
;
1718 if (status
!= record_size
)
1719 archive_write_error (status
);
1724 status
= rmtread (archive
, record_start
->buffer
, record_size
);
1725 if (status
== record_size
)
1731 /* The condition below used to include
1732 || (status > 0 && !read_full_records)
1733 This is incorrect since even if new_volume() succeeds, the
1734 subsequent call to rmtread will overwrite the chunk of data
1735 already read in the buffer, so the processing will fail */
1737 || (status
== SAFE_READ_ERROR
&& errno
== ENOSPC
))
1738 && multi_volume_option
)
1740 while (!try_new_volume ())
1742 if (current_block
== record_end
)
1743 /* Necessary for blocking_factor == 1 */
1747 else if (status
== SAFE_READ_ERROR
)
1749 archive_read_error ();
1754 short_read (status
);
1758 gnu_flush_read (void)
1760 flush_read_ptr
= simple_flush_read
; /* Avoid recursion */
1762 flush_read_ptr
= gnu_flush_read
;
1766 _gnu_flush_write (size_t buffer_level
)
1769 union block
*header
;
1775 status
= _flush_write ();
1776 if (status
!= record_size
&& !multi_volume_option
)
1777 archive_write_error (status
);
1782 bytes_written
+= status
;
1785 if (status
== record_size
)
1790 map
= bufmap_locate (status
);
1792 if (status
% BLOCKSIZE
)
1794 ERROR ((0, 0, _("write did not end on a block boundary")));
1795 archive_write_error (status
);
1798 /* In multi-volume mode. */
1799 /* ENXIO is for the UNIX PC. */
1800 if (status
< 0 && errno
!= ENOSPC
&& errno
!= EIO
&& errno
!= ENXIO
)
1801 archive_write_error (status
);
1803 if (!new_volume (ACCESS_WRITE
))
1806 tar_stat_destroy (&dummy
);
1808 increase_volume_number ();
1809 prev_written
+= bytes_written
;
1812 copy_ptr
= record_start
->buffer
+ status
;
1813 copy_size
= buffer_level
- status
;
1815 /* Switch to the next buffer */
1816 record_index
= !record_index
;
1821 if (volume_label_option
)
1822 add_volume_label ();
1825 add_multi_volume_header (map
);
1827 write_extended (true, &dummy
, find_next_block ());
1828 tar_stat_destroy (&dummy
);
1831 add_chunk_header (map
);
1832 header
= find_next_block ();
1833 bufmap_reset (map
, header
- record_start
);
1834 bufsize
= available_space_after (header
);
1836 while (bufsize
< copy_size
)
1838 memcpy (header
->buffer
, copy_ptr
, bufsize
);
1839 copy_ptr
+= bufsize
;
1840 copy_size
-= bufsize
;
1841 set_next_block_after (header
+ (bufsize
- 1) / BLOCKSIZE
);
1842 header
= find_next_block ();
1843 bufsize
= available_space_after (header
);
1845 memcpy (header
->buffer
, copy_ptr
, copy_size
);
1846 memset (header
->buffer
+ copy_size
, 0, bufsize
- copy_size
);
1847 set_next_block_after (header
+ (copy_size
- 1) / BLOCKSIZE
);
1852 gnu_flush_write (size_t buffer_level
)
1854 flush_write_ptr
= simple_flush_write
; /* Avoid recursion */
1855 _gnu_flush_write (buffer_level
);
1856 flush_write_ptr
= gnu_flush_write
;
1868 flush_write_ptr (record_size
);
1872 open_archive (enum access_mode wanted_access
)
1874 flush_read_ptr
= gnu_flush_read
;
1875 flush_write_ptr
= gnu_flush_write
;
1877 _open_archive (wanted_access
);
1878 switch (wanted_access
)
1882 if (volume_label_option
)
1883 match_volume_label ();
1887 records_written
= 0;
1888 if (volume_label_option
)
1889 write_volume_label ();
1892 set_volume_start_time ();