1 /* Buffer management for tar.
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
6 Written by John Gilmore, on 1985-08-25.
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 3, or (at your option) any later
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
23 #include <system-ioctl.h>
36 /* Number of retries before giving up on read. */
37 #define READ_ERROR_MAX 10
39 /* Globbing pattern to append to volume label if initial match failed. */
40 #define VOLUME_LABEL_APPEND " Volume [1-9]*"
44 static tarlong prev_written
; /* bytes written on previous volumes */
45 static tarlong bytes_written
; /* bytes written on this volume */
46 static void *record_buffer
[2]; /* allocated memory */
47 union block
*record_buffer_aligned
[2];
48 static int record_index
;
50 /* FIXME: The following variables should ideally be static to this
51 module. However, this cannot be done yet. The cleanup continues! */
53 union block
*record_start
; /* start of record of archive */
54 union block
*record_end
; /* last+1 block of archive record */
55 union block
*current_block
; /* current block of archive */
56 enum access_mode access_mode
; /* how do we handle the archive */
57 off_t records_read
; /* number of records read from this archive */
58 off_t records_written
; /* likewise, for records written */
59 extern off_t records_skipped
; /* number of records skipped at the start
60 of the archive, defined in delete.c */
62 static off_t record_start_block
; /* block ordinal at record_start */
64 /* Where we write list messages (not errors, not interactions) to. */
67 static void backspace_output (void);
69 /* PID of child program, if compress_option or remote archive access. */
70 static pid_t child_pid
;
72 /* Error recovery stuff */
73 static int read_error_count
;
75 /* Have we hit EOF yet? */
78 /* Checkpointing counter */
79 static unsigned checkpoint
;
81 static bool read_full_records
= false;
83 /* We're reading, but we just read the last block and it's time to update.
86 As least EXTERN like this one as possible. (?? --gray)
87 FIXME: Either eliminate it or move it to common.h.
89 extern bool time_to_start_writing
;
91 bool write_archive_to_stdout
;
93 void (*flush_write_ptr
) (size_t);
94 void (*flush_read_ptr
) (void);
98 char *continued_file_name
;
99 uintmax_t continued_file_size
;
100 uintmax_t continued_file_offset
;
103 static int volno
= 1; /* which volume of a multi-volume tape we're
105 static int global_volno
= 1; /* volume number to print in external
108 bool write_archive_to_stdout
;
110 /* Used by flush_read and flush_write to store the real info about saved
112 static char *real_s_name
;
113 static off_t real_s_totsize
;
114 static off_t real_s_sizeleft
;
117 /* Multi-volume tracking support */
118 static char *save_name
; /* name of the file we are currently writing */
119 static off_t save_totsize
; /* total size of file we are writing, only
120 valid if save_name is nonzero */
121 static off_t save_sizeleft
; /* where we are in the file we are writing,
122 only valid if save_name is nonzero */
125 static struct tar_stat_info dummy
;
128 buffer_write_global_xheader ()
130 xheader_write_global (&dummy
.xhdr
);
134 mv_begin (struct tar_stat_info
*st
)
136 if (multi_volume_option
)
138 assign_string (&save_name
, st
->orig_file_name
);
139 save_totsize
= save_sizeleft
= st
->stat
.st_size
;
146 if (multi_volume_option
)
147 assign_string (&save_name
, 0);
151 mv_total_size (off_t size
)
157 mv_size_left (off_t size
)
159 save_sizeleft
= size
;
166 clear_read_error_count (void)
168 read_error_count
= 0;
172 /* Time-related functions */
179 gettime (&start_time
);
180 volume_start_time
= start_time
;
181 last_stat_time
= start_time
;
185 set_volume_start_time ()
187 gettime (&volume_start_time
);
188 last_stat_time
= volume_start_time
;
196 duration
+= ((now
.tv_sec
- last_stat_time
.tv_sec
)
197 + (now
.tv_nsec
- last_stat_time
.tv_nsec
) / 1e9
);
198 gettime (&last_stat_time
);
202 /* Compression detection */
213 enum compress_type type
;
220 static struct zip_magic
const magic
[] = {
222 { ct_compress
, 2, "\037\235", "compress", "-Z" },
223 { ct_gzip
, 2, "\037\213", "gzip", "-z" },
224 { ct_bzip2
, 3, "BZh", "bzip2", "-j" },
227 #define NMAGIC (sizeof(magic)/sizeof(magic[0]))
229 #define compress_option(t) magic[t].option
230 #define compress_program(t) magic[t].program
232 /* Check if the file ARCHIVE is a compressed archive. */
234 check_compressed_archive ()
236 struct zip_magic
const *p
;
239 /* Prepare global data needed for find_next_block: */
240 record_end
= record_start
; /* set up for 1st record = # 0 */
241 sfr
= read_full_records
;
242 read_full_records
= true; /* Suppress fatal error on reading a partial
246 /* Restore global values */
247 read_full_records
= sfr
;
249 if (tar_checksum (record_start
, true) == HEADER_SUCCESS
)
250 /* Probably a valid header */
253 for (p
= magic
+ 1; p
< magic
+ NMAGIC
; p
++)
254 if (memcmp (record_start
->buffer
, p
->magic
, p
->length
) == 0)
260 /* Open an archive named archive_name_array[0]. Detect if it is
261 a compressed archive of known type and use corresponding decompression
264 open_compressed_archive ()
266 archive
= rmtopen (archive_name_array
[0], O_RDONLY
| O_BINARY
,
267 MODE_RW
, rsh_command_option
);
271 if (!multi_volume_option
)
273 enum compress_type type
= check_compressed_archive ();
278 /* FD is not needed any more */
281 hit_eof
= false; /* It might have been set by find_next_block in
282 check_compressed_archive */
284 /* Open compressed archive */
285 use_compress_program_option
= compress_program (type
);
286 child_pid
= sys_child_open_for_uncompress ();
287 read_full_records
= true;
291 record_end
= record_start
; /* set up for 1st record = # 0 */
298 print_stats (FILE *fp
, const char *text
, tarlong numbytes
)
300 char bytes
[sizeof (tarlong
) * CHAR_BIT
];
301 char abbr
[LONGEST_HUMAN_READABLE
+ 1];
302 char rate
[LONGEST_HUMAN_READABLE
+ 1];
304 int human_opts
= human_autoscale
| human_base_1024
| human_SI
| human_B
;
306 sprintf (bytes
, TARLONG_FORMAT
, numbytes
);
308 fprintf (fp
, "%s: %s (%s, %s/s)\n",
310 human_readable (numbytes
, abbr
, human_opts
, 1, 1),
311 (0 < duration
&& numbytes
/ duration
< (uintmax_t) -1
312 ? human_readable (numbytes
/ duration
, rate
, human_opts
, 1, 1)
319 switch (subcommand_option
)
321 case CREATE_SUBCOMMAND
:
323 case UPDATE_SUBCOMMAND
:
324 case APPEND_SUBCOMMAND
:
325 /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */
326 print_stats (stderr
, _("Total bytes written"),
327 prev_written
+ bytes_written
);
330 case DELETE_SUBCOMMAND
:
332 char buf
[UINTMAX_STRSIZE_BOUND
];
333 print_stats (stderr
, _("Total bytes read"),
334 records_read
* record_size
);
335 print_stats (stderr
, _("Total bytes written"),
336 prev_written
+ bytes_written
);
337 fprintf (stderr
, _("Total bytes deleted: %s\n"),
338 STRINGIFY_BIGINT ((records_read
- records_skipped
)
340 - (prev_written
+ bytes_written
), buf
));
344 case EXTRACT_SUBCOMMAND
:
345 case LIST_SUBCOMMAND
:
346 case DIFF_SUBCOMMAND
:
347 print_stats (stderr
, _("Total bytes read"),
348 records_read
* record_size
);
356 /* Compute and return the block ordinal at current_block. */
358 current_block_ordinal (void)
360 return record_start_block
+ (current_block
- record_start
);
363 /* If the EOF flag is set, reset it, as well as current_block, etc. */
370 current_block
= record_start
;
371 record_end
= record_start
+ blocking_factor
;
372 access_mode
= ACCESS_WRITE
;
376 /* Return the location of the next available input or output block.
377 Return zero for EOF. Once we have returned zero, we just keep returning
378 it, to avoid accidentally going on to the next file on the tape. */
380 find_next_block (void)
382 if (current_block
== record_end
)
387 if (current_block
== record_end
)
393 return current_block
;
396 /* Indicate that we have used all blocks up thru BLOCK. */
398 set_next_block_after (union block
*block
)
400 while (block
>= current_block
)
403 /* Do *not* flush the archive here. If we do, the same argument to
404 set_next_block_after could mean the next block (if the input record
405 is exactly one block long), which is not what is intended. */
407 if (current_block
> record_end
)
411 /* Return the number of bytes comprising the space between POINTER
412 through the end of the current buffer of blocks. This space is
413 available for filling with data, or taking data from. POINTER is
414 usually (but not always) the result of previous find_next_block call. */
416 available_space_after (union block
*pointer
)
418 return record_end
->buffer
- pointer
->buffer
;
421 /* Close file having descriptor FD, and abort if close unsuccessful. */
426 close_error (_("(pipe)"));
432 if (! record_buffer_aligned
[record_index
])
433 record_buffer_aligned
[record_index
] =
434 page_aligned_alloc (&record_buffer
[record_index
], record_size
);
436 record_start
= record_buffer_aligned
[record_index
];
437 current_block
= record_start
;
438 record_end
= record_start
+ blocking_factor
;
441 /* Open an archive file. The argument specifies whether we are
442 reading or writing, or both. */
444 _open_archive (enum access_mode wanted_access
)
446 int backed_up_flag
= 0;
448 if (record_size
== 0)
449 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
451 if (archive_names
== 0)
452 FATAL_ERROR ((0, 0, _("No archive name given")));
454 tar_stat_destroy (¤t_stat_info
);
461 /* When updating the archive, we start with reading. */
462 access_mode
= wanted_access
== ACCESS_UPDATE
? ACCESS_READ
: wanted_access
;
464 read_full_records
= read_full_records_option
;
468 if (use_compress_program_option
)
470 switch (wanted_access
)
473 child_pid
= sys_child_open_for_uncompress ();
474 read_full_records
= true;
475 record_end
= record_start
; /* set up for 1st record = # 0 */
479 child_pid
= sys_child_open_for_compress ();
483 abort (); /* Should not happen */
488 && wanted_access
== ACCESS_WRITE
489 && strcmp (archive_name_array
[0], "-") == 0)
492 else if (strcmp (archive_name_array
[0], "-") == 0)
494 read_full_records
= true; /* could be a pipe, be safe */
496 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
498 switch (wanted_access
)
502 enum compress_type type
;
504 archive
= STDIN_FILENO
;
506 type
= check_compressed_archive ();
509 _("Archive is compressed. Use %s option"),
510 compress_option (type
)));
515 archive
= STDOUT_FILENO
;
516 if (!index_file_name
)
521 archive
= STDIN_FILENO
;
522 write_archive_to_stdout
= true;
523 record_end
= record_start
; /* set up for 1st record = # 0 */
524 if (!index_file_name
)
529 else if (verify_option
)
530 archive
= rmtopen (archive_name_array
[0], O_RDWR
| O_CREAT
| O_BINARY
,
531 MODE_RW
, rsh_command_option
);
533 switch (wanted_access
)
536 archive
= open_compressed_archive ();
542 maybe_backup_file (archive_name_array
[0], 1);
545 archive
= rmtcreat (archive_name_array
[0], MODE_RW
,
550 archive
= rmtopen (archive_name_array
[0],
551 O_RDWR
| O_CREAT
| O_BINARY
,
552 MODE_RW
, rsh_command_option
);
554 if (check_compressed_archive () != ct_none
)
556 _("Cannot update compressed archives")));
561 || (! _isrmt (archive
) && !sys_get_archive_stat ()))
563 int saved_errno
= errno
;
568 open_fatal (archive_name_array
[0]);
571 sys_detect_dev_null_output ();
572 sys_save_archive_dev_ino ();
573 SET_BINARY_MODE (archive
);
575 switch (wanted_access
)
578 find_next_block (); /* read it in, check for EOF */
589 do_checkpoint (bool write
)
591 if (checkpoint_option
&& !(++checkpoint
% checkpoint_option
))
593 switch (checkpoint_style
)
600 case checkpoint_text
:
602 /* TRANSLATORS: This is a ``checkpoint of write operation'',
603 *not* ``Writing a checkpoint''.
604 E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
605 *not* ``Escribiendo un punto de comprobaci@'on'' */
606 WARN ((0, 0, _("Write checkpoint %u"), checkpoint
));
608 /* TRANSLATORS: This is a ``checkpoint of read operation'',
609 *not* ``Reading a checkpoint''.
610 E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
611 *not* ``Leyendo un punto de comprobaci@'on'' */
612 WARN ((0, 0, _("Read checkpoint %u"), checkpoint
));
618 /* Perform a write to flush the buffer. */
624 do_checkpoint (true);
625 if (tape_length_option
&& tape_length_option
<= bytes_written
)
630 else if (dev_null_output
)
631 status
= record_size
;
633 status
= sys_write_archive_buffer ();
638 /* Handle write errors on the archive. Write errors are always fatal.
639 Hitting the end of a volume does not cause a write error unless the
640 write was the first record of the volume. */
642 archive_write_error (ssize_t status
)
644 /* It might be useful to know how much was written before the error
649 print_total_stats ();
653 write_fatal_details (*archive_name_cursor
, status
, record_size
);
656 /* Handle read errors on the archive. If the read should be retried,
657 return to the caller. */
659 archive_read_error (void)
661 read_error (*archive_name_cursor
);
663 if (record_start_block
== 0)
664 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
666 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
667 then give up on reading the archive. */
669 if (read_error_count
++ > READ_ERROR_MAX
)
670 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
675 short_read (size_t status
)
677 size_t left
; /* bytes left */
678 char *more
; /* pointer to next byte to read */
680 more
= record_start
->buffer
+ status
;
681 left
= record_size
- status
;
683 while (left
% BLOCKSIZE
!= 0
684 || (left
&& status
&& read_full_records
))
687 while ((status
= rmtread (archive
, more
, left
)) == SAFE_READ_ERROR
)
688 archive_read_error ();
693 if (! read_full_records
)
695 unsigned long rest
= record_size
- left
;
698 ngettext ("Unaligned block (%lu byte) in archive",
699 "Unaligned block (%lu bytes) in archive",
704 /* User warned us about this. Fix up. */
710 /* FIXME: for size=0, multi-volume support. On the first record, warn
711 about the problem. */
713 if (!read_full_records
&& verbose_option
> 1
714 && record_start_block
== 0 && status
!= 0)
716 unsigned long rsize
= (record_size
- left
) / BLOCKSIZE
;
718 ngettext ("Record size = %lu block",
719 "Record size = %lu blocks",
724 record_end
= record_start
+ (record_size
- left
) / BLOCKSIZE
;
728 /* Flush the current buffer to/from the archive. */
732 size_t buffer_level
= current_block
->buffer
- record_start
->buffer
;
733 record_start_block
+= record_end
- record_start
;
734 current_block
= record_start
;
735 record_end
= record_start
+ blocking_factor
;
737 if (access_mode
== ACCESS_READ
&& time_to_start_writing
)
739 access_mode
= ACCESS_WRITE
;
740 time_to_start_writing
= false;
751 flush_write_ptr (buffer_level
);
759 /* Backspace the archive descriptor by one record worth. If it's a
760 tape, MTIOCTOP will work. If it's something else, try to seek on
761 it. If we can't seek, we lose! */
763 backspace_output (void)
767 struct mtop operation
;
769 operation
.mt_op
= MTBSR
;
770 operation
.mt_count
= 1;
771 if (rmtioctl (archive
, MTIOCTOP
, (char *) &operation
) >= 0)
773 if (errno
== EIO
&& rmtioctl (archive
, MTIOCTOP
, (char *) &operation
) >= 0)
779 off_t position
= rmtlseek (archive
, (off_t
) 0, SEEK_CUR
);
781 /* Seek back to the beginning of this record and start writing there. */
783 position
-= record_size
;
786 if (rmtlseek (archive
, position
, SEEK_SET
) != position
)
788 /* Lseek failed. Try a different method. */
791 _("Cannot backspace archive file; it may be unreadable without -i")));
793 /* Replace the first part of the record with NULs. */
795 if (record_start
->buffer
!= output_start
)
796 memset (record_start
->buffer
, 0,
797 output_start
- record_start
->buffer
);
803 seek_archive (off_t size
)
805 off_t start
= current_block_ordinal ();
808 off_t skipped
= (blocking_factor
- (current_block
- record_start
));
810 size
-= skipped
* BLOCKSIZE
;
812 if (size
< record_size
)
816 /* Compute number of records to skip */
817 nrec
= size
/ record_size
;
818 offset
= rmtlseek (archive
, nrec
* record_size
, SEEK_CUR
);
822 if (offset
% record_size
)
823 FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
825 /* Convert to number of records */
827 /* Compute number of skipped blocks */
828 nblk
= offset
- start
;
830 /* Update buffering info */
831 records_read
+= nblk
/ blocking_factor
;
832 record_start_block
= offset
- blocking_factor
;
833 current_block
= record_end
;
838 /* Close the archive file. */
842 if (time_to_start_writing
|| access_mode
== ACCESS_WRITE
)
845 if (current_block
> record_start
)
849 sys_drain_input_pipe ();
855 if (rmtclose (archive
) != 0)
856 close_warn (*archive_name_cursor
);
858 sys_wait_for_child (child_pid
);
860 tar_stat_destroy (¤t_stat_info
);
865 free (record_buffer
[0]);
866 free (record_buffer
[1]);
869 /* Called to initialize the global volume number. */
871 init_volume_number (void)
873 FILE *file
= fopen (volno_file_option
, "r");
877 if (fscanf (file
, "%d", &global_volno
) != 1
879 FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
880 quotearg_colon (volno_file_option
)));
882 read_error (volno_file_option
);
883 if (fclose (file
) != 0)
884 close_error (volno_file_option
);
886 else if (errno
!= ENOENT
)
887 open_error (volno_file_option
);
890 /* Called to write out the closing global volume number. */
892 closeout_volume_number (void)
894 FILE *file
= fopen (volno_file_option
, "w");
898 fprintf (file
, "%d\n", global_volno
);
900 write_error (volno_file_option
);
901 if (fclose (file
) != 0)
902 close_error (volno_file_option
);
905 open_error (volno_file_option
);
910 increase_volume_number ()
913 if (global_volno
< 0)
914 FATAL_ERROR ((0, 0, _("Volume number overflow")));
919 change_tape_menu (FILE *read_file
)
921 char *input_buffer
= NULL
;
927 fputc ('\007', stderr
);
929 _("Prepare volume #%d for %s and hit return: "),
930 global_volno
+ 1, quote (*archive_name_cursor
));
933 if (getline (&input_buffer
, &size
, read_file
) <= 0)
935 WARN ((0, 0, _("EOF where user reply was expected")));
937 if (subcommand_option
!= EXTRACT_SUBCOMMAND
938 && subcommand_option
!= LIST_SUBCOMMAND
939 && subcommand_option
!= DIFF_SUBCOMMAND
)
940 WARN ((0, 0, _("WARNING: Archive is incomplete")));
945 if (input_buffer
[0] == '\n'
946 || input_buffer
[0] == 'y'
947 || input_buffer
[0] == 'Y')
950 switch (input_buffer
[0])
954 fprintf (stderr
, _("\
955 n name Give a new file name for the next (and subsequent) volume(s)\n\
957 y or newline Continue operation\n"));
958 if (!restrict_option
)
959 fprintf (stderr
, _(" ! Spawn a subshell\n"));
960 fprintf (stderr
, _(" ? Print this list\n"));
967 WARN ((0, 0, _("No new volume; exiting.\n")));
969 if (subcommand_option
!= EXTRACT_SUBCOMMAND
970 && subcommand_option
!= LIST_SUBCOMMAND
971 && subcommand_option
!= DIFF_SUBCOMMAND
)
972 WARN ((0, 0, _("WARNING: Archive is incomplete")));
977 /* Get new file name. */
983 for (name
= input_buffer
+ 1;
984 *name
== ' ' || *name
== '\t';
988 for (cursor
= name
; *cursor
&& *cursor
!= '\n'; cursor
++)
994 /* FIXME: the following allocation is never reclaimed. */
995 *archive_name_cursor
= xstrdup (name
);
999 fprintf (stderr
, "%s",
1000 _("File name not specified. Try again.\n"));
1005 if (!restrict_option
)
1013 fprintf (stderr
, _("Invalid input. Type ? for help.\n"));
1016 free (input_buffer
);
1019 /* We've hit the end of the old volume. Close it and open the next one.
1020 Return nonzero on success.
1023 new_volume (enum access_mode mode
)
1025 static FILE *read_file
;
1029 if (!read_file
&& !info_script_option
)
1030 /* FIXME: if fopen is used, it will never be closed. */
1031 read_file
= archive
== STDIN_FILENO
? fopen (TTY_NAME
, "r") : stdin
;
1038 assign_string (&volume_label
, NULL
);
1039 assign_string (&continued_file_name
, NULL
);
1040 continued_file_size
= continued_file_offset
= 0;
1041 current_block
= record_start
;
1043 if (rmtclose (archive
) != 0)
1044 close_warn (*archive_name_cursor
);
1046 archive_name_cursor
++;
1047 if (archive_name_cursor
== archive_name_array
+ archive_names
)
1049 archive_name_cursor
= archive_name_array
;
1057 /* We have to prompt from now on. */
1059 if (info_script_option
)
1061 if (volno_file_option
)
1062 closeout_volume_number ();
1063 if (sys_exec_info_script (archive_name_cursor
, global_volno
+1))
1064 FATAL_ERROR ((0, 0, _("%s command failed"),
1065 quote (info_script_option
)));
1068 change_tape_menu (read_file
);
1071 if (strcmp (archive_name_cursor
[0], "-") == 0)
1073 read_full_records
= true;
1074 archive
= STDIN_FILENO
;
1076 else if (verify_option
)
1077 archive
= rmtopen (*archive_name_cursor
, O_RDWR
| O_CREAT
, MODE_RW
,
1078 rsh_command_option
);
1083 archive
= rmtopen (*archive_name_cursor
, O_RDONLY
, MODE_RW
,
1084 rsh_command_option
);
1089 maybe_backup_file (*archive_name_cursor
, 1);
1090 archive
= rmtcreat (*archive_name_cursor
, MODE_RW
,
1091 rsh_command_option
);
1095 archive
= rmtopen (*archive_name_cursor
, O_RDWR
| O_CREAT
, MODE_RW
,
1096 rsh_command_option
);
1102 open_warn (*archive_name_cursor
);
1103 if (!verify_option
&& mode
== ACCESS_WRITE
&& backup_option
)
1104 undo_last_backup ();
1109 SET_BINARY_MODE (archive
);
1115 read_header0 (struct tar_stat_info
*info
)
1117 enum read_header rc
;
1119 tar_stat_init (info
);
1120 rc
= read_header_primitive (false, info
);
1121 if (rc
== HEADER_SUCCESS
)
1123 set_next_block_after (current_header
);
1126 ERROR ((0, 0, _("This does not look like a tar archive")));
1134 union block
*header
;
1137 switch (subcommand_option
)
1139 case APPEND_SUBCOMMAND
:
1140 case CAT_SUBCOMMAND
:
1141 case UPDATE_SUBCOMMAND
:
1142 access
= ACCESS_UPDATE
;
1146 access
= ACCESS_READ
;
1150 if (!new_volume (access
))
1153 while ((status
= rmtread (archive
, record_start
->buffer
, record_size
))
1155 archive_read_error ();
1157 if (status
!= record_size
)
1158 short_read (status
);
1160 header
= find_next_block ();
1164 switch (header
->header
.typeflag
)
1168 if (!read_header0 (&dummy
))
1170 xheader_decode (&dummy
); /* decodes values from the global header */
1171 tar_stat_destroy (&dummy
);
1174 /* We have read the extended header of the first member in
1175 this volume. Put it back, so next read_header works as
1177 current_block
= record_start
;
1182 case GNUTYPE_VOLHDR
:
1183 if (!read_header0 (&dummy
))
1185 tar_stat_destroy (&dummy
);
1186 assign_string (&volume_label
, current_header
->header
.name
);
1187 set_next_block_after (header
);
1188 header
= find_next_block ();
1189 if (header
->header
.typeflag
!= GNUTYPE_MULTIVOL
)
1193 case GNUTYPE_MULTIVOL
:
1194 if (!read_header0 (&dummy
))
1196 tar_stat_destroy (&dummy
);
1197 assign_string (&continued_file_name
, current_header
->header
.name
);
1198 continued_file_size
=
1199 UINTMAX_FROM_HEADER (current_header
->header
.size
);
1200 continued_file_offset
=
1201 UINTMAX_FROM_HEADER (current_header
->oldgnu_header
.offset
);
1211 if (!continued_file_name
1212 || strcmp (continued_file_name
, real_s_name
))
1214 if ((archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
1215 && strlen (real_s_name
) >= NAME_FIELD_SIZE
1216 && strncmp (continued_file_name
, real_s_name
,
1217 NAME_FIELD_SIZE
) == 0)
1219 _("%s is possibly continued on this volume: header contains truncated name"),
1220 quote (real_s_name
)));
1223 WARN ((0, 0, _("%s is not continued on this volume"),
1224 quote (real_s_name
)));
1229 s
= continued_file_size
+ continued_file_offset
;
1231 if (real_s_totsize
!= s
|| s
< continued_file_offset
)
1233 char totsizebuf
[UINTMAX_STRSIZE_BOUND
];
1234 char s1buf
[UINTMAX_STRSIZE_BOUND
];
1235 char s2buf
[UINTMAX_STRSIZE_BOUND
];
1237 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
1238 quote (continued_file_name
),
1239 STRINGIFY_BIGINT (save_totsize
, totsizebuf
),
1240 STRINGIFY_BIGINT (continued_file_size
, s1buf
),
1241 STRINGIFY_BIGINT (continued_file_offset
, s2buf
)));
1245 if (real_s_totsize
- real_s_sizeleft
!= continued_file_offset
)
1247 WARN ((0, 0, _("This volume is out of sequence")));
1252 increase_volume_number ();
1257 /* Check the LABEL block against the volume label, seen as a globbing
1258 pattern. Return true if the pattern matches. In case of failure,
1259 retry matching a volume sequence number before giving up in
1260 multi-volume mode. */
1262 check_label_pattern (union block
*label
)
1267 if (! memchr (label
->header
.name
, '\0', sizeof label
->header
.name
))
1270 if (fnmatch (volume_label_option
, label
->header
.name
, 0) == 0)
1273 if (!multi_volume_option
)
1276 string
= xmalloc (strlen (volume_label_option
)
1277 + sizeof VOLUME_LABEL_APPEND
+ 1);
1278 strcpy (string
, volume_label_option
);
1279 strcat (string
, VOLUME_LABEL_APPEND
);
1280 result
= fnmatch (string
, label
->header
.name
, 0) == 0;
1285 /* Check if the next block contains a volume label and if this matches
1286 the one given in the command line */
1288 match_volume_label (void)
1290 union block
*label
= find_next_block ();
1293 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1294 quote (volume_label_option
)));
1295 if (!check_label_pattern (label
))
1296 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
1297 quote_n (0, label
->header
.name
),
1298 quote_n (1, volume_label_option
)));
1301 /* Mark the archive with volume label STR. */
1303 _write_volume_label (const char *str
)
1305 if (archive_format
== POSIX_FORMAT
)
1306 xheader_store ("GNU.volume.label", &dummy
, str
);
1309 union block
*label
= find_next_block ();
1311 memset (label
, 0, BLOCKSIZE
);
1313 strcpy (label
->header
.name
, volume_label_option
);
1314 assign_string (¤t_stat_info
.file_name
,
1315 label
->header
.name
);
1316 current_stat_info
.had_trailing_slash
=
1317 strip_trailing_slashes (current_stat_info
.file_name
);
1319 label
->header
.typeflag
= GNUTYPE_VOLHDR
;
1320 TIME_TO_CHARS (start_time
.tv_sec
, label
->header
.mtime
);
1321 finish_header (¤t_stat_info
, label
, -1);
1322 set_next_block_after (label
);
1326 #define VOL_SUFFIX "Volume"
1328 /* Add a volume label to a part of multi-volume archive */
1330 add_volume_label (void)
1332 char buf
[UINTMAX_STRSIZE_BOUND
];
1333 char *p
= STRINGIFY_BIGINT (volno
, buf
);
1334 char *s
= xmalloc (strlen (volume_label_option
) + sizeof VOL_SUFFIX
1336 sprintf (s
, "%s %s %s", volume_label_option
, VOL_SUFFIX
, p
);
1337 _write_volume_label (s
);
1344 if (archive_format
== POSIX_FORMAT
)
1346 off_t block_ordinal
;
1348 struct tar_stat_info st
;
1349 static size_t real_s_part_no
; /* FIXME */
1352 memset (&st
, 0, sizeof st
);
1353 st
.orig_file_name
= st
.file_name
= real_s_name
;
1354 st
.stat
.st_mode
= S_IFREG
|S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
;
1355 st
.stat
.st_uid
= getuid ();
1356 st
.stat
.st_gid
= getgid ();
1357 st
.orig_file_name
= xheader_format_name (&st
,
1358 "%d/GNUFileParts.%p/%f.%n",
1360 st
.file_name
= st
.orig_file_name
;
1361 st
.archive_file_size
= st
.stat
.st_size
= real_s_sizeleft
;
1363 block_ordinal
= current_block_ordinal ();
1364 blk
= start_header (&st
);
1366 abort (); /* FIXME */
1367 finish_header (&st
, blk
, block_ordinal
);
1368 free (st
.orig_file_name
);
1373 /* Add a volume label to the current archive */
1375 write_volume_label (void)
1377 if (multi_volume_option
)
1378 add_volume_label ();
1380 _write_volume_label (volume_label_option
);
1383 /* Write GNU multi-volume header */
1385 gnu_add_multi_volume_header (void)
1388 union block
*block
= find_next_block ();
1390 if (strlen (real_s_name
) > NAME_FIELD_SIZE
)
1392 _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
1393 quotearg_colon (real_s_name
)));
1395 memset (block
, 0, BLOCKSIZE
);
1397 /* FIXME: Michael P Urban writes: [a long name file] is being written
1398 when a new volume rolls around [...] Looks like the wrong value is
1399 being preserved in real_s_name, though. */
1401 strncpy (block
->header
.name
, real_s_name
, NAME_FIELD_SIZE
);
1402 block
->header
.typeflag
= GNUTYPE_MULTIVOL
;
1404 OFF_TO_CHARS (real_s_sizeleft
, block
->header
.size
);
1405 OFF_TO_CHARS (real_s_totsize
- real_s_sizeleft
,
1406 block
->oldgnu_header
.offset
);
1408 tmp
= verbose_option
;
1410 finish_header (¤t_stat_info
, block
, -1);
1411 verbose_option
= tmp
;
1412 set_next_block_after (block
);
1415 /* Add a multi volume header to the current archive. The exact header format
1416 depends on the archive format. */
1418 add_multi_volume_header (void)
1420 if (archive_format
== POSIX_FORMAT
)
1422 off_t d
= real_s_totsize
- real_s_sizeleft
;
1423 xheader_store ("GNU.volume.filename", &dummy
, real_s_name
);
1424 xheader_store ("GNU.volume.size", &dummy
, &real_s_sizeleft
);
1425 xheader_store ("GNU.volume.offset", &dummy
, &d
);
1428 gnu_add_multi_volume_header ();
1431 /* Synchronize multi-volume globals */
1433 multi_volume_sync ()
1435 if (multi_volume_option
)
1439 assign_string (&real_s_name
,
1440 safer_name_suffix (save_name
, false,
1441 absolute_names_option
));
1442 real_s_totsize
= save_totsize
;
1443 real_s_sizeleft
= save_sizeleft
;
1447 assign_string (&real_s_name
, 0);
1449 real_s_sizeleft
= 0;
1455 /* Low-level flush functions */
1457 /* Simple flush read (no multi-volume or label extensions) */
1459 simple_flush_read (void)
1461 size_t status
; /* result from system call */
1463 do_checkpoint (false);
1465 /* Clear the count of errors. This only applies to a single call to
1468 read_error_count
= 0; /* clear error count */
1470 if (write_archive_to_stdout
&& record_start_block
!= 0)
1472 archive
= STDOUT_FILENO
;
1473 status
= sys_write_archive_buffer ();
1474 archive
= STDIN_FILENO
;
1475 if (status
!= record_size
)
1476 archive_write_error (status
);
1481 status
= rmtread (archive
, record_start
->buffer
, record_size
);
1482 if (status
== record_size
)
1487 if (status
== SAFE_READ_ERROR
)
1489 archive_read_error ();
1490 continue; /* try again */
1494 short_read (status
);
1497 /* Simple flush write (no multi-volume or label extensions) */
1499 simple_flush_write (size_t level
__attribute__((unused
)))
1503 status
= _flush_write ();
1504 if (status
!= record_size
)
1505 archive_write_error (status
);
1509 bytes_written
+= status
;
1514 /* GNU flush functions. These support multi-volume and archive labels in
1515 GNU and PAX archive formats. */
1518 _gnu_flush_read (void)
1520 size_t status
; /* result from system call */
1522 do_checkpoint (false);
1524 /* Clear the count of errors. This only applies to a single call to
1527 read_error_count
= 0; /* clear error count */
1529 if (write_archive_to_stdout
&& record_start_block
!= 0)
1531 archive
= STDOUT_FILENO
;
1532 status
= sys_write_archive_buffer ();
1533 archive
= STDIN_FILENO
;
1534 if (status
!= record_size
)
1535 archive_write_error (status
);
1538 multi_volume_sync ();
1542 status
= rmtread (archive
, record_start
->buffer
, record_size
);
1543 if (status
== record_size
)
1549 /* The condition below used to include
1550 || (status > 0 && !read_full_records)
1551 This is incorrect since even if new_volume() succeeds, the
1552 subsequent call to rmtread will overwrite the chunk of data
1553 already read in the buffer, so the processing will fail */
1555 || (status
== SAFE_READ_ERROR
&& errno
== ENOSPC
))
1556 && multi_volume_option
)
1558 while (!try_new_volume ())
1562 else if (status
== SAFE_READ_ERROR
)
1564 archive_read_error ();
1569 short_read (status
);
1573 gnu_flush_read (void)
1575 flush_read_ptr
= simple_flush_read
; /* Avoid recursion */
1577 flush_read_ptr
= gnu_flush_read
;
1581 _gnu_flush_write (size_t buffer_level
)
1584 union block
*header
;
1589 status
= _flush_write ();
1590 if (status
!= record_size
&& !multi_volume_option
)
1591 archive_write_error (status
);
1595 bytes_written
+= status
;
1598 if (status
== record_size
)
1600 multi_volume_sync ();
1604 /* In multi-volume mode. */
1605 /* ENXIO is for the UNIX PC. */
1606 if (status
< 0 && errno
!= ENOSPC
&& errno
!= EIO
&& errno
!= ENXIO
)
1607 archive_write_error (status
);
1609 if (!new_volume (ACCESS_WRITE
))
1612 tar_stat_destroy (&dummy
);
1614 increase_volume_number ();
1615 prev_written
+= bytes_written
;
1618 copy_ptr
= record_start
->buffer
+ status
;
1619 copy_size
= buffer_level
- status
;
1620 /* Switch to the next buffer */
1621 record_index
= !record_index
;
1624 if (volume_label_option
)
1625 add_volume_label ();
1628 add_multi_volume_header ();
1630 write_extended (true, &dummy
, find_next_block ());
1631 tar_stat_destroy (&dummy
);
1634 add_chunk_header ();
1635 header
= find_next_block ();
1636 bufsize
= available_space_after (header
);
1637 while (bufsize
< copy_size
)
1639 memcpy (header
->buffer
, copy_ptr
, bufsize
);
1640 copy_ptr
+= bufsize
;
1641 copy_size
-= bufsize
;
1642 set_next_block_after (header
+ (bufsize
- 1) / BLOCKSIZE
);
1643 header
= find_next_block ();
1644 bufsize
= available_space_after (header
);
1646 memcpy (header
->buffer
, copy_ptr
, copy_size
);
1647 memset (header
->buffer
+ copy_size
, 0, bufsize
- copy_size
);
1648 set_next_block_after (header
+ (copy_size
- 1) / BLOCKSIZE
);
1653 gnu_flush_write (size_t buffer_level
)
1655 flush_write_ptr
= simple_flush_write
; /* Avoid recursion */
1656 _gnu_flush_write (buffer_level
);
1657 flush_write_ptr
= gnu_flush_write
;
1669 flush_write_ptr (record_size
);
1673 open_archive (enum access_mode wanted_access
)
1675 flush_read_ptr
= gnu_flush_read
;
1676 flush_write_ptr
= gnu_flush_write
;
1678 _open_archive (wanted_access
);
1679 switch (wanted_access
)
1682 if (volume_label_option
)
1683 match_volume_label ();
1687 records_written
= 0;
1688 if (volume_label_option
)
1689 write_volume_label ();
1695 set_volume_start_time ();