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_none, /* Unknown compression type */
265 ct_tar, /* Plain tar file */
275 static enum compress_type archive_compression_type = ct_none;
279 enum compress_type type;
286 enum compress_type type;
291 static struct zip_magic const magic[] = {
294 { ct_compress, 2, "\037\235" },
295 { ct_gzip, 2, "\037\213" },
296 { ct_bzip2, 3, "BZh" },
297 { ct_lzip, 4, "LZIP" },
298 { ct_lzma, 6, "\xFFLZMA" },
299 { ct_lzop, 4, "\211LZO" },
300 { ct_xz, 6, "\xFD" "7zXZ" },
303 #define NMAGIC (sizeof(magic)/sizeof(magic[0]))
305 static struct zip_program zip_program[] = {
306 { ct_compress, COMPRESS_PROGRAM, "-Z" },
307 { ct_compress, GZIP_PROGRAM, "-z" },
308 { ct_gzip, GZIP_PROGRAM, "-z" },
309 { ct_bzip2, BZIP2_PROGRAM, "-j" },
310 { ct_bzip2, "lbzip2", "-j" },
311 { ct_lzip, LZIP_PROGRAM, "--lzip" },
312 { ct_lzma, LZMA_PROGRAM, "--lzma" },
313 { ct_lzma, XZ_PROGRAM, "-J" },
314 { ct_lzop, LZOP_PROGRAM, "--lzop" },
315 { ct_xz, XZ_PROGRAM, "-J" },
319 static struct zip_program const *
320 find_zip_program (enum compress_type type, int *pstate)
324 for (i = *pstate; zip_program[i].type != ct_none; i++)
326 if (zip_program[i].type == type)
329 return zip_program + i;
337 first_decompress_program (int *pstate)
339 struct zip_program const *zp;
341 if (use_compress_program_option)
342 return use_compress_program_option;
344 if (archive_compression_type == ct_none)
348 zp = find_zip_program (archive_compression_type, pstate);
349 return zp ? zp->program : NULL;
353 next_decompress_program (int *pstate)
355 struct zip_program const *zp;
357 if (use_compress_program_option)
359 zp = find_zip_program (archive_compression_type, pstate);
360 return zp ? zp->program : NULL;
364 compress_option (enum compress_type type)
366 struct zip_program const *zp;
368 zp = find_zip_program (type, &i);
369 return zp ? zp->option : NULL;
372 /* Check if the file ARCHIVE is a compressed archive. */
373 static enum compress_type
374 check_compressed_archive (bool *pshort)
376 struct zip_magic const *p;
383 /* Prepare global data needed for find_next_block: */
384 record_end = record_start; /* set up for 1st record = # 0 */
385 sfr = read_full_records;
386 read_full_records = true; /* Suppress fatal error on reading a partial
388 *pshort = find_next_block () == 0;
390 /* Restore global values */
391 read_full_records = sfr;
393 if (tar_checksum (record_start, true) == HEADER_SUCCESS)
394 /* Probably a valid header */
397 for (p = magic + 2; p < magic + NMAGIC; p++)
398 if (memcmp (record_start->buffer, p->magic, p->length) == 0)
404 /* Guess if the archive is seekable. */
406 guess_seekable_archive (void)
410 if (subcommand_option == DELETE_SUBCOMMAND)
412 /* The current code in delete.c is based on the assumption that
413 skip_member() reads all data from the archive. So, we should
414 make sure it won't use seeks. On the other hand, the same code
415 depends on the ability to backspace a record in the archive,
416 so setting seekable_archive to false is technically incorrect.
417 However, it is tested only in skip_member(), so it's not a
419 seekable_archive = false;
422 if (seek_option != -1)
424 seekable_archive = !!seek_option;
428 if (!multi_volume_option && !use_compress_program_option
429 && fstat (archive, &st) == 0)
430 seekable_archive = S_ISREG (st.st_mode);
432 seekable_archive = false;
435 /* Open an archive named archive_name_array[0]. Detect if it is
436 a compressed archive of known type and use corresponding decompression
439 open_compressed_archive (void)
441 archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
442 MODE_RW, rsh_command_option);
446 if (!multi_volume_option)
448 if (!use_compress_program_option)
451 enum compress_type type = check_compressed_archive (&shortfile);
457 ERROR ((0, 0, _("This does not look like a tar archive")));
462 ERROR ((0, 0, _("This does not look like a tar archive")));
463 set_compression_program_by_suffix (archive_name_array[0], NULL);
464 if (!use_compress_program_option)
469 archive_compression_type = type;
474 /* FD is not needed any more */
477 hit_eof = false; /* It might have been set by find_next_block in
478 check_compressed_archive */
480 /* Open compressed archive */
481 child_pid = sys_child_open_for_uncompress ();
482 read_full_records = true;
486 record_end = record_start; /* set up for 1st record = # 0 */
493 print_stats (FILE *fp, const char *text, tarlong numbytes)
495 char bytes[sizeof (tarlong) * CHAR_BIT];
496 char abbr[LONGEST_HUMAN_READABLE + 1];
497 char rate[LONGEST_HUMAN_READABLE + 1];
499 int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
501 sprintf (bytes, TARLONG_FORMAT, numbytes);
503 fprintf (fp, "%s: %s (%s, %s/s)\n",
505 human_readable (numbytes, abbr, human_opts, 1, 1),
506 (0 < duration && numbytes / duration < (uintmax_t) -1
507 ? human_readable (numbytes / duration, rate, human_opts, 1, 1)
514 switch (subcommand_option)
516 case CREATE_SUBCOMMAND:
518 case UPDATE_SUBCOMMAND:
519 case APPEND_SUBCOMMAND:
520 /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */
521 print_stats (stderr, _("Total bytes written"),
522 prev_written + bytes_written);
525 case DELETE_SUBCOMMAND:
527 char buf[UINTMAX_STRSIZE_BOUND];
528 print_stats (stderr, _("Total bytes read"),
529 records_read * record_size);
530 print_stats (stderr, _("Total bytes written"),
531 prev_written + bytes_written);
532 fprintf (stderr, _("Total bytes deleted: %s\n"),
533 STRINGIFY_BIGINT ((records_read - records_skipped)
535 - (prev_written + bytes_written), buf));
539 case EXTRACT_SUBCOMMAND:
540 case LIST_SUBCOMMAND:
541 case DIFF_SUBCOMMAND:
542 print_stats (stderr, _("Total bytes read"),
543 records_read * record_size);
551 /* Compute and return the block ordinal at current_block. */
553 current_block_ordinal (void)
555 return record_start_block + (current_block - record_start);
558 /* If the EOF flag is set, reset it, as well as current_block, etc. */
565 current_block = record_start;
566 record_end = record_start + blocking_factor;
567 access_mode = ACCESS_WRITE;
571 /* Return the location of the next available input or output block.
572 Return zero for EOF. Once we have returned zero, we just keep returning
573 it, to avoid accidentally going on to the next file on the tape. */
575 find_next_block (void)
577 if (current_block == record_end)
582 if (current_block == record_end)
588 return current_block;
591 /* Indicate that we have used all blocks up thru BLOCK. */
593 set_next_block_after (union block *block)
595 while (block >= current_block)
598 /* Do *not* flush the archive here. If we do, the same argument to
599 set_next_block_after could mean the next block (if the input record
600 is exactly one block long), which is not what is intended. */
602 if (current_block > record_end)
606 /* Return the number of bytes comprising the space between POINTER
607 through the end of the current buffer of blocks. This space is
608 available for filling with data, or taking data from. POINTER is
609 usually (but not always) the result of previous find_next_block call. */
611 available_space_after (union block *pointer)
613 return record_end->buffer - pointer->buffer;
616 /* Close file having descriptor FD, and abort if close unsuccessful. */
621 close_error (_("(pipe)"));
627 if (! record_buffer_aligned[record_index])
628 record_buffer_aligned[record_index] =
629 page_aligned_alloc (&record_buffer[record_index], record_size);
631 record_start = record_buffer_aligned[record_index];
632 current_block = record_start;
633 record_end = record_start + blocking_factor;
636 /* Open an archive file. The argument specifies whether we are
637 reading or writing, or both. */
639 _open_archive (enum access_mode wanted_access)
641 int backed_up_flag = 0;
643 if (record_size == 0)
644 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
646 if (archive_names == 0)
647 FATAL_ERROR ((0, 0, _("No archive name given")));
649 tar_stat_destroy (¤t_stat_info);
654 /* When updating the archive, we start with reading. */
655 access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
657 read_full_records = read_full_records_option;
661 if (use_compress_program_option)
663 switch (wanted_access)
666 child_pid = sys_child_open_for_uncompress ();
667 read_full_records = true;
668 record_end = record_start; /* set up for 1st record = # 0 */
672 child_pid = sys_child_open_for_compress ();
676 abort (); /* Should not happen */
681 && wanted_access == ACCESS_WRITE
682 && strcmp (archive_name_array[0], "-") == 0)
685 else if (strcmp (archive_name_array[0], "-") == 0)
687 read_full_records = true; /* could be a pipe, be safe */
689 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
691 switch (wanted_access)
696 enum compress_type type;
698 archive = STDIN_FILENO;
700 type = check_compressed_archive (&shortfile);
701 if (type != ct_tar && type != ct_none)
703 _("Archive is compressed. Use %s option"),
704 compress_option (type)));
706 ERROR ((0, 0, _("This does not look like a tar archive")));
711 archive = STDOUT_FILENO;
712 if (!index_file_name)
717 archive = STDIN_FILENO;
718 write_archive_to_stdout = true;
719 record_end = record_start; /* set up for 1st record = # 0 */
720 if (!index_file_name)
725 else if (verify_option)
726 archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
727 MODE_RW, rsh_command_option);
729 switch (wanted_access)
732 archive = open_compressed_archive ();
734 guess_seekable_archive ();
740 maybe_backup_file (archive_name_array[0], 1);
743 archive = rmtcreat (archive_name_array[0], MODE_RW,
748 archive = rmtopen (archive_name_array[0],
749 O_RDWR | O_CREAT | O_BINARY,
750 MODE_RW, rsh_command_option);
752 switch (check_compressed_archive (NULL))
760 _("Cannot update compressed archives")));
766 || (! _isrmt (archive) && !sys_get_archive_stat ()))
768 int saved_errno = errno;
773 open_fatal (archive_name_array[0]);
776 sys_detect_dev_null_output ();
777 sys_save_archive_dev_ino ();
778 SET_BINARY_MODE (archive);
780 switch (wanted_access)
783 find_next_block (); /* read it in, check for EOF */
793 /* Perform a write to flush the buffer. */
799 checkpoint_run (true);
800 if (tape_length_option && tape_length_option <= bytes_written)
805 else if (dev_null_output)
806 status = record_size;
808 status = sys_write_archive_buffer ();
810 if (status && multi_volume_option && !inhibit_map)
812 struct bufmap *map = bufmap_locate (status);
815 size_t delta = status - map->start * BLOCKSIZE;
816 if (delta > map->sizeleft)
817 delta = map->sizeleft;
818 map->sizeleft -= delta;
819 if (map->sizeleft == 0)
821 bufmap_reset (map, map ? (- map->start) : 0);
827 /* Handle write errors on the archive. Write errors are always fatal.
828 Hitting the end of a volume does not cause a write error unless the
829 write was the first record of the volume. */
831 archive_write_error (ssize_t status)
833 /* It might be useful to know how much was written before the error
838 print_total_stats ();
842 write_fatal_details (*archive_name_cursor, status, record_size);
845 /* Handle read errors on the archive. If the read should be retried,
846 return to the caller. */
848 archive_read_error (void)
850 read_error (*archive_name_cursor);
852 if (record_start_block == 0)
853 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
855 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
856 then give up on reading the archive. */
858 if (read_error_count++ > READ_ERROR_MAX)
859 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
864 archive_is_dev (void)
868 if (fstat (archive, &st))
870 stat_diag (*archive_name_cursor);
873 return S_ISBLK (st.st_mode) || S_ISCHR (st.st_mode);
877 short_read (size_t status)
879 size_t left; /* bytes left */
880 char *more; /* pointer to next byte to read */
882 more = record_start->buffer + status;
883 left = record_size - status;
885 if (left && left % BLOCKSIZE == 0
887 && record_start_block == 0 && status != 0
888 && archive_is_dev ())
890 unsigned long rsize = status / BLOCKSIZE;
892 ngettext ("Record size = %lu block",
893 "Record size = %lu blocks",
898 while (left % BLOCKSIZE != 0
899 || (left && status && read_full_records))
902 while ((status = rmtread (archive, more, left)) == SAFE_READ_ERROR)
903 archive_read_error ();
908 if (! read_full_records)
910 unsigned long rest = record_size - left;
913 ngettext ("Unaligned block (%lu byte) in archive",
914 "Unaligned block (%lu bytes) in archive",
923 record_end = record_start + (record_size - left) / BLOCKSIZE;
927 /* Flush the current buffer to/from the archive. */
931 size_t buffer_level = current_block->buffer - record_start->buffer;
932 record_start_block += record_end - record_start;
933 current_block = record_start;
934 record_end = record_start + blocking_factor;
936 if (access_mode == ACCESS_READ && time_to_start_writing)
938 access_mode = ACCESS_WRITE;
939 time_to_start_writing = false;
950 flush_write_ptr (buffer_level);
958 /* Backspace the archive descriptor by one record worth. If it's a
959 tape, MTIOCTOP will work. If it's something else, try to seek on
960 it. If we can't seek, we lose! */
962 backspace_output (void)
966 struct mtop operation;
968 operation.mt_op = MTBSR;
969 operation.mt_count = 1;
970 if (rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
972 if (errno == EIO && rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
978 off_t position = rmtlseek (archive, (off_t) 0, SEEK_CUR);
980 /* Seek back to the beginning of this record and start writing there. */
982 position -= record_size;
985 if (rmtlseek (archive, position, SEEK_SET) != position)
987 /* Lseek failed. Try a different method. */
990 _("Cannot backspace archive file; it may be unreadable without -i")));
992 /* Replace the first part of the record with NULs. */
994 if (record_start->buffer != output_start)
995 memset (record_start->buffer, 0,
996 output_start - record_start->buffer);
1002 seek_archive (off_t size)
1004 off_t start = current_block_ordinal ();
1007 off_t skipped = (blocking_factor - (current_block - record_start))
1010 if (size <= skipped)
1013 /* Compute number of records to skip */
1014 nrec = (size - skipped) / record_size;
1017 offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
1021 if (offset % record_size)
1022 FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
1024 /* Convert to number of records */
1025 offset /= BLOCKSIZE;
1026 /* Compute number of skipped blocks */
1027 nblk = offset - start;
1029 /* Update buffering info */
1030 records_read += nblk / blocking_factor;
1031 record_start_block = offset - blocking_factor;
1032 current_block = record_end;
1037 /* Close the archive file. */
1039 close_archive (void)
1041 if (time_to_start_writing || access_mode == ACCESS_WRITE)
1044 if (current_block > record_start)
1048 compute_duration ();
1052 if (rmtclose (archive) != 0)
1053 close_error (*archive_name_cursor);
1055 sys_wait_for_child (child_pid, hit_eof);
1057 tar_stat_destroy (¤t_stat_info);
1058 free (record_buffer[0]);
1059 free (record_buffer[1]);
1063 /* Called to initialize the global volume number. */
1065 init_volume_number (void)
1067 FILE *file = fopen (volno_file_option, "r");
1071 if (fscanf (file, "%d", &global_volno) != 1
1072 || global_volno < 0)
1073 FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
1074 quotearg_colon (volno_file_option)));
1076 read_error (volno_file_option);
1077 if (fclose (file) != 0)
1078 close_error (volno_file_option);
1080 else if (errno != ENOENT)
1081 open_error (volno_file_option);
1084 /* Called to write out the closing global volume number. */
1086 closeout_volume_number (void)
1088 FILE *file = fopen (volno_file_option, "w");
1092 fprintf (file, "%d\n", global_volno);
1094 write_error (volno_file_option);
1095 if (fclose (file) != 0)
1096 close_error (volno_file_option);
1099 open_error (volno_file_option);
1104 increase_volume_number (void)
1107 if (global_volno < 0)
1108 FATAL_ERROR ((0, 0, _("Volume number overflow")));
1113 change_tape_menu (FILE *read_file)
1115 char *input_buffer = NULL;
1121 fputc ('\007', stderr);
1123 _("Prepare volume #%d for %s and hit return: "),
1124 global_volno + 1, quote (*archive_name_cursor));
1127 if (getline (&input_buffer, &size, read_file) <= 0)
1129 WARN ((0, 0, _("EOF where user reply was expected")));
1131 if (subcommand_option != EXTRACT_SUBCOMMAND
1132 && subcommand_option != LIST_SUBCOMMAND
1133 && subcommand_option != DIFF_SUBCOMMAND)
1134 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1139 if (input_buffer[0] == '\n'
1140 || input_buffer[0] == 'y'
1141 || input_buffer[0] == 'Y')
1144 switch (input_buffer[0])
1148 fprintf (stderr, _("\
1149 n name Give a new file name for the next (and subsequent) volume(s)\n\
1151 y or newline Continue operation\n"));
1152 if (!restrict_option)
1153 fprintf (stderr, _(" ! Spawn a subshell\n"));
1154 fprintf (stderr, _(" ? Print this list\n"));
1161 WARN ((0, 0, _("No new volume; exiting.\n")));
1163 if (subcommand_option != EXTRACT_SUBCOMMAND
1164 && subcommand_option != LIST_SUBCOMMAND
1165 && subcommand_option != DIFF_SUBCOMMAND)
1166 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1171 /* Get new file name. */
1177 for (name = input_buffer + 1;
1178 *name == ' ' || *name == '\t';
1182 for (cursor = name; *cursor && *cursor != '\n'; cursor++)
1188 /* FIXME: the following allocation is never reclaimed. */
1189 *archive_name_cursor = xstrdup (name);
1193 fprintf (stderr, "%s",
1194 _("File name not specified. Try again.\n"));
1199 if (!restrict_option)
1207 fprintf (stderr, _("Invalid input. Type ? for help.\n"));
1210 free (input_buffer);
1213 /* We've hit the end of the old volume. Close it and open the next one.
1214 Return nonzero on success.
1217 new_volume (enum access_mode mode)
1219 static FILE *read_file;
1223 if (!read_file && !info_script_option)
1224 /* FIXME: if fopen is used, it will never be closed. */
1225 read_file = archive == STDIN_FILENO ? fopen (TTY_NAME, "r") : stdin;
1232 assign_string (&volume_label, NULL);
1233 assign_string (&continued_file_name, NULL);
1234 continued_file_size = continued_file_offset = 0;
1235 current_block = record_start;
1237 if (rmtclose (archive) != 0)
1238 close_error (*archive_name_cursor);
1240 archive_name_cursor++;
1241 if (archive_name_cursor == archive_name_array + archive_names)
1243 archive_name_cursor = archive_name_array;
1251 /* We have to prompt from now on. */
1253 if (info_script_option)
1255 if (volno_file_option)
1256 closeout_volume_number ();
1257 if (sys_exec_info_script (archive_name_cursor, global_volno+1))
1258 FATAL_ERROR ((0, 0, _("%s command failed"),
1259 quote (info_script_option)));
1262 change_tape_menu (read_file);
1265 if (strcmp (archive_name_cursor[0], "-") == 0)
1267 read_full_records = true;
1268 archive = STDIN_FILENO;
1270 else if (verify_option)
1271 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1272 rsh_command_option);
1277 archive = rmtopen (*archive_name_cursor, O_RDONLY, MODE_RW,
1278 rsh_command_option);
1279 guess_seekable_archive ();
1284 maybe_backup_file (*archive_name_cursor, 1);
1285 archive = rmtcreat (*archive_name_cursor, MODE_RW,
1286 rsh_command_option);
1290 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1291 rsh_command_option);
1297 open_warn (*archive_name_cursor);
1298 if (!verify_option && mode == ACCESS_WRITE && backup_option)
1299 undo_last_backup ();
1304 SET_BINARY_MODE (archive);
1310 read_header0 (struct tar_stat_info *info)
1312 enum read_header rc;
1314 tar_stat_init (info);
1315 rc = read_header (¤t_header, info, read_header_auto);
1316 if (rc == HEADER_SUCCESS)
1318 set_next_block_after (current_header);
1321 ERROR ((0, 0, _("This does not look like a tar archive")));
1326 try_new_volume (void)
1329 union block *header;
1330 enum access_mode acc;
1332 switch (subcommand_option)
1334 case APPEND_SUBCOMMAND:
1335 case CAT_SUBCOMMAND:
1336 case UPDATE_SUBCOMMAND:
1337 acc = ACCESS_UPDATE;
1345 if (!new_volume (acc))
1348 while ((status = rmtread (archive, record_start->buffer, record_size))
1350 archive_read_error ();
1352 if (status != record_size)
1353 short_read (status);
1355 header = find_next_block ();
1359 switch (header->header.typeflag)
1363 tar_stat_init (&dummy);
1364 if (read_header (&header, &dummy, read_header_x_global)
1365 != HEADER_SUCCESS_EXTENDED)
1367 ERROR ((0, 0, _("This does not look like a tar archive")));
1371 xheader_decode (&dummy); /* decodes values from the global header */
1372 tar_stat_destroy (&dummy);
1374 /* The initial global header must be immediately followed by
1375 an extended PAX header for the first member in this volume.
1376 However, in some cases tar may split volumes in the middle
1377 of a PAX header. This is incorrect, and should be fixed
1378 in the future versions. In the meantime we must be
1379 prepared to correctly list and extract such archives.
1381 If this happens, the following call to read_header returns
1382 HEADER_FAILURE, which is ignored.
1384 See also tests/multiv07.at */
1386 switch (read_header (&header, &dummy, read_header_auto))
1388 case HEADER_SUCCESS:
1389 set_next_block_after (header);
1392 case HEADER_FAILURE:
1396 ERROR ((0, 0, _("This does not look like a tar archive")));
1402 case GNUTYPE_VOLHDR:
1403 if (!read_header0 (&dummy))
1405 tar_stat_destroy (&dummy);
1406 assign_string (&volume_label, current_header->header.name);
1407 set_next_block_after (header);
1408 header = find_next_block ();
1409 if (header->header.typeflag != GNUTYPE_MULTIVOL)
1413 case GNUTYPE_MULTIVOL:
1414 if (!read_header0 (&dummy))
1416 tar_stat_destroy (&dummy);
1417 assign_string (&continued_file_name, current_header->header.name);
1418 continued_file_size =
1419 UINTMAX_FROM_HEADER (current_header->header.size);
1420 continued_file_offset =
1421 UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset);
1431 if (!continued_file_name
1432 || strcmp (continued_file_name, bufmap_head->file_name))
1434 if ((archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
1435 && strlen (bufmap_head->file_name) >= NAME_FIELD_SIZE
1436 && strncmp (continued_file_name, bufmap_head->file_name,
1437 NAME_FIELD_SIZE) == 0)
1439 _("%s is possibly continued on this volume: header contains truncated name"),
1440 quote (bufmap_head->file_name)));
1443 WARN ((0, 0, _("%s is not continued on this volume"),
1444 quote (bufmap_head->file_name)));
1449 s = continued_file_size + continued_file_offset;
1451 if (bufmap_head->sizetotal != s || s < continued_file_offset)
1453 char totsizebuf[UINTMAX_STRSIZE_BOUND];
1454 char s1buf[UINTMAX_STRSIZE_BOUND];
1455 char s2buf[UINTMAX_STRSIZE_BOUND];
1457 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
1458 quote (continued_file_name),
1459 STRINGIFY_BIGINT (bufmap_head->sizetotal, totsizebuf),
1460 STRINGIFY_BIGINT (continued_file_size, s1buf),
1461 STRINGIFY_BIGINT (continued_file_offset, s2buf)));
1465 if (bufmap_head->sizetotal - bufmap_head->sizeleft !=
1466 continued_file_offset)
1468 char totsizebuf[UINTMAX_STRSIZE_BOUND];
1469 char s1buf[UINTMAX_STRSIZE_BOUND];
1470 char s2buf[UINTMAX_STRSIZE_BOUND];
1472 WARN ((0, 0, _("This volume is out of sequence (%s - %s != %s)"),
1473 STRINGIFY_BIGINT (bufmap_head->sizetotal, totsizebuf),
1474 STRINGIFY_BIGINT (bufmap_head->sizeleft, s1buf),
1475 STRINGIFY_BIGINT (continued_file_offset, s2buf)));
1481 increase_volume_number ();
1486 #define VOLUME_TEXT " Volume "
1487 #define VOLUME_TEXT_LEN (sizeof VOLUME_TEXT - 1)
1490 drop_volume_label_suffix (const char *label)
1493 size_t len = strlen (label);
1498 for (p = label + len - 1; p > label && isdigit ((unsigned char) *p); p--)
1500 if (p > label && p - (VOLUME_TEXT_LEN - 1) > label)
1502 p -= VOLUME_TEXT_LEN - 1;
1503 if (memcmp (p, VOLUME_TEXT, VOLUME_TEXT_LEN) == 0)
1505 char *s = xmalloc ((len = p - label) + 1);
1506 memcpy (s, label, len);
1515 /* Check LABEL against the volume label, seen as a globbing
1516 pattern. Return true if the pattern matches. In case of failure,
1517 retry matching a volume sequence number before giving up in
1518 multi-volume mode. */
1520 check_label_pattern (const char *label)
1523 bool result = false;
1525 if (fnmatch (volume_label_option, label, 0) == 0)
1528 if (!multi_volume_option)
1531 string = drop_volume_label_suffix (label);
1534 result = fnmatch (string, volume_label_option, 0) == 0;
1540 /* Check if the next block contains a volume label and if this matches
1541 the one given in the command line */
1543 match_volume_label (void)
1547 union block *label = find_next_block ();
1550 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1551 quote (volume_label_option)));
1552 if (label->header.typeflag == GNUTYPE_VOLHDR)
1554 if (memchr (label->header.name, '\0', sizeof label->header.name))
1555 assign_string (&volume_label, label->header.name);
1558 volume_label = xmalloc (sizeof (label->header.name) + 1);
1559 memcpy (volume_label, label->header.name,
1560 sizeof (label->header.name));
1561 volume_label[sizeof (label->header.name)] = 0;
1564 else if (label->header.typeflag == XGLTYPE)
1566 struct tar_stat_info st;
1567 tar_stat_init (&st);
1568 xheader_read (&st.xhdr, label,
1569 OFF_FROM_HEADER (label->header.size));
1570 xheader_decode (&st);
1571 tar_stat_destroy (&st);
1576 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1577 quote (volume_label_option)));
1579 if (!check_label_pattern (volume_label))
1580 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
1581 quote_n (0, volume_label),
1582 quote_n (1, volume_label_option)));
1585 /* Mark the archive with volume label STR. */
1587 _write_volume_label (const char *str)
1589 if (archive_format == POSIX_FORMAT)
1590 xheader_store ("GNU.volume.label", &dummy, str);
1593 union block *label = find_next_block ();
1595 memset (label, 0, BLOCKSIZE);
1597 strcpy (label->header.name, str);
1598 assign_string (¤t_stat_info.file_name,
1599 label->header.name);
1600 current_stat_info.had_trailing_slash =
1601 strip_trailing_slashes (current_stat_info.file_name);
1603 label->header.typeflag = GNUTYPE_VOLHDR;
1604 TIME_TO_CHARS (start_time.tv_sec, label->header.mtime);
1605 finish_header (¤t_stat_info, label, -1);
1606 set_next_block_after (label);
1610 #define VOL_SUFFIX "Volume"
1612 /* Add a volume label to a part of multi-volume archive */
1614 add_volume_label (void)
1616 char buf[UINTMAX_STRSIZE_BOUND];
1617 char *p = STRINGIFY_BIGINT (volno, buf);
1618 char *s = xmalloc (strlen (volume_label_option) + sizeof VOL_SUFFIX
1620 sprintf (s, "%s %s %s", volume_label_option, VOL_SUFFIX, p);
1621 _write_volume_label (s);
1626 add_chunk_header (struct bufmap *map)
1628 if (archive_format == POSIX_FORMAT)
1630 off_t block_ordinal;
1632 struct tar_stat_info st;
1634 memset (&st, 0, sizeof st);
1635 st.orig_file_name = st.file_name = map->file_name;
1636 st.stat.st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
1637 st.stat.st_uid = getuid ();
1638 st.stat.st_gid = getgid ();
1639 st.orig_file_name = xheader_format_name (&st,
1640 "%d/GNUFileParts.%p/%f.%n",
1642 st.file_name = st.orig_file_name;
1643 st.archive_file_size = st.stat.st_size = map->sizeleft;
1645 block_ordinal = current_block_ordinal ();
1646 blk = start_header (&st);
1648 abort (); /* FIXME */
1649 finish_header (&st, blk, block_ordinal);
1650 free (st.orig_file_name);
1655 /* Add a volume label to the current archive */
1657 write_volume_label (void)
1659 if (multi_volume_option)
1660 add_volume_label ();
1662 _write_volume_label (volume_label_option);
1665 /* Write GNU multi-volume header */
1667 gnu_add_multi_volume_header (struct bufmap *map)
1670 union block *block = find_next_block ();
1672 if (strlen (map->file_name) > NAME_FIELD_SIZE)
1674 _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
1675 quotearg_colon (map->file_name)));
1677 memset (block, 0, BLOCKSIZE);
1679 strncpy (block->header.name, map->file_name, NAME_FIELD_SIZE);
1680 block->header.typeflag = GNUTYPE_MULTIVOL;
1682 OFF_TO_CHARS (map->sizeleft, block->header.size);
1683 OFF_TO_CHARS (map->sizetotal - map->sizeleft,
1684 block->oldgnu_header.offset);
1686 tmp = verbose_option;
1688 finish_header (¤t_stat_info, block, -1);
1689 verbose_option = tmp;
1690 set_next_block_after (block);
1693 /* Add a multi volume header to the current archive. The exact header format
1694 depends on the archive format. */
1696 add_multi_volume_header (struct bufmap *map)
1698 if (archive_format == POSIX_FORMAT)
1700 off_t d = map->sizetotal - map->sizeleft;
1701 xheader_store ("GNU.volume.filename", &dummy, map->file_name);
1702 xheader_store ("GNU.volume.size", &dummy, &map->sizeleft);
1703 xheader_store ("GNU.volume.offset", &dummy, &d);
1706 gnu_add_multi_volume_header (map);
1710 /* Low-level flush functions */
1712 /* Simple flush read (no multi-volume or label extensions) */
1714 simple_flush_read (void)
1716 size_t status; /* result from system call */
1718 checkpoint_run (false);
1720 /* Clear the count of errors. This only applies to a single call to
1723 read_error_count = 0; /* clear error count */
1725 if (write_archive_to_stdout && record_start_block != 0)
1727 archive = STDOUT_FILENO;
1728 status = sys_write_archive_buffer ();
1729 archive = STDIN_FILENO;
1730 if (status != record_size)
1731 archive_write_error (status);
1736 status = rmtread (archive, record_start->buffer, record_size);
1737 if (status == record_size)
1742 if (status == SAFE_READ_ERROR)
1744 archive_read_error ();
1745 continue; /* try again */
1749 short_read (status);
1752 /* Simple flush write (no multi-volume or label extensions) */
1754 simple_flush_write (size_t level __attribute__((unused)))
1758 status = _flush_write ();
1759 if (status != record_size)
1760 archive_write_error (status);
1764 bytes_written += status;
1769 /* GNU flush functions. These support multi-volume and archive labels in
1770 GNU and PAX archive formats. */
1773 _gnu_flush_read (void)
1775 size_t status; /* result from system call */
1777 checkpoint_run (false);
1779 /* Clear the count of errors. This only applies to a single call to
1782 read_error_count = 0; /* clear error count */
1784 if (write_archive_to_stdout && record_start_block != 0)
1786 archive = STDOUT_FILENO;
1787 status = sys_write_archive_buffer ();
1788 archive = STDIN_FILENO;
1789 if (status != record_size)
1790 archive_write_error (status);
1795 status = rmtread (archive, record_start->buffer, record_size);
1796 if (status == record_size)
1802 /* The condition below used to include
1803 || (status > 0 && !read_full_records)
1804 This is incorrect since even if new_volume() succeeds, the
1805 subsequent call to rmtread will overwrite the chunk of data
1806 already read in the buffer, so the processing will fail */
1808 || (status == SAFE_READ_ERROR && errno == ENOSPC))
1809 && multi_volume_option)
1811 while (!try_new_volume ())
1813 if (current_block == record_end)
1814 /* Necessary for blocking_factor == 1 */
1818 else if (status == SAFE_READ_ERROR)
1820 archive_read_error ();
1825 short_read (status);
1829 gnu_flush_read (void)
1831 flush_read_ptr = simple_flush_read; /* Avoid recursion */
1833 flush_read_ptr = gnu_flush_read;
1837 _gnu_flush_write (size_t buffer_level)
1840 union block *header;
1846 status = _flush_write ();
1847 if (status != record_size && !multi_volume_option)
1848 archive_write_error (status);
1853 bytes_written += status;
1856 if (status == record_size)
1861 map = bufmap_locate (status);
1863 if (status % BLOCKSIZE)
1865 ERROR ((0, 0, _("write did not end on a block boundary")));
1866 archive_write_error (status);
1869 /* In multi-volume mode. */
1870 /* ENXIO is for the UNIX PC. */
1871 if (status < 0 && errno != ENOSPC && errno != EIO && errno != ENXIO)
1872 archive_write_error (status);
1874 if (!new_volume (ACCESS_WRITE))
1877 tar_stat_destroy (&dummy);
1879 increase_volume_number ();
1880 prev_written += bytes_written;
1883 copy_ptr = record_start->buffer + status;
1884 copy_size = buffer_level - status;
1886 /* Switch to the next buffer */
1887 record_index = !record_index;
1892 if (volume_label_option)
1893 add_volume_label ();
1896 add_multi_volume_header (map);
1898 write_extended (true, &dummy, find_next_block ());
1899 tar_stat_destroy (&dummy);
1902 add_chunk_header (map);
1903 header = find_next_block ();
1904 bufmap_reset (map, header - record_start);
1905 bufsize = available_space_after (header);
1907 while (bufsize < copy_size)
1909 memcpy (header->buffer, copy_ptr, bufsize);
1910 copy_ptr += bufsize;
1911 copy_size -= bufsize;
1912 set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
1913 header = find_next_block ();
1914 bufsize = available_space_after (header);
1916 memcpy (header->buffer, copy_ptr, copy_size);
1917 memset (header->buffer + copy_size, 0, bufsize - copy_size);
1918 set_next_block_after (header + (copy_size - 1) / BLOCKSIZE);
1923 gnu_flush_write (size_t buffer_level)
1925 flush_write_ptr = simple_flush_write; /* Avoid recursion */
1926 _gnu_flush_write (buffer_level);
1927 flush_write_ptr = gnu_flush_write;
1939 flush_write_ptr (record_size);
1943 open_archive (enum access_mode wanted_access)
1945 flush_read_ptr = gnu_flush_read;
1946 flush_write_ptr = gnu_flush_write;
1948 _open_archive (wanted_access);
1949 switch (wanted_access)
1953 if (volume_label_option)
1954 match_volume_label ();
1958 records_written = 0;
1959 if (volume_label_option)
1960 write_volume_label ();
1963 set_volume_start_time ();