]> Dogcows Code - chaz/tar/blob - src/buffer.c
Merge branch 'master' of ssh://git.sv.gnu.org/srv/git/tar
[chaz/tar] / src / buffer.c
1 /* Buffer management for tar.
2
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
5 Foundation, Inc.
6
7 Written by John Gilmore, on 1985-08-25.
8
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
12 version.
13
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.
18
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. */
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 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 void (*flush_write_ptr) (size_t);
87 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 ()
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 ()
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 double duration;
234
235 void
236 set_start_time ()
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 ()
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, },
293 { ct_tar },
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 ()
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 if (verify_option)
726 archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
727 MODE_RW, rsh_command_option);
728 else
729 switch (wanted_access)
730 {
731 case ACCESS_READ:
732 archive = open_compressed_archive ();
733 if (archive >= 0)
734 guess_seekable_archive ();
735 break;
736
737 case ACCESS_WRITE:
738 if (backup_option)
739 {
740 maybe_backup_file (archive_name_array[0], 1);
741 backed_up_flag = 1;
742 }
743 archive = rmtcreat (archive_name_array[0], MODE_RW,
744 rsh_command_option);
745 break;
746
747 case ACCESS_UPDATE:
748 archive = rmtopen (archive_name_array[0],
749 O_RDWR | O_CREAT | O_BINARY,
750 MODE_RW, rsh_command_option);
751
752 switch (check_compressed_archive (NULL))
753 {
754 case ct_none:
755 case ct_tar:
756 break;
757
758 default:
759 FATAL_ERROR ((0, 0,
760 _("Cannot update compressed archives")));
761 }
762 break;
763 }
764
765 if (archive < 0
766 || (! _isrmt (archive) && !sys_get_archive_stat ()))
767 {
768 int saved_errno = errno;
769
770 if (backed_up_flag)
771 undo_last_backup ();
772 errno = saved_errno;
773 open_fatal (archive_name_array[0]);
774 }
775
776 sys_detect_dev_null_output ();
777 sys_save_archive_dev_ino ();
778 SET_BINARY_MODE (archive);
779
780 switch (wanted_access)
781 {
782 case ACCESS_READ:
783 find_next_block (); /* read it in, check for EOF */
784 break;
785
786 case ACCESS_UPDATE:
787 case ACCESS_WRITE:
788 records_written = 0;
789 break;
790 }
791 }
792
793 /* Perform a write to flush the buffer. */
794 static ssize_t
795 _flush_write (void)
796 {
797 ssize_t status;
798
799 checkpoint_run (true);
800 if (tape_length_option && tape_length_option <= bytes_written)
801 {
802 errno = ENOSPC;
803 status = 0;
804 }
805 else if (dev_null_output)
806 status = record_size;
807 else
808 status = sys_write_archive_buffer ();
809
810 if (status && multi_volume_option && !inhibit_map)
811 {
812 struct bufmap *map = bufmap_locate (status);
813 if (map)
814 {
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)
820 map = map->next;
821 bufmap_reset (map, map ? (- map->start) : 0);
822 }
823 }
824 return status;
825 }
826
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. */
830 void
831 archive_write_error (ssize_t status)
832 {
833 /* It might be useful to know how much was written before the error
834 occurred. */
835 if (totals_option)
836 {
837 int e = errno;
838 print_total_stats ();
839 errno = e;
840 }
841
842 write_fatal_details (*archive_name_cursor, status, record_size);
843 }
844
845 /* Handle read errors on the archive. If the read should be retried,
846 return to the caller. */
847 void
848 archive_read_error (void)
849 {
850 read_error (*archive_name_cursor);
851
852 if (record_start_block == 0)
853 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
854
855 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
856 then give up on reading the archive. */
857
858 if (read_error_count++ > READ_ERROR_MAX)
859 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
860 return;
861 }
862
863 static bool
864 archive_is_dev (void)
865 {
866 struct stat st;
867
868 if (fstat (archive, &st))
869 {
870 stat_diag (*archive_name_cursor);
871 return false;
872 }
873 return S_ISBLK (st.st_mode) || S_ISCHR (st.st_mode);
874 }
875
876 static void
877 short_read (size_t status)
878 {
879 size_t left; /* bytes left */
880 char *more; /* pointer to next byte to read */
881
882 more = record_start->buffer + status;
883 left = record_size - status;
884
885 if (left && left % BLOCKSIZE == 0
886 && verbose_option
887 && record_start_block == 0 && status != 0
888 && archive_is_dev ())
889 {
890 unsigned long rsize = status / BLOCKSIZE;
891 WARN ((0, 0,
892 ngettext ("Record size = %lu block",
893 "Record size = %lu blocks",
894 rsize),
895 rsize));
896 }
897
898 while (left % BLOCKSIZE != 0
899 || (left && status && read_full_records))
900 {
901 if (status)
902 while ((status = rmtread (archive, more, left)) == SAFE_READ_ERROR)
903 archive_read_error ();
904
905 if (status == 0)
906 break;
907
908 if (! read_full_records)
909 {
910 unsigned long rest = record_size - left;
911
912 FATAL_ERROR ((0, 0,
913 ngettext ("Unaligned block (%lu byte) in archive",
914 "Unaligned block (%lu bytes) in archive",
915 rest),
916 rest));
917 }
918
919 left -= status;
920 more += status;
921 }
922
923 record_end = record_start + (record_size - left) / BLOCKSIZE;
924 records_read++;
925 }
926
927 /* Flush the current buffer to/from the archive. */
928 void
929 flush_archive (void)
930 {
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;
935
936 if (access_mode == ACCESS_READ && time_to_start_writing)
937 {
938 access_mode = ACCESS_WRITE;
939 time_to_start_writing = false;
940 backspace_output ();
941 }
942
943 switch (access_mode)
944 {
945 case ACCESS_READ:
946 flush_read ();
947 break;
948
949 case ACCESS_WRITE:
950 flush_write_ptr (buffer_level);
951 break;
952
953 case ACCESS_UPDATE:
954 abort ();
955 }
956 }
957
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! */
961 static void
962 backspace_output (void)
963 {
964 #ifdef MTIOCTOP
965 {
966 struct mtop operation;
967
968 operation.mt_op = MTBSR;
969 operation.mt_count = 1;
970 if (rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
971 return;
972 if (errno == EIO && rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
973 return;
974 }
975 #endif
976
977 {
978 off_t position = rmtlseek (archive, (off_t) 0, SEEK_CUR);
979
980 /* Seek back to the beginning of this record and start writing there. */
981
982 position -= record_size;
983 if (position < 0)
984 position = 0;
985 if (rmtlseek (archive, position, SEEK_SET) != position)
986 {
987 /* Lseek failed. Try a different method. */
988
989 WARN ((0, 0,
990 _("Cannot backspace archive file; it may be unreadable without -i")));
991
992 /* Replace the first part of the record with NULs. */
993
994 if (record_start->buffer != output_start)
995 memset (record_start->buffer, 0,
996 output_start - record_start->buffer);
997 }
998 }
999 }
1000
1001 off_t
1002 seek_archive (off_t size)
1003 {
1004 off_t start = current_block_ordinal ();
1005 off_t offset;
1006 off_t nrec, nblk;
1007 off_t skipped = (blocking_factor - (current_block - record_start))
1008 * BLOCKSIZE;
1009
1010 if (size <= skipped)
1011 return 0;
1012
1013 /* Compute number of records to skip */
1014 nrec = (size - skipped) / record_size;
1015 if (nrec == 0)
1016 return 0;
1017 offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
1018 if (offset < 0)
1019 return offset;
1020
1021 if (offset % record_size)
1022 FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
1023
1024 /* Convert to number of records */
1025 offset /= BLOCKSIZE;
1026 /* Compute number of skipped blocks */
1027 nblk = offset - start;
1028
1029 /* Update buffering info */
1030 records_read += nblk / blocking_factor;
1031 record_start_block = offset - blocking_factor;
1032 current_block = record_end;
1033
1034 return nblk;
1035 }
1036
1037 /* Close the archive file. */
1038 void
1039 close_archive (void)
1040 {
1041 if (time_to_start_writing || access_mode == ACCESS_WRITE)
1042 {
1043 flush_archive ();
1044 if (current_block > record_start)
1045 flush_archive ();
1046 }
1047
1048 compute_duration ();
1049 if (verify_option)
1050 verify_volume ();
1051
1052 if (rmtclose (archive) != 0)
1053 close_error (*archive_name_cursor);
1054
1055 sys_wait_for_child (child_pid, hit_eof);
1056
1057 tar_stat_destroy (&current_stat_info);
1058 free (record_buffer[0]);
1059 free (record_buffer[1]);
1060 bufmap_free (NULL);
1061 }
1062
1063 /* Called to initialize the global volume number. */
1064 void
1065 init_volume_number (void)
1066 {
1067 FILE *file = fopen (volno_file_option, "r");
1068
1069 if (file)
1070 {
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)));
1075 if (ferror (file))
1076 read_error (volno_file_option);
1077 if (fclose (file) != 0)
1078 close_error (volno_file_option);
1079 }
1080 else if (errno != ENOENT)
1081 open_error (volno_file_option);
1082 }
1083
1084 /* Called to write out the closing global volume number. */
1085 void
1086 closeout_volume_number (void)
1087 {
1088 FILE *file = fopen (volno_file_option, "w");
1089
1090 if (file)
1091 {
1092 fprintf (file, "%d\n", global_volno);
1093 if (ferror (file))
1094 write_error (volno_file_option);
1095 if (fclose (file) != 0)
1096 close_error (volno_file_option);
1097 }
1098 else
1099 open_error (volno_file_option);
1100 }
1101
1102 \f
1103 static void
1104 increase_volume_number (void)
1105 {
1106 global_volno++;
1107 if (global_volno < 0)
1108 FATAL_ERROR ((0, 0, _("Volume number overflow")));
1109 volno++;
1110 }
1111
1112 static void
1113 change_tape_menu (FILE *read_file)
1114 {
1115 char *input_buffer = NULL;
1116 size_t size = 0;
1117 bool stop = false;
1118
1119 while (!stop)
1120 {
1121 fputc ('\007', stderr);
1122 fprintf (stderr,
1123 _("Prepare volume #%d for %s and hit return: "),
1124 global_volno + 1, quote (*archive_name_cursor));
1125 fflush (stderr);
1126
1127 if (getline (&input_buffer, &size, read_file) <= 0)
1128 {
1129 WARN ((0, 0, _("EOF where user reply was expected")));
1130
1131 if (subcommand_option != EXTRACT_SUBCOMMAND
1132 && subcommand_option != LIST_SUBCOMMAND
1133 && subcommand_option != DIFF_SUBCOMMAND)
1134 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1135
1136 fatal_exit ();
1137 }
1138
1139 if (input_buffer[0] == '\n'
1140 || input_buffer[0] == 'y'
1141 || input_buffer[0] == 'Y')
1142 break;
1143
1144 switch (input_buffer[0])
1145 {
1146 case '?':
1147 {
1148 fprintf (stderr, _("\
1149 n name Give a new file name for the next (and subsequent) volume(s)\n\
1150 q Abort tar\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"));
1155 }
1156 break;
1157
1158 case 'q':
1159 /* Quit. */
1160
1161 WARN ((0, 0, _("No new volume; exiting.\n")));
1162
1163 if (subcommand_option != EXTRACT_SUBCOMMAND
1164 && subcommand_option != LIST_SUBCOMMAND
1165 && subcommand_option != DIFF_SUBCOMMAND)
1166 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1167
1168 fatal_exit ();
1169
1170 case 'n':
1171 /* Get new file name. */
1172
1173 {
1174 char *name;
1175 char *cursor;
1176
1177 for (name = input_buffer + 1;
1178 *name == ' ' || *name == '\t';
1179 name++)
1180 ;
1181
1182 for (cursor = name; *cursor && *cursor != '\n'; cursor++)
1183 ;
1184 *cursor = '\0';
1185
1186 if (name[0])
1187 {
1188 /* FIXME: the following allocation is never reclaimed. */
1189 *archive_name_cursor = xstrdup (name);
1190 stop = true;
1191 }
1192 else
1193 fprintf (stderr, "%s",
1194 _("File name not specified. Try again.\n"));
1195 }
1196 break;
1197
1198 case '!':
1199 if (!restrict_option)
1200 {
1201 sys_spawn_shell ();
1202 break;
1203 }
1204 /* FALL THROUGH */
1205
1206 default:
1207 fprintf (stderr, _("Invalid input. Type ? for help.\n"));
1208 }
1209 }
1210 free (input_buffer);
1211 }
1212
1213 /* We've hit the end of the old volume. Close it and open the next one.
1214 Return nonzero on success.
1215 */
1216 static bool
1217 new_volume (enum access_mode mode)
1218 {
1219 static FILE *read_file;
1220 static int looped;
1221 int prompt;
1222
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;
1226
1227 if (now_verifying)
1228 return false;
1229 if (verify_option)
1230 verify_volume ();
1231
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;
1236
1237 if (rmtclose (archive) != 0)
1238 close_error (*archive_name_cursor);
1239
1240 archive_name_cursor++;
1241 if (archive_name_cursor == archive_name_array + archive_names)
1242 {
1243 archive_name_cursor = archive_name_array;
1244 looped = 1;
1245 }
1246 prompt = looped;
1247
1248 tryagain:
1249 if (prompt)
1250 {
1251 /* We have to prompt from now on. */
1252
1253 if (info_script_option)
1254 {
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)));
1260 }
1261 else
1262 change_tape_menu (read_file);
1263 }
1264
1265 if (strcmp (archive_name_cursor[0], "-") == 0)
1266 {
1267 read_full_records = true;
1268 archive = STDIN_FILENO;
1269 }
1270 else if (verify_option)
1271 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1272 rsh_command_option);
1273 else
1274 switch (mode)
1275 {
1276 case ACCESS_READ:
1277 archive = rmtopen (*archive_name_cursor, O_RDONLY, MODE_RW,
1278 rsh_command_option);
1279 guess_seekable_archive ();
1280 break;
1281
1282 case ACCESS_WRITE:
1283 if (backup_option)
1284 maybe_backup_file (*archive_name_cursor, 1);
1285 archive = rmtcreat (*archive_name_cursor, MODE_RW,
1286 rsh_command_option);
1287 break;
1288
1289 case ACCESS_UPDATE:
1290 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1291 rsh_command_option);
1292 break;
1293 }
1294
1295 if (archive < 0)
1296 {
1297 open_warn (*archive_name_cursor);
1298 if (!verify_option && mode == ACCESS_WRITE && backup_option)
1299 undo_last_backup ();
1300 prompt = 1;
1301 goto tryagain;
1302 }
1303
1304 SET_BINARY_MODE (archive);
1305
1306 return true;
1307 }
1308
1309 static bool
1310 read_header0 (struct tar_stat_info *info)
1311 {
1312 enum read_header rc;
1313
1314 tar_stat_init (info);
1315 rc = read_header (&current_header, info, read_header_auto);
1316 if (rc == HEADER_SUCCESS)
1317 {
1318 set_next_block_after (current_header);
1319 return true;
1320 }
1321 ERROR ((0, 0, _("This does not look like a tar archive")));
1322 return false;
1323 }
1324
1325 static bool
1326 try_new_volume (void)
1327 {
1328 size_t status;
1329 union block *header;
1330 enum access_mode acc;
1331
1332 switch (subcommand_option)
1333 {
1334 case APPEND_SUBCOMMAND:
1335 case CAT_SUBCOMMAND:
1336 case UPDATE_SUBCOMMAND:
1337 acc = ACCESS_UPDATE;
1338 break;
1339
1340 default:
1341 acc = ACCESS_READ;
1342 break;
1343 }
1344
1345 if (!new_volume (acc))
1346 return true;
1347
1348 while ((status = rmtread (archive, record_start->buffer, record_size))
1349 == SAFE_READ_ERROR)
1350 archive_read_error ();
1351
1352 if (status != record_size)
1353 short_read (status);
1354
1355 header = find_next_block ();
1356 if (!header)
1357 return false;
1358
1359 switch (header->header.typeflag)
1360 {
1361 case XGLTYPE:
1362 {
1363 tar_stat_init (&dummy);
1364 if (read_header (&header, &dummy, read_header_x_global)
1365 != HEADER_SUCCESS_EXTENDED)
1366 {
1367 ERROR ((0, 0, _("This does not look like a tar archive")));
1368 return false;
1369 }
1370
1371 xheader_decode (&dummy); /* decodes values from the global header */
1372 tar_stat_destroy (&dummy);
1373
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.
1380
1381 If this happens, the following call to read_header returns
1382 HEADER_FAILURE, which is ignored.
1383
1384 See also tests/multiv07.at */
1385
1386 switch (read_header (&header, &dummy, read_header_auto))
1387 {
1388 case HEADER_SUCCESS:
1389 set_next_block_after (header);
1390 break;
1391
1392 case HEADER_FAILURE:
1393 break;
1394
1395 default:
1396 ERROR ((0, 0, _("This does not look like a tar archive")));
1397 return false;
1398 }
1399 break;
1400 }
1401
1402 case GNUTYPE_VOLHDR:
1403 if (!read_header0 (&dummy))
1404 return false;
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)
1410 break;
1411 /* FALL THROUGH */
1412
1413 case GNUTYPE_MULTIVOL:
1414 if (!read_header0 (&dummy))
1415 return false;
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);
1422 break;
1423
1424 default:
1425 break;
1426 }
1427
1428 if (bufmap_head)
1429 {
1430 uintmax_t s;
1431 if (!continued_file_name
1432 || strcmp (continued_file_name, bufmap_head->file_name))
1433 {
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)
1438 WARN ((0, 0,
1439 _("%s is possibly continued on this volume: header contains truncated name"),
1440 quote (bufmap_head->file_name)));
1441 else
1442 {
1443 WARN ((0, 0, _("%s is not continued on this volume"),
1444 quote (bufmap_head->file_name)));
1445 return false;
1446 }
1447 }
1448
1449 s = continued_file_size + continued_file_offset;
1450
1451 if (bufmap_head->sizetotal != s || s < continued_file_offset)
1452 {
1453 char totsizebuf[UINTMAX_STRSIZE_BOUND];
1454 char s1buf[UINTMAX_STRSIZE_BOUND];
1455 char s2buf[UINTMAX_STRSIZE_BOUND];
1456
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)));
1462 return false;
1463 }
1464
1465 if (bufmap_head->sizetotal - bufmap_head->sizeleft !=
1466 continued_file_offset)
1467 {
1468 char totsizebuf[UINTMAX_STRSIZE_BOUND];
1469 char s1buf[UINTMAX_STRSIZE_BOUND];
1470 char s2buf[UINTMAX_STRSIZE_BOUND];
1471
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)));
1476
1477 return false;
1478 }
1479 }
1480
1481 increase_volume_number ();
1482 return true;
1483 }
1484
1485 \f
1486 #define VOLUME_TEXT " Volume "
1487 #define VOLUME_TEXT_LEN (sizeof VOLUME_TEXT - 1)
1488
1489 char *
1490 drop_volume_label_suffix (const char *label)
1491 {
1492 const char *p;
1493 size_t len = strlen (label);
1494
1495 if (len < 1)
1496 return NULL;
1497
1498 for (p = label + len - 1; p > label && isdigit ((unsigned char) *p); p--)
1499 ;
1500 if (p > label && p - (VOLUME_TEXT_LEN - 1) > label)
1501 {
1502 p -= VOLUME_TEXT_LEN - 1;
1503 if (memcmp (p, VOLUME_TEXT, VOLUME_TEXT_LEN) == 0)
1504 {
1505 char *s = xmalloc ((len = p - label) + 1);
1506 memcpy (s, label, len);
1507 s[len] = 0;
1508 return s;
1509 }
1510 }
1511
1512 return NULL;
1513 }
1514
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. */
1519 static bool
1520 check_label_pattern (const char *label)
1521 {
1522 char *string;
1523 bool result = false;
1524
1525 if (fnmatch (volume_label_option, label, 0) == 0)
1526 return true;
1527
1528 if (!multi_volume_option)
1529 return false;
1530
1531 string = drop_volume_label_suffix (label);
1532 if (string)
1533 {
1534 result = fnmatch (string, volume_label_option, 0) == 0;
1535 free (string);
1536 }
1537 return result;
1538 }
1539
1540 /* Check if the next block contains a volume label and if this matches
1541 the one given in the command line */
1542 static void
1543 match_volume_label (void)
1544 {
1545 if (!volume_label)
1546 {
1547 union block *label = find_next_block ();
1548
1549 if (!label)
1550 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1551 quote (volume_label_option)));
1552 if (label->header.typeflag == GNUTYPE_VOLHDR)
1553 {
1554 if (memchr (label->header.name, '\0', sizeof label->header.name))
1555 assign_string (&volume_label, label->header.name);
1556 else
1557 {
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;
1562 }
1563 }
1564 else if (label->header.typeflag == XGLTYPE)
1565 {
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);
1572 }
1573 }
1574
1575 if (!volume_label)
1576 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1577 quote (volume_label_option)));
1578
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)));
1583 }
1584
1585 /* Mark the archive with volume label STR. */
1586 static void
1587 _write_volume_label (const char *str)
1588 {
1589 if (archive_format == POSIX_FORMAT)
1590 xheader_store ("GNU.volume.label", &dummy, str);
1591 else
1592 {
1593 union block *label = find_next_block ();
1594
1595 memset (label, 0, BLOCKSIZE);
1596
1597 strcpy (label->header.name, str);
1598 assign_string (&current_stat_info.file_name,
1599 label->header.name);
1600 current_stat_info.had_trailing_slash =
1601 strip_trailing_slashes (current_stat_info.file_name);
1602
1603 label->header.typeflag = GNUTYPE_VOLHDR;
1604 TIME_TO_CHARS (start_time.tv_sec, label->header.mtime);
1605 finish_header (&current_stat_info, label, -1);
1606 set_next_block_after (label);
1607 }
1608 }
1609
1610 #define VOL_SUFFIX "Volume"
1611
1612 /* Add a volume label to a part of multi-volume archive */
1613 static void
1614 add_volume_label (void)
1615 {
1616 char buf[UINTMAX_STRSIZE_BOUND];
1617 char *p = STRINGIFY_BIGINT (volno, buf);
1618 char *s = xmalloc (strlen (volume_label_option) + sizeof VOL_SUFFIX
1619 + strlen (p) + 2);
1620 sprintf (s, "%s %s %s", volume_label_option, VOL_SUFFIX, p);
1621 _write_volume_label (s);
1622 free (s);
1623 }
1624
1625 static void
1626 add_chunk_header (struct bufmap *map)
1627 {
1628 if (archive_format == POSIX_FORMAT)
1629 {
1630 off_t block_ordinal;
1631 union block *blk;
1632 struct tar_stat_info st;
1633
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",
1641 volno);
1642 st.file_name = st.orig_file_name;
1643 st.archive_file_size = st.stat.st_size = map->sizeleft;
1644
1645 block_ordinal = current_block_ordinal ();
1646 blk = start_header (&st);
1647 if (!blk)
1648 abort (); /* FIXME */
1649 finish_header (&st, blk, block_ordinal);
1650 free (st.orig_file_name);
1651 }
1652 }
1653
1654
1655 /* Add a volume label to the current archive */
1656 static void
1657 write_volume_label (void)
1658 {
1659 if (multi_volume_option)
1660 add_volume_label ();
1661 else
1662 _write_volume_label (volume_label_option);
1663 }
1664
1665 /* Write GNU multi-volume header */
1666 static void
1667 gnu_add_multi_volume_header (struct bufmap *map)
1668 {
1669 int tmp;
1670 union block *block = find_next_block ();
1671
1672 if (strlen (map->file_name) > NAME_FIELD_SIZE)
1673 WARN ((0, 0,
1674 _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
1675 quotearg_colon (map->file_name)));
1676
1677 memset (block, 0, BLOCKSIZE);
1678
1679 strncpy (block->header.name, map->file_name, NAME_FIELD_SIZE);
1680 block->header.typeflag = GNUTYPE_MULTIVOL;
1681
1682 OFF_TO_CHARS (map->sizeleft, block->header.size);
1683 OFF_TO_CHARS (map->sizetotal - map->sizeleft,
1684 block->oldgnu_header.offset);
1685
1686 tmp = verbose_option;
1687 verbose_option = 0;
1688 finish_header (&current_stat_info, block, -1);
1689 verbose_option = tmp;
1690 set_next_block_after (block);
1691 }
1692
1693 /* Add a multi volume header to the current archive. The exact header format
1694 depends on the archive format. */
1695 static void
1696 add_multi_volume_header (struct bufmap *map)
1697 {
1698 if (archive_format == POSIX_FORMAT)
1699 {
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);
1704 }
1705 else
1706 gnu_add_multi_volume_header (map);
1707 }
1708
1709 \f
1710 /* Low-level flush functions */
1711
1712 /* Simple flush read (no multi-volume or label extensions) */
1713 static void
1714 simple_flush_read (void)
1715 {
1716 size_t status; /* result from system call */
1717
1718 checkpoint_run (false);
1719
1720 /* Clear the count of errors. This only applies to a single call to
1721 flush_read. */
1722
1723 read_error_count = 0; /* clear error count */
1724
1725 if (write_archive_to_stdout && record_start_block != 0)
1726 {
1727 archive = STDOUT_FILENO;
1728 status = sys_write_archive_buffer ();
1729 archive = STDIN_FILENO;
1730 if (status != record_size)
1731 archive_write_error (status);
1732 }
1733
1734 for (;;)
1735 {
1736 status = rmtread (archive, record_start->buffer, record_size);
1737 if (status == record_size)
1738 {
1739 records_read++;
1740 return;
1741 }
1742 if (status == SAFE_READ_ERROR)
1743 {
1744 archive_read_error ();
1745 continue; /* try again */
1746 }
1747 break;
1748 }
1749 short_read (status);
1750 }
1751
1752 /* Simple flush write (no multi-volume or label extensions) */
1753 static void
1754 simple_flush_write (size_t level __attribute__((unused)))
1755 {
1756 ssize_t status;
1757
1758 status = _flush_write ();
1759 if (status != record_size)
1760 archive_write_error (status);
1761 else
1762 {
1763 records_written++;
1764 bytes_written += status;
1765 }
1766 }
1767
1768 \f
1769 /* GNU flush functions. These support multi-volume and archive labels in
1770 GNU and PAX archive formats. */
1771
1772 static void
1773 _gnu_flush_read (void)
1774 {
1775 size_t status; /* result from system call */
1776
1777 checkpoint_run (false);
1778
1779 /* Clear the count of errors. This only applies to a single call to
1780 flush_read. */
1781
1782 read_error_count = 0; /* clear error count */
1783
1784 if (write_archive_to_stdout && record_start_block != 0)
1785 {
1786 archive = STDOUT_FILENO;
1787 status = sys_write_archive_buffer ();
1788 archive = STDIN_FILENO;
1789 if (status != record_size)
1790 archive_write_error (status);
1791 }
1792
1793 for (;;)
1794 {
1795 status = rmtread (archive, record_start->buffer, record_size);
1796 if (status == record_size)
1797 {
1798 records_read++;
1799 return;
1800 }
1801
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 */
1807 if ((status == 0
1808 || (status == SAFE_READ_ERROR && errno == ENOSPC))
1809 && multi_volume_option)
1810 {
1811 while (!try_new_volume ())
1812 ;
1813 if (current_block == record_end)
1814 /* Necessary for blocking_factor == 1 */
1815 flush_archive();
1816 return;
1817 }
1818 else if (status == SAFE_READ_ERROR)
1819 {
1820 archive_read_error ();
1821 continue;
1822 }
1823 break;
1824 }
1825 short_read (status);
1826 }
1827
1828 static void
1829 gnu_flush_read (void)
1830 {
1831 flush_read_ptr = simple_flush_read; /* Avoid recursion */
1832 _gnu_flush_read ();
1833 flush_read_ptr = gnu_flush_read;
1834 }
1835
1836 static void
1837 _gnu_flush_write (size_t buffer_level)
1838 {
1839 ssize_t status;
1840 union block *header;
1841 char *copy_ptr;
1842 size_t copy_size;
1843 size_t bufsize;
1844 struct bufmap *map;
1845
1846 status = _flush_write ();
1847 if (status != record_size && !multi_volume_option)
1848 archive_write_error (status);
1849 else
1850 {
1851 if (status)
1852 records_written++;
1853 bytes_written += status;
1854 }
1855
1856 if (status == record_size)
1857 {
1858 return;
1859 }
1860
1861 map = bufmap_locate (status);
1862
1863 if (status % BLOCKSIZE)
1864 {
1865 ERROR ((0, 0, _("write did not end on a block boundary")));
1866 archive_write_error (status);
1867 }
1868
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);
1873
1874 if (!new_volume (ACCESS_WRITE))
1875 return;
1876
1877 tar_stat_destroy (&dummy);
1878
1879 increase_volume_number ();
1880 prev_written += bytes_written;
1881 bytes_written = 0;
1882
1883 copy_ptr = record_start->buffer + status;
1884 copy_size = buffer_level - status;
1885
1886 /* Switch to the next buffer */
1887 record_index = !record_index;
1888 init_buffer ();
1889
1890 inhibit_map = 1;
1891
1892 if (volume_label_option)
1893 add_volume_label ();
1894
1895 if (map)
1896 add_multi_volume_header (map);
1897
1898 write_extended (true, &dummy, find_next_block ());
1899 tar_stat_destroy (&dummy);
1900
1901 if (map)
1902 add_chunk_header (map);
1903 header = find_next_block ();
1904 bufmap_reset (map, header - record_start);
1905 bufsize = available_space_after (header);
1906 inhibit_map = 0;
1907 while (bufsize < copy_size)
1908 {
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);
1915 }
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);
1919 find_next_block ();
1920 }
1921
1922 static void
1923 gnu_flush_write (size_t buffer_level)
1924 {
1925 flush_write_ptr = simple_flush_write; /* Avoid recursion */
1926 _gnu_flush_write (buffer_level);
1927 flush_write_ptr = gnu_flush_write;
1928 }
1929
1930 void
1931 flush_read ()
1932 {
1933 flush_read_ptr ();
1934 }
1935
1936 void
1937 flush_write ()
1938 {
1939 flush_write_ptr (record_size);
1940 }
1941
1942 void
1943 open_archive (enum access_mode wanted_access)
1944 {
1945 flush_read_ptr = gnu_flush_read;
1946 flush_write_ptr = gnu_flush_write;
1947
1948 _open_archive (wanted_access);
1949 switch (wanted_access)
1950 {
1951 case ACCESS_READ:
1952 case ACCESS_UPDATE:
1953 if (volume_label_option)
1954 match_volume_label ();
1955 break;
1956
1957 case ACCESS_WRITE:
1958 records_written = 0;
1959 if (volume_label_option)
1960 write_volume_label ();
1961 break;
1962 }
1963 set_volume_start_time ();
1964 }
This page took 0.12988 seconds and 5 git commands to generate.