]> Dogcows Code - chaz/tar/blob - src/buffer.c
Changes for compatibility with Slackware installation scripts.
[chaz/tar] / src / buffer.c
1 /* Buffer management for tar.
2
3 Copyright 1988, 1992-1994, 1996-1997, 1999-2010, 2013 Free Software
4 Foundation, Inc.
5
6 This file is part of GNU tar.
7
8 GNU tar is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 GNU tar is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
20
21 Written by John Gilmore, on 1985-08-25. */
22
23 #include <system.h>
24 #include <system-ioctl.h>
25
26 #include <signal.h>
27
28 #include <closeout.h>
29 #include <fnmatch.h>
30 #include <human.h>
31 #include <quotearg.h>
32
33 #include "common.h"
34 #include <rmt.h>
35
36 /* Number of retries before giving up on read. */
37 #define READ_ERROR_MAX 10
38
39 /* Variables. */
40
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 static union block *record_buffer_aligned[2];
45 static int record_index;
46
47 /* FIXME: The following variables should ideally be static to this
48 module. However, this cannot be done yet. The cleanup continues! */
49
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 */
58
59 static off_t record_start_block; /* block ordinal at record_start */
60
61 /* Where we write list messages (not errors, not interactions) to. */
62 FILE *stdlis;
63
64 static void backspace_output (void);
65
66 /* PID of child program, if compress_option or remote archive access. */
67 static pid_t child_pid;
68
69 /* Error recovery stuff */
70 static int read_error_count;
71
72 /* Have we hit EOF yet? */
73 static bool hit_eof;
74
75 static bool read_full_records = false;
76
77 /* We're reading, but we just read the last block and it's time to update.
78 Declared in update.c
79
80 FIXME: Either eliminate it or move it to common.h.
81 */
82 extern bool time_to_start_writing;
83
84 bool write_archive_to_stdout;
85
86 static void (*flush_write_ptr) (size_t);
87 static void (*flush_read_ptr) (void);
88
89 \f
90 char *volume_label;
91 char *continued_file_name;
92 uintmax_t continued_file_size;
93 uintmax_t continued_file_offset;
94
95 \f
96 static int volno = 1; /* which volume of a multi-volume tape we're
97 on */
98 static int global_volno = 1; /* volume number to print in external
99 messages */
100
101 bool write_archive_to_stdout;
102
103 \f
104 /* Multi-volume tracking support */
105
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.
111
112 When reading from a multi-volume archive, the list degrades to a
113 single element, which keeps information about the member currently
114 being read.
115 */
116
117 struct bufmap
118 {
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 */
124 };
125 static struct bufmap *bufmap_head, *bufmap_tail;
126
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;
130
131 void
132 mv_begin_write (const char *file_name, off_t totsize, off_t sizeleft)
133 {
134 if (multi_volume_option)
135 {
136 struct bufmap *bp = xmalloc (sizeof bp[0]);
137 if (bufmap_tail)
138 bufmap_tail->next = bp;
139 else
140 bufmap_head = bp;
141 bufmap_tail = bp;
142
143 bp->next = NULL;
144 bp->start = current_block - record_start;
145 bp->file_name = xstrdup (file_name);
146 bp->sizetotal = totsize;
147 bp->sizeleft = sizeleft;
148 }
149 }
150
151 static struct bufmap *
152 bufmap_locate (size_t off)
153 {
154 struct bufmap *map;
155
156 for (map = bufmap_head; map; map = map->next)
157 {
158 if (!map->next
159 || off < map->next->start * BLOCKSIZE)
160 break;
161 }
162 return map;
163 }
164
165 static void
166 bufmap_free (struct bufmap *mark)
167 {
168 struct bufmap *map;
169 for (map = bufmap_head; map && map != mark; )
170 {
171 struct bufmap *next = map->next;
172 free (map->file_name);
173 free (map);
174 map = next;
175 }
176 bufmap_head = map;
177 if (!bufmap_head)
178 bufmap_tail = bufmap_head;
179 }
180
181 static void
182 bufmap_reset (struct bufmap *map, ssize_t fixup)
183 {
184 bufmap_free (map);
185 if (map)
186 {
187 for (; map; map = map->next)
188 map->start += fixup;
189 }
190 }
191
192 \f
193 static struct tar_stat_info dummy;
194
195 void
196 buffer_write_global_xheader (void)
197 {
198 xheader_write_global (&dummy.xhdr);
199 }
200
201 void
202 mv_begin_read (struct tar_stat_info *st)
203 {
204 mv_begin_write (st->orig_file_name, st->stat.st_size, st->stat.st_size);
205 }
206
207 void
208 mv_end (void)
209 {
210 if (multi_volume_option)
211 bufmap_free (NULL);
212 }
213
214 void
215 mv_size_left (off_t size)
216 {
217 if (bufmap_head)
218 bufmap_head->sizeleft = size;
219 }
220
221 \f
222 /* Functions. */
223
224 void
225 clear_read_error_count (void)
226 {
227 read_error_count = 0;
228 }
229
230 \f
231 /* Time-related functions */
232
233 static double duration;
234
235 void
236 set_start_time (void)
237 {
238 gettime (&start_time);
239 volume_start_time = start_time;
240 last_stat_time = start_time;
241 }
242
243 static void
244 set_volume_start_time (void)
245 {
246 gettime (&volume_start_time);
247 last_stat_time = volume_start_time;
248 }
249
250 void
251 compute_duration (void)
252 {
253 struct timespec now;
254 gettime (&now);
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);
258 }
259
260 \f
261 /* Compression detection */
262
263 enum compress_type {
264 ct_none, /* Unknown compression type */
265 ct_tar, /* Plain tar file */
266 ct_compress,
267 ct_gzip,
268 ct_bzip2,
269 ct_lzip,
270 ct_lzma,
271 ct_lzop,
272 ct_xz
273 };
274
275 static enum compress_type archive_compression_type = ct_none;
276
277 struct zip_magic
278 {
279 enum compress_type type;
280 size_t length;
281 char const *magic;
282 };
283
284 struct zip_program
285 {
286 enum compress_type type;
287 char const *program;
288 char const *option;
289 };
290
291 static struct zip_magic const magic[] = {
292 { ct_none, 0, 0 },
293 { ct_tar, 0, 0 },
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" },
301 };
302
303 #define NMAGIC (sizeof(magic)/sizeof(magic[0]))
304
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" },
316 { ct_none }
317 };
318
319 static struct zip_program const *
320 find_zip_program (enum compress_type type, int *pstate)
321 {
322 int i;
323
324 for (i = *pstate; zip_program[i].type != ct_none; i++)
325 {
326 if (zip_program[i].type == type)
327 {
328 *pstate = i + 1;
329 return zip_program + i;
330 }
331 }
332 *pstate = i;
333 return NULL;
334 }
335
336 const char *
337 first_decompress_program (int *pstate)
338 {
339 struct zip_program const *zp;
340
341 if (use_compress_program_option)
342 return use_compress_program_option;
343
344 if (archive_compression_type == ct_none)
345 return NULL;
346
347 *pstate = 0;
348 zp = find_zip_program (archive_compression_type, pstate);
349 return zp ? zp->program : NULL;
350 }
351
352 const char *
353 next_decompress_program (int *pstate)
354 {
355 struct zip_program const *zp;
356
357 if (use_compress_program_option)
358 return NULL;
359 zp = find_zip_program (archive_compression_type, pstate);
360 return zp ? zp->program : NULL;
361 }
362
363 static const char *
364 compress_option (enum compress_type type)
365 {
366 struct zip_program const *zp;
367 int i = 0;
368 zp = find_zip_program (type, &i);
369 return zp ? zp->option : NULL;
370 }
371
372 /* Check if the file ARCHIVE is a compressed archive. */
373 static enum compress_type
374 check_compressed_archive (bool *pshort)
375 {
376 struct zip_magic const *p;
377 bool sfr;
378 bool temp;
379
380 if (!pshort)
381 pshort = &temp;
382
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
387 record */
388 *pshort = find_next_block () == 0;
389
390 /* Restore global values */
391 read_full_records = sfr;
392
393 if (tar_checksum (record_start, true) == HEADER_SUCCESS)
394 /* Probably a valid header */
395 return ct_tar;
396
397 for (p = magic + 2; p < magic + NMAGIC; p++)
398 if (memcmp (record_start->buffer, p->magic, p->length) == 0)
399 return p->type;
400
401 return ct_none;
402 }
403
404 /* Guess if the archive is seekable. */
405 static void
406 guess_seekable_archive (void)
407 {
408 struct stat st;
409
410 if (subcommand_option == DELETE_SUBCOMMAND)
411 {
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
418 problem. */
419 seekable_archive = false;
420 }
421
422 if (seek_option != -1)
423 {
424 seekable_archive = !!seek_option;
425 return;
426 }
427
428 if (!multi_volume_option && !use_compress_program_option
429 && fstat (archive, &st) == 0)
430 seekable_archive = S_ISREG (st.st_mode);
431 else
432 seekable_archive = false;
433 }
434
435 /* Open an archive named archive_name_array[0]. Detect if it is
436 a compressed archive of known type and use corresponding decompression
437 program if so */
438 static int
439 open_compressed_archive (void)
440 {
441 archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
442 MODE_RW, rsh_command_option);
443 if (archive == -1)
444 return archive;
445
446 if (!multi_volume_option)
447 {
448 if (!use_compress_program_option)
449 {
450 bool shortfile;
451 enum compress_type type = check_compressed_archive (&shortfile);
452
453 switch (type)
454 {
455 case ct_tar:
456 if (shortfile)
457 ERROR ((0, 0, _("This does not look like a tar archive")));
458 return archive;
459
460 case ct_none:
461 if (shortfile)
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)
465 return archive;
466 break;
467
468 default:
469 archive_compression_type = type;
470 break;
471 }
472 }
473
474 /* FD is not needed any more */
475 rmtclose (archive);
476
477 hit_eof = false; /* It might have been set by find_next_block in
478 check_compressed_archive */
479
480 /* Open compressed archive */
481 child_pid = sys_child_open_for_uncompress ();
482 read_full_records = true;
483 }
484
485 records_read = 0;
486 record_end = record_start; /* set up for 1st record = # 0 */
487
488 return archive;
489 }
490 \f
491
492 static void
493 print_stats (FILE *fp, const char *text, tarlong numbytes)
494 {
495 char bytes[sizeof (tarlong) * CHAR_BIT];
496 char abbr[LONGEST_HUMAN_READABLE + 1];
497 char rate[LONGEST_HUMAN_READABLE + 1];
498
499 int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
500
501 sprintf (bytes, TARLONG_FORMAT, numbytes);
502
503 fprintf (fp, "%s: %s (%s, %s/s)\n",
504 text, bytes,
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)
508 : "?"));
509 }
510
511 void
512 print_total_stats (void)
513 {
514 switch (subcommand_option)
515 {
516 case CREATE_SUBCOMMAND:
517 case CAT_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);
523 break;
524
525 case DELETE_SUBCOMMAND:
526 {
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)
534 * record_size
535 - (prev_written + bytes_written), buf));
536 }
537 break;
538
539 case EXTRACT_SUBCOMMAND:
540 case LIST_SUBCOMMAND:
541 case DIFF_SUBCOMMAND:
542 print_stats (stderr, _("Total bytes read"),
543 records_read * record_size);
544 break;
545
546 default:
547 abort ();
548 }
549 }
550
551 /* Compute and return the block ordinal at current_block. */
552 off_t
553 current_block_ordinal (void)
554 {
555 return record_start_block + (current_block - record_start);
556 }
557
558 /* If the EOF flag is set, reset it, as well as current_block, etc. */
559 void
560 reset_eof (void)
561 {
562 if (hit_eof)
563 {
564 hit_eof = false;
565 current_block = record_start;
566 record_end = record_start + blocking_factor;
567 access_mode = ACCESS_WRITE;
568 }
569 }
570
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. */
574 union block *
575 find_next_block (void)
576 {
577 if (current_block == record_end)
578 {
579 if (hit_eof)
580 return 0;
581 flush_archive ();
582 if (current_block == record_end)
583 {
584 hit_eof = true;
585 return 0;
586 }
587 }
588 return current_block;
589 }
590
591 /* Indicate that we have used all blocks up thru BLOCK. */
592 void
593 set_next_block_after (union block *block)
594 {
595 while (block >= current_block)
596 current_block++;
597
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. */
601
602 if (current_block > record_end)
603 abort ();
604 }
605
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. */
610 size_t
611 available_space_after (union block *pointer)
612 {
613 return record_end->buffer - pointer->buffer;
614 }
615
616 /* Close file having descriptor FD, and abort if close unsuccessful. */
617 void
618 xclose (int fd)
619 {
620 if (close (fd) != 0)
621 close_error (_("(pipe)"));
622 }
623
624 static void
625 init_buffer (void)
626 {
627 if (! record_buffer_aligned[record_index])
628 record_buffer_aligned[record_index] =
629 page_aligned_alloc (&record_buffer[record_index], record_size);
630
631 record_start = record_buffer_aligned[record_index];
632 current_block = record_start;
633 record_end = record_start + blocking_factor;
634 }
635
636 /* Open an archive file. The argument specifies whether we are
637 reading or writing, or both. */
638 static void
639 _open_archive (enum access_mode wanted_access)
640 {
641 int backed_up_flag = 0;
642
643 if (record_size == 0)
644 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
645
646 if (archive_names == 0)
647 FATAL_ERROR ((0, 0, _("No archive name given")));
648
649 tar_stat_destroy (&current_stat_info);
650
651 record_index = 0;
652 init_buffer ();
653
654 /* When updating the archive, we start with reading. */
655 access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
656
657 read_full_records = read_full_records_option;
658
659 records_read = 0;
660
661 if (use_compress_program_option)
662 {
663 switch (wanted_access)
664 {
665 case ACCESS_READ:
666 child_pid = sys_child_open_for_uncompress ();
667 read_full_records = true;
668 record_end = record_start; /* set up for 1st record = # 0 */
669 break;
670
671 case ACCESS_WRITE:
672 child_pid = sys_child_open_for_compress ();
673 break;
674
675 case ACCESS_UPDATE:
676 abort (); /* Should not happen */
677 break;
678 }
679
680 if (!index_file_name
681 && wanted_access == ACCESS_WRITE
682 && strcmp (archive_name_array[0], "-") == 0)
683 stdlis = stderr;
684 }
685 else if (strcmp (archive_name_array[0], "-") == 0)
686 {
687 read_full_records = true; /* could be a pipe, be safe */
688 if (verify_option)
689 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
690
691 switch (wanted_access)
692 {
693 case ACCESS_READ:
694 {
695 bool shortfile;
696 enum compress_type type;
697
698 archive = STDIN_FILENO;
699
700 type = check_compressed_archive (&shortfile);
701 if (type != ct_tar && type != ct_none)
702 FATAL_ERROR ((0, 0,
703 _("Archive is compressed. Use %s option"),
704 compress_option (type)));
705 if (shortfile)
706 ERROR ((0, 0, _("This does not look like a tar archive")));
707 }
708 break;
709
710 case ACCESS_WRITE:
711 archive = STDOUT_FILENO;
712 if (!index_file_name)
713 stdlis = stderr;
714 break;
715
716 case ACCESS_UPDATE:
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)
721 stdlis = stderr;
722 break;
723 }
724 }
725 else
726 switch (wanted_access)
727 {
728 case ACCESS_READ:
729 archive = open_compressed_archive ();
730 if (archive >= 0)
731 guess_seekable_archive ();
732 break;
733
734 case ACCESS_WRITE:
735 if (backup_option)
736 {
737 maybe_backup_file (archive_name_array[0], 1);
738 backed_up_flag = 1;
739 }
740 if (verify_option)
741 archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
742 MODE_RW, rsh_command_option);
743 else
744 archive = rmtcreat (archive_name_array[0], MODE_RW,
745 rsh_command_option);
746 break;
747
748 case ACCESS_UPDATE:
749 archive = rmtopen (archive_name_array[0],
750 O_RDWR | O_CREAT | O_BINARY,
751 MODE_RW, rsh_command_option);
752
753 switch (check_compressed_archive (NULL))
754 {
755 case ct_none:
756 case ct_tar:
757 break;
758
759 default:
760 FATAL_ERROR ((0, 0,
761 _("Cannot update compressed archives")));
762 }
763 break;
764 }
765
766 if (archive < 0
767 || (! _isrmt (archive) && !sys_get_archive_stat ()))
768 {
769 int saved_errno = errno;
770
771 if (backed_up_flag)
772 undo_last_backup ();
773 errno = saved_errno;
774 open_fatal (archive_name_array[0]);
775 }
776
777 sys_detect_dev_null_output ();
778 sys_save_archive_dev_ino ();
779 SET_BINARY_MODE (archive);
780
781 switch (wanted_access)
782 {
783 case ACCESS_READ:
784 find_next_block (); /* read it in, check for EOF */
785 break;
786
787 case ACCESS_UPDATE:
788 case ACCESS_WRITE:
789 records_written = 0;
790 break;
791 }
792 }
793
794 /* Perform a write to flush the buffer. */
795 static ssize_t
796 _flush_write (void)
797 {
798 ssize_t status;
799
800 checkpoint_run (true);
801 if (tape_length_option && tape_length_option <= bytes_written)
802 {
803 errno = ENOSPC;
804 status = 0;
805 }
806 else if (dev_null_output)
807 status = record_size;
808 else
809 status = sys_write_archive_buffer ();
810
811 if (status && multi_volume_option && !inhibit_map)
812 {
813 struct bufmap *map = bufmap_locate (status);
814 if (map)
815 {
816 size_t delta = status - map->start * BLOCKSIZE;
817 if (delta > map->sizeleft)
818 delta = map->sizeleft;
819 map->sizeleft -= delta;
820 if (map->sizeleft == 0)
821 map = map->next;
822 bufmap_reset (map, map ? (- map->start) : 0);
823 }
824 }
825 return status;
826 }
827
828 /* Handle write errors on the archive. Write errors are always fatal.
829 Hitting the end of a volume does not cause a write error unless the
830 write was the first record of the volume. */
831 void
832 archive_write_error (ssize_t status)
833 {
834 /* It might be useful to know how much was written before the error
835 occurred. */
836 if (totals_option)
837 {
838 int e = errno;
839 print_total_stats ();
840 errno = e;
841 }
842
843 write_fatal_details (*archive_name_cursor, status, record_size);
844 }
845
846 /* Handle read errors on the archive. If the read should be retried,
847 return to the caller. */
848 void
849 archive_read_error (void)
850 {
851 read_error (*archive_name_cursor);
852
853 if (record_start_block == 0)
854 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
855
856 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
857 then give up on reading the archive. */
858
859 if (read_error_count++ > READ_ERROR_MAX)
860 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
861 return;
862 }
863
864 static bool
865 archive_is_dev (void)
866 {
867 struct stat st;
868
869 if (fstat (archive, &st))
870 {
871 stat_diag (*archive_name_cursor);
872 return false;
873 }
874 return S_ISBLK (st.st_mode) || S_ISCHR (st.st_mode);
875 }
876
877 static void
878 short_read (size_t status)
879 {
880 size_t left; /* bytes left */
881 char *more; /* pointer to next byte to read */
882
883 more = record_start->buffer + status;
884 left = record_size - status;
885
886 if (left && left % BLOCKSIZE == 0
887 && (warning_option & WARN_RECORD_SIZE)
888 && record_start_block == 0 && status != 0
889 && archive_is_dev ())
890 {
891 unsigned long rsize = status / BLOCKSIZE;
892 WARN ((0, 0,
893 ngettext ("Record size = %lu block",
894 "Record size = %lu blocks",
895 rsize),
896 rsize));
897 }
898
899 while (left % BLOCKSIZE != 0
900 || (left && status && read_full_records))
901 {
902 if (status)
903 while ((status = rmtread (archive, more, left)) == SAFE_READ_ERROR)
904 archive_read_error ();
905
906 if (status == 0)
907 break;
908
909 if (! read_full_records)
910 {
911 unsigned long rest = record_size - left;
912
913 FATAL_ERROR ((0, 0,
914 ngettext ("Unaligned block (%lu byte) in archive",
915 "Unaligned block (%lu bytes) in archive",
916 rest),
917 rest));
918 }
919
920 left -= status;
921 more += status;
922 }
923
924 record_end = record_start + (record_size - left) / BLOCKSIZE;
925 records_read++;
926 }
927
928 /* Flush the current buffer to/from the archive. */
929 void
930 flush_archive (void)
931 {
932 size_t buffer_level = current_block->buffer - record_start->buffer;
933 record_start_block += record_end - record_start;
934 current_block = record_start;
935 record_end = record_start + blocking_factor;
936
937 if (access_mode == ACCESS_READ && time_to_start_writing)
938 {
939 access_mode = ACCESS_WRITE;
940 time_to_start_writing = false;
941 backspace_output ();
942 }
943
944 switch (access_mode)
945 {
946 case ACCESS_READ:
947 flush_read ();
948 break;
949
950 case ACCESS_WRITE:
951 flush_write_ptr (buffer_level);
952 break;
953
954 case ACCESS_UPDATE:
955 abort ();
956 }
957 }
958
959 /* Backspace the archive descriptor by one record worth. If it's a
960 tape, MTIOCTOP will work. If it's something else, try to seek on
961 it. If we can't seek, we lose! */
962 static void
963 backspace_output (void)
964 {
965 #ifdef MTIOCTOP
966 {
967 struct mtop operation;
968
969 operation.mt_op = MTBSR;
970 operation.mt_count = 1;
971 if (rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
972 return;
973 if (errno == EIO && rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
974 return;
975 }
976 #endif
977
978 {
979 off_t position = rmtlseek (archive, (off_t) 0, SEEK_CUR);
980
981 /* Seek back to the beginning of this record and start writing there. */
982
983 position -= record_size;
984 if (position < 0)
985 position = 0;
986 if (rmtlseek (archive, position, SEEK_SET) != position)
987 {
988 /* Lseek failed. Try a different method. */
989
990 WARN ((0, 0,
991 _("Cannot backspace archive file; it may be unreadable without -i")));
992
993 /* Replace the first part of the record with NULs. */
994
995 if (record_start->buffer != output_start)
996 memset (record_start->buffer, 0,
997 output_start - record_start->buffer);
998 }
999 }
1000 }
1001
1002 off_t
1003 seek_archive (off_t size)
1004 {
1005 off_t start = current_block_ordinal ();
1006 off_t offset;
1007 off_t nrec, nblk;
1008 off_t skipped = (blocking_factor - (current_block - record_start))
1009 * BLOCKSIZE;
1010
1011 if (size <= skipped)
1012 return 0;
1013
1014 /* Compute number of records to skip */
1015 nrec = (size - skipped) / record_size;
1016 if (nrec == 0)
1017 return 0;
1018 offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
1019 if (offset < 0)
1020 return offset;
1021
1022 if (offset % record_size)
1023 FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
1024
1025 /* Convert to number of records */
1026 offset /= BLOCKSIZE;
1027 /* Compute number of skipped blocks */
1028 nblk = offset - start;
1029
1030 /* Update buffering info */
1031 records_read += nblk / blocking_factor;
1032 record_start_block = offset - blocking_factor;
1033 current_block = record_end;
1034
1035 return nblk;
1036 }
1037
1038 /* Close the archive file. */
1039 void
1040 close_archive (void)
1041 {
1042 if (time_to_start_writing || access_mode == ACCESS_WRITE)
1043 {
1044 flush_archive ();
1045 if (current_block > record_start)
1046 flush_archive ();
1047 }
1048
1049 compute_duration ();
1050 if (verify_option)
1051 verify_volume ();
1052
1053 if (rmtclose (archive) != 0)
1054 close_error (*archive_name_cursor);
1055
1056 sys_wait_for_child (child_pid, hit_eof);
1057
1058 tar_stat_destroy (&current_stat_info);
1059 free (record_buffer[0]);
1060 free (record_buffer[1]);
1061 bufmap_free (NULL);
1062 }
1063
1064 /* Called to initialize the global volume number. */
1065 void
1066 init_volume_number (void)
1067 {
1068 FILE *file = fopen (volno_file_option, "r");
1069
1070 if (file)
1071 {
1072 if (fscanf (file, "%d", &global_volno) != 1
1073 || global_volno < 0)
1074 FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
1075 quotearg_colon (volno_file_option)));
1076 if (ferror (file))
1077 read_error (volno_file_option);
1078 if (fclose (file) != 0)
1079 close_error (volno_file_option);
1080 }
1081 else if (errno != ENOENT)
1082 open_error (volno_file_option);
1083 }
1084
1085 /* Called to write out the closing global volume number. */
1086 void
1087 closeout_volume_number (void)
1088 {
1089 FILE *file = fopen (volno_file_option, "w");
1090
1091 if (file)
1092 {
1093 fprintf (file, "%d\n", global_volno);
1094 if (ferror (file))
1095 write_error (volno_file_option);
1096 if (fclose (file) != 0)
1097 close_error (volno_file_option);
1098 }
1099 else
1100 open_error (volno_file_option);
1101 }
1102
1103 \f
1104 static void
1105 increase_volume_number (void)
1106 {
1107 global_volno++;
1108 if (global_volno < 0)
1109 FATAL_ERROR ((0, 0, _("Volume number overflow")));
1110 volno++;
1111 }
1112
1113 static void
1114 change_tape_menu (FILE *read_file)
1115 {
1116 char *input_buffer = NULL;
1117 size_t size = 0;
1118 bool stop = false;
1119
1120 while (!stop)
1121 {
1122 fputc ('\007', stderr);
1123 fprintf (stderr,
1124 _("Prepare volume #%d for %s and hit return: "),
1125 global_volno + 1, quote (*archive_name_cursor));
1126 fflush (stderr);
1127
1128 if (getline (&input_buffer, &size, read_file) <= 0)
1129 {
1130 WARN ((0, 0, _("EOF where user reply was expected")));
1131
1132 if (subcommand_option != EXTRACT_SUBCOMMAND
1133 && subcommand_option != LIST_SUBCOMMAND
1134 && subcommand_option != DIFF_SUBCOMMAND)
1135 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1136
1137 fatal_exit ();
1138 }
1139
1140 if (input_buffer[0] == '\n'
1141 || input_buffer[0] == 'y'
1142 || input_buffer[0] == 'Y')
1143 break;
1144
1145 switch (input_buffer[0])
1146 {
1147 case '?':
1148 {
1149 fprintf (stderr, _("\
1150 n name Give a new file name for the next (and subsequent) volume(s)\n\
1151 q Abort tar\n\
1152 y or newline Continue operation\n"));
1153 if (!restrict_option)
1154 fprintf (stderr, _(" ! Spawn a subshell\n"));
1155 fprintf (stderr, _(" ? Print this list\n"));
1156 }
1157 break;
1158
1159 case 'q':
1160 /* Quit. */
1161
1162 WARN ((0, 0, _("No new volume; exiting.\n")));
1163
1164 if (subcommand_option != EXTRACT_SUBCOMMAND
1165 && subcommand_option != LIST_SUBCOMMAND
1166 && subcommand_option != DIFF_SUBCOMMAND)
1167 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1168
1169 fatal_exit ();
1170
1171 case 'n':
1172 /* Get new file name. */
1173
1174 {
1175 char *name;
1176 char *cursor;
1177
1178 for (name = input_buffer + 1;
1179 *name == ' ' || *name == '\t';
1180 name++)
1181 ;
1182
1183 for (cursor = name; *cursor && *cursor != '\n'; cursor++)
1184 ;
1185 *cursor = '\0';
1186
1187 if (name[0])
1188 {
1189 /* FIXME: the following allocation is never reclaimed. */
1190 *archive_name_cursor = xstrdup (name);
1191 stop = true;
1192 }
1193 else
1194 fprintf (stderr, "%s",
1195 _("File name not specified. Try again.\n"));
1196 }
1197 break;
1198
1199 case '!':
1200 if (!restrict_option)
1201 {
1202 sys_spawn_shell ();
1203 break;
1204 }
1205 /* FALL THROUGH */
1206
1207 default:
1208 fprintf (stderr, _("Invalid input. Type ? for help.\n"));
1209 }
1210 }
1211 free (input_buffer);
1212 }
1213
1214 /* We've hit the end of the old volume. Close it and open the next one.
1215 Return nonzero on success.
1216 */
1217 static bool
1218 new_volume (enum access_mode mode)
1219 {
1220 static FILE *read_file;
1221 static int looped;
1222 int prompt;
1223
1224 if (!read_file && !info_script_option)
1225 /* FIXME: if fopen is used, it will never be closed. */
1226 read_file = archive == STDIN_FILENO ? fopen (TTY_NAME, "r") : stdin;
1227
1228 if (now_verifying)
1229 return false;
1230 if (verify_option)
1231 verify_volume ();
1232
1233 assign_string (&volume_label, NULL);
1234 assign_string (&continued_file_name, NULL);
1235 continued_file_size = continued_file_offset = 0;
1236 current_block = record_start;
1237
1238 if (rmtclose (archive) != 0)
1239 close_error (*archive_name_cursor);
1240
1241 archive_name_cursor++;
1242 if (archive_name_cursor == archive_name_array + archive_names)
1243 {
1244 archive_name_cursor = archive_name_array;
1245 looped = 1;
1246 }
1247 prompt = looped;
1248
1249 tryagain:
1250 if (prompt)
1251 {
1252 /* We have to prompt from now on. */
1253
1254 if (info_script_option)
1255 {
1256 if (volno_file_option)
1257 closeout_volume_number ();
1258 if (sys_exec_info_script (archive_name_cursor, global_volno+1))
1259 FATAL_ERROR ((0, 0, _("%s command failed"),
1260 quote (info_script_option)));
1261 }
1262 else
1263 change_tape_menu (read_file);
1264 }
1265
1266 if (strcmp (archive_name_cursor[0], "-") == 0)
1267 {
1268 read_full_records = true;
1269 archive = STDIN_FILENO;
1270 }
1271 else if (verify_option)
1272 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1273 rsh_command_option);
1274 else
1275 switch (mode)
1276 {
1277 case ACCESS_READ:
1278 archive = rmtopen (*archive_name_cursor, O_RDONLY, MODE_RW,
1279 rsh_command_option);
1280 guess_seekable_archive ();
1281 break;
1282
1283 case ACCESS_WRITE:
1284 if (backup_option)
1285 maybe_backup_file (*archive_name_cursor, 1);
1286 archive = rmtcreat (*archive_name_cursor, MODE_RW,
1287 rsh_command_option);
1288 break;
1289
1290 case ACCESS_UPDATE:
1291 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1292 rsh_command_option);
1293 break;
1294 }
1295
1296 if (archive < 0)
1297 {
1298 open_warn (*archive_name_cursor);
1299 if (!verify_option && mode == ACCESS_WRITE && backup_option)
1300 undo_last_backup ();
1301 prompt = 1;
1302 goto tryagain;
1303 }
1304
1305 SET_BINARY_MODE (archive);
1306
1307 return true;
1308 }
1309
1310 static bool
1311 read_header0 (struct tar_stat_info *info)
1312 {
1313 enum read_header rc;
1314
1315 tar_stat_init (info);
1316 rc = read_header (&current_header, info, read_header_auto);
1317 if (rc == HEADER_SUCCESS)
1318 {
1319 set_next_block_after (current_header);
1320 return true;
1321 }
1322 ERROR ((0, 0, _("This does not look like a tar archive")));
1323 return false;
1324 }
1325
1326 static bool
1327 try_new_volume (void)
1328 {
1329 size_t status;
1330 union block *header;
1331 enum access_mode acc;
1332
1333 switch (subcommand_option)
1334 {
1335 case APPEND_SUBCOMMAND:
1336 case CAT_SUBCOMMAND:
1337 case UPDATE_SUBCOMMAND:
1338 acc = ACCESS_UPDATE;
1339 break;
1340
1341 default:
1342 acc = ACCESS_READ;
1343 break;
1344 }
1345
1346 if (!new_volume (acc))
1347 return true;
1348
1349 while ((status = rmtread (archive, record_start->buffer, record_size))
1350 == SAFE_READ_ERROR)
1351 archive_read_error ();
1352
1353 if (status != record_size)
1354 short_read (status);
1355
1356 header = find_next_block ();
1357 if (!header)
1358 return false;
1359
1360 switch (header->header.typeflag)
1361 {
1362 case XGLTYPE:
1363 {
1364 tar_stat_init (&dummy);
1365 if (read_header (&header, &dummy, read_header_x_global)
1366 != HEADER_SUCCESS_EXTENDED)
1367 {
1368 ERROR ((0, 0, _("This does not look like a tar archive")));
1369 return false;
1370 }
1371
1372 xheader_decode (&dummy); /* decodes values from the global header */
1373 tar_stat_destroy (&dummy);
1374
1375 /* The initial global header must be immediately followed by
1376 an extended PAX header for the first member in this volume.
1377 However, in some cases tar may split volumes in the middle
1378 of a PAX header. This is incorrect, and should be fixed
1379 in the future versions. In the meantime we must be
1380 prepared to correctly list and extract such archives.
1381
1382 If this happens, the following call to read_header returns
1383 HEADER_FAILURE, which is ignored.
1384
1385 See also tests/multiv07.at */
1386
1387 switch (read_header (&header, &dummy, read_header_auto))
1388 {
1389 case HEADER_SUCCESS:
1390 set_next_block_after (header);
1391 break;
1392
1393 case HEADER_FAILURE:
1394 break;
1395
1396 default:
1397 ERROR ((0, 0, _("This does not look like a tar archive")));
1398 return false;
1399 }
1400 break;
1401 }
1402
1403 case GNUTYPE_VOLHDR:
1404 if (!read_header0 (&dummy))
1405 return false;
1406 tar_stat_destroy (&dummy);
1407 assign_string (&volume_label, current_header->header.name);
1408 set_next_block_after (header);
1409 header = find_next_block ();
1410 if (header->header.typeflag != GNUTYPE_MULTIVOL)
1411 break;
1412 /* FALL THROUGH */
1413
1414 case GNUTYPE_MULTIVOL:
1415 if (!read_header0 (&dummy))
1416 return false;
1417 tar_stat_destroy (&dummy);
1418 assign_string (&continued_file_name, current_header->header.name);
1419 continued_file_size =
1420 UINTMAX_FROM_HEADER (current_header->header.size);
1421 continued_file_offset =
1422 UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset);
1423 break;
1424
1425 default:
1426 break;
1427 }
1428
1429 if (bufmap_head)
1430 {
1431 uintmax_t s;
1432 if (!continued_file_name
1433 || strcmp (continued_file_name, bufmap_head->file_name))
1434 {
1435 if ((archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
1436 && strlen (bufmap_head->file_name) >= NAME_FIELD_SIZE
1437 && strncmp (continued_file_name, bufmap_head->file_name,
1438 NAME_FIELD_SIZE) == 0)
1439 WARN ((0, 0,
1440 _("%s is possibly continued on this volume: header contains truncated name"),
1441 quote (bufmap_head->file_name)));
1442 else
1443 {
1444 WARN ((0, 0, _("%s is not continued on this volume"),
1445 quote (bufmap_head->file_name)));
1446 return false;
1447 }
1448 }
1449
1450 s = continued_file_size + continued_file_offset;
1451
1452 if (bufmap_head->sizetotal != s || s < continued_file_offset)
1453 {
1454 char totsizebuf[UINTMAX_STRSIZE_BOUND];
1455 char s1buf[UINTMAX_STRSIZE_BOUND];
1456 char s2buf[UINTMAX_STRSIZE_BOUND];
1457
1458 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
1459 quote (continued_file_name),
1460 STRINGIFY_BIGINT (bufmap_head->sizetotal, totsizebuf),
1461 STRINGIFY_BIGINT (continued_file_size, s1buf),
1462 STRINGIFY_BIGINT (continued_file_offset, s2buf)));
1463 return false;
1464 }
1465
1466 if (bufmap_head->sizetotal - bufmap_head->sizeleft !=
1467 continued_file_offset)
1468 {
1469 char totsizebuf[UINTMAX_STRSIZE_BOUND];
1470 char s1buf[UINTMAX_STRSIZE_BOUND];
1471 char s2buf[UINTMAX_STRSIZE_BOUND];
1472
1473 WARN ((0, 0, _("This volume is out of sequence (%s - %s != %s)"),
1474 STRINGIFY_BIGINT (bufmap_head->sizetotal, totsizebuf),
1475 STRINGIFY_BIGINT (bufmap_head->sizeleft, s1buf),
1476 STRINGIFY_BIGINT (continued_file_offset, s2buf)));
1477
1478 return false;
1479 }
1480 }
1481
1482 increase_volume_number ();
1483 return true;
1484 }
1485
1486 \f
1487 #define VOLUME_TEXT " Volume "
1488 #define VOLUME_TEXT_LEN (sizeof VOLUME_TEXT - 1)
1489
1490 char *
1491 drop_volume_label_suffix (const char *label)
1492 {
1493 const char *p;
1494 size_t len = strlen (label);
1495
1496 if (len < 1)
1497 return NULL;
1498
1499 for (p = label + len - 1; p > label && isdigit ((unsigned char) *p); p--)
1500 ;
1501 if (p > label && p - (VOLUME_TEXT_LEN - 1) > label)
1502 {
1503 p -= VOLUME_TEXT_LEN - 1;
1504 if (memcmp (p, VOLUME_TEXT, VOLUME_TEXT_LEN) == 0)
1505 {
1506 char *s = xmalloc ((len = p - label) + 1);
1507 memcpy (s, label, len);
1508 s[len] = 0;
1509 return s;
1510 }
1511 }
1512
1513 return NULL;
1514 }
1515
1516 /* Check LABEL against the volume label, seen as a globbing
1517 pattern. Return true if the pattern matches. In case of failure,
1518 retry matching a volume sequence number before giving up in
1519 multi-volume mode. */
1520 static bool
1521 check_label_pattern (const char *label)
1522 {
1523 char *string;
1524 bool result = false;
1525
1526 if (fnmatch (volume_label_option, label, 0) == 0)
1527 return true;
1528
1529 if (!multi_volume_option)
1530 return false;
1531
1532 string = drop_volume_label_suffix (label);
1533 if (string)
1534 {
1535 result = fnmatch (string, volume_label_option, 0) == 0;
1536 free (string);
1537 }
1538 return result;
1539 }
1540
1541 /* Check if the next block contains a volume label and if this matches
1542 the one given in the command line */
1543 static void
1544 match_volume_label (void)
1545 {
1546 if (!volume_label)
1547 {
1548 union block *label = find_next_block ();
1549
1550 if (!label)
1551 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1552 quote (volume_label_option)));
1553 if (label->header.typeflag == GNUTYPE_VOLHDR)
1554 {
1555 if (memchr (label->header.name, '\0', sizeof label->header.name))
1556 assign_string (&volume_label, label->header.name);
1557 else
1558 {
1559 volume_label = xmalloc (sizeof (label->header.name) + 1);
1560 memcpy (volume_label, label->header.name,
1561 sizeof (label->header.name));
1562 volume_label[sizeof (label->header.name)] = 0;
1563 }
1564 }
1565 else if (label->header.typeflag == XGLTYPE)
1566 {
1567 struct tar_stat_info st;
1568 tar_stat_init (&st);
1569 xheader_read (&st.xhdr, label,
1570 OFF_FROM_HEADER (label->header.size));
1571 xheader_decode (&st);
1572 tar_stat_destroy (&st);
1573 }
1574 }
1575
1576 if (!volume_label)
1577 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1578 quote (volume_label_option)));
1579
1580 if (!check_label_pattern (volume_label))
1581 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
1582 quote_n (0, volume_label),
1583 quote_n (1, volume_label_option)));
1584 }
1585
1586 /* Mark the archive with volume label STR. */
1587 static void
1588 _write_volume_label (const char *str)
1589 {
1590 if (archive_format == POSIX_FORMAT)
1591 xheader_store ("GNU.volume.label", &dummy, str);
1592 else
1593 {
1594 union block *label = find_next_block ();
1595
1596 memset (label, 0, BLOCKSIZE);
1597
1598 strcpy (label->header.name, str);
1599 assign_string (&current_stat_info.file_name,
1600 label->header.name);
1601 current_stat_info.had_trailing_slash =
1602 strip_trailing_slashes (current_stat_info.file_name);
1603
1604 label->header.typeflag = GNUTYPE_VOLHDR;
1605 TIME_TO_CHARS (start_time.tv_sec, label->header.mtime);
1606 finish_header (&current_stat_info, label, -1);
1607 set_next_block_after (label);
1608 }
1609 }
1610
1611 #define VOL_SUFFIX "Volume"
1612
1613 /* Add a volume label to a part of multi-volume archive */
1614 static void
1615 add_volume_label (void)
1616 {
1617 char buf[UINTMAX_STRSIZE_BOUND];
1618 char *p = STRINGIFY_BIGINT (volno, buf);
1619 char *s = xmalloc (strlen (volume_label_option) + sizeof VOL_SUFFIX
1620 + strlen (p) + 2);
1621 sprintf (s, "%s %s %s", volume_label_option, VOL_SUFFIX, p);
1622 _write_volume_label (s);
1623 free (s);
1624 }
1625
1626 static void
1627 add_chunk_header (struct bufmap *map)
1628 {
1629 if (archive_format == POSIX_FORMAT)
1630 {
1631 off_t block_ordinal;
1632 union block *blk;
1633 struct tar_stat_info st;
1634
1635 memset (&st, 0, sizeof st);
1636 st.orig_file_name = st.file_name = map->file_name;
1637 st.stat.st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
1638 st.stat.st_uid = getuid ();
1639 st.stat.st_gid = getgid ();
1640 st.orig_file_name = xheader_format_name (&st,
1641 "%d/GNUFileParts.%p/%f.%n",
1642 volno);
1643 st.file_name = st.orig_file_name;
1644 st.archive_file_size = st.stat.st_size = map->sizeleft;
1645
1646 block_ordinal = current_block_ordinal ();
1647 blk = start_header (&st);
1648 if (!blk)
1649 abort (); /* FIXME */
1650 finish_header (&st, blk, block_ordinal);
1651 free (st.orig_file_name);
1652 }
1653 }
1654
1655
1656 /* Add a volume label to the current archive */
1657 static void
1658 write_volume_label (void)
1659 {
1660 if (multi_volume_option)
1661 add_volume_label ();
1662 else
1663 _write_volume_label (volume_label_option);
1664 }
1665
1666 /* Write GNU multi-volume header */
1667 static void
1668 gnu_add_multi_volume_header (struct bufmap *map)
1669 {
1670 int tmp;
1671 union block *block = find_next_block ();
1672
1673 if (strlen (map->file_name) > NAME_FIELD_SIZE)
1674 WARN ((0, 0,
1675 _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
1676 quotearg_colon (map->file_name)));
1677
1678 memset (block, 0, BLOCKSIZE);
1679
1680 strncpy (block->header.name, map->file_name, NAME_FIELD_SIZE);
1681 block->header.typeflag = GNUTYPE_MULTIVOL;
1682
1683 OFF_TO_CHARS (map->sizeleft, block->header.size);
1684 OFF_TO_CHARS (map->sizetotal - map->sizeleft,
1685 block->oldgnu_header.offset);
1686
1687 tmp = verbose_option;
1688 verbose_option = 0;
1689 finish_header (&current_stat_info, block, -1);
1690 verbose_option = tmp;
1691 set_next_block_after (block);
1692 }
1693
1694 /* Add a multi volume header to the current archive. The exact header format
1695 depends on the archive format. */
1696 static void
1697 add_multi_volume_header (struct bufmap *map)
1698 {
1699 if (archive_format == POSIX_FORMAT)
1700 {
1701 off_t d = map->sizetotal - map->sizeleft;
1702 xheader_store ("GNU.volume.filename", &dummy, map->file_name);
1703 xheader_store ("GNU.volume.size", &dummy, &map->sizeleft);
1704 xheader_store ("GNU.volume.offset", &dummy, &d);
1705 }
1706 else
1707 gnu_add_multi_volume_header (map);
1708 }
1709
1710 \f
1711 /* Low-level flush functions */
1712
1713 /* Simple flush read (no multi-volume or label extensions) */
1714 static void
1715 simple_flush_read (void)
1716 {
1717 size_t status; /* result from system call */
1718
1719 checkpoint_run (false);
1720
1721 /* Clear the count of errors. This only applies to a single call to
1722 flush_read. */
1723
1724 read_error_count = 0; /* clear error count */
1725
1726 if (write_archive_to_stdout && record_start_block != 0)
1727 {
1728 archive = STDOUT_FILENO;
1729 status = sys_write_archive_buffer ();
1730 archive = STDIN_FILENO;
1731 if (status != record_size)
1732 archive_write_error (status);
1733 }
1734
1735 for (;;)
1736 {
1737 status = rmtread (archive, record_start->buffer, record_size);
1738 if (status == record_size)
1739 {
1740 records_read++;
1741 return;
1742 }
1743 if (status == SAFE_READ_ERROR)
1744 {
1745 archive_read_error ();
1746 continue; /* try again */
1747 }
1748 break;
1749 }
1750 short_read (status);
1751 }
1752
1753 /* Simple flush write (no multi-volume or label extensions) */
1754 static void
1755 simple_flush_write (size_t level __attribute__((unused)))
1756 {
1757 ssize_t status;
1758
1759 status = _flush_write ();
1760 if (status != record_size)
1761 archive_write_error (status);
1762 else
1763 {
1764 records_written++;
1765 bytes_written += status;
1766 }
1767 }
1768
1769 \f
1770 /* GNU flush functions. These support multi-volume and archive labels in
1771 GNU and PAX archive formats. */
1772
1773 static void
1774 _gnu_flush_read (void)
1775 {
1776 size_t status; /* result from system call */
1777
1778 checkpoint_run (false);
1779
1780 /* Clear the count of errors. This only applies to a single call to
1781 flush_read. */
1782
1783 read_error_count = 0; /* clear error count */
1784
1785 if (write_archive_to_stdout && record_start_block != 0)
1786 {
1787 archive = STDOUT_FILENO;
1788 status = sys_write_archive_buffer ();
1789 archive = STDIN_FILENO;
1790 if (status != record_size)
1791 archive_write_error (status);
1792 }
1793
1794 for (;;)
1795 {
1796 status = rmtread (archive, record_start->buffer, record_size);
1797 if (status == record_size)
1798 {
1799 records_read++;
1800 return;
1801 }
1802
1803 /* The condition below used to include
1804 || (status > 0 && !read_full_records)
1805 This is incorrect since even if new_volume() succeeds, the
1806 subsequent call to rmtread will overwrite the chunk of data
1807 already read in the buffer, so the processing will fail */
1808 if ((status == 0
1809 || (status == SAFE_READ_ERROR && errno == ENOSPC))
1810 && multi_volume_option)
1811 {
1812 while (!try_new_volume ())
1813 ;
1814 if (current_block == record_end)
1815 /* Necessary for blocking_factor == 1 */
1816 flush_archive();
1817 return;
1818 }
1819 else if (status == SAFE_READ_ERROR)
1820 {
1821 archive_read_error ();
1822 continue;
1823 }
1824 break;
1825 }
1826 short_read (status);
1827 }
1828
1829 static void
1830 gnu_flush_read (void)
1831 {
1832 flush_read_ptr = simple_flush_read; /* Avoid recursion */
1833 _gnu_flush_read ();
1834 flush_read_ptr = gnu_flush_read;
1835 }
1836
1837 static void
1838 _gnu_flush_write (size_t buffer_level)
1839 {
1840 ssize_t status;
1841 union block *header;
1842 char *copy_ptr;
1843 size_t copy_size;
1844 size_t bufsize;
1845 struct bufmap *map;
1846
1847 status = _flush_write ();
1848 if (status != record_size && !multi_volume_option)
1849 archive_write_error (status);
1850 else
1851 {
1852 if (status)
1853 records_written++;
1854 bytes_written += status;
1855 }
1856
1857 if (status == record_size)
1858 {
1859 return;
1860 }
1861
1862 map = bufmap_locate (status);
1863
1864 if (status % BLOCKSIZE)
1865 {
1866 ERROR ((0, 0, _("write did not end on a block boundary")));
1867 archive_write_error (status);
1868 }
1869
1870 /* In multi-volume mode. */
1871 /* ENXIO is for the UNIX PC. */
1872 if (status < 0 && errno != ENOSPC && errno != EIO && errno != ENXIO)
1873 archive_write_error (status);
1874
1875 if (!new_volume (ACCESS_WRITE))
1876 return;
1877
1878 tar_stat_destroy (&dummy);
1879
1880 increase_volume_number ();
1881 prev_written += bytes_written;
1882 bytes_written = 0;
1883
1884 copy_ptr = record_start->buffer + status;
1885 copy_size = buffer_level - status;
1886
1887 /* Switch to the next buffer */
1888 record_index = !record_index;
1889 init_buffer ();
1890
1891 inhibit_map = 1;
1892
1893 if (volume_label_option)
1894 add_volume_label ();
1895
1896 if (map)
1897 add_multi_volume_header (map);
1898
1899 write_extended (true, &dummy, find_next_block ());
1900 tar_stat_destroy (&dummy);
1901
1902 if (map)
1903 add_chunk_header (map);
1904 header = find_next_block ();
1905 bufmap_reset (map, header - record_start);
1906 bufsize = available_space_after (header);
1907 inhibit_map = 0;
1908 while (bufsize < copy_size)
1909 {
1910 memcpy (header->buffer, copy_ptr, bufsize);
1911 copy_ptr += bufsize;
1912 copy_size -= bufsize;
1913 set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
1914 header = find_next_block ();
1915 bufsize = available_space_after (header);
1916 }
1917 memcpy (header->buffer, copy_ptr, copy_size);
1918 memset (header->buffer + copy_size, 0, bufsize - copy_size);
1919 set_next_block_after (header + (copy_size - 1) / BLOCKSIZE);
1920 find_next_block ();
1921 }
1922
1923 static void
1924 gnu_flush_write (size_t buffer_level)
1925 {
1926 flush_write_ptr = simple_flush_write; /* Avoid recursion */
1927 _gnu_flush_write (buffer_level);
1928 flush_write_ptr = gnu_flush_write;
1929 }
1930
1931 void
1932 flush_read (void)
1933 {
1934 flush_read_ptr ();
1935 }
1936
1937 void
1938 flush_write (void)
1939 {
1940 flush_write_ptr (record_size);
1941 }
1942
1943 void
1944 open_archive (enum access_mode wanted_access)
1945 {
1946 flush_read_ptr = gnu_flush_read;
1947 flush_write_ptr = gnu_flush_write;
1948
1949 _open_archive (wanted_access);
1950 switch (wanted_access)
1951 {
1952 case ACCESS_READ:
1953 case ACCESS_UPDATE:
1954 if (volume_label_option)
1955 match_volume_label ();
1956 break;
1957
1958 case ACCESS_WRITE:
1959 records_written = 0;
1960 if (volume_label_option)
1961 write_volume_label ();
1962 break;
1963 }
1964 set_volume_start_time ();
1965 }
This page took 0.113374 seconds and 4 git commands to generate.