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