]> Dogcows Code - chaz/tar/blob - src/buffer.c
(_open_archive): Remove stdlis initialization
[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 Free Software Foundation, Inc.
5
6 Written by John Gilmore, on 1985-08-25.
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
21
22 #include <system.h>
23 #include <system-ioctl.h>
24
25 #include <signal.h>
26
27 #include <closeout.h>
28 #include <fnmatch.h>
29 #include <getline.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 /* Globbing pattern to append to volume label if initial match failed. */
40 #define VOLUME_LABEL_APPEND " Volume [1-9]*"
41
42 /* Variables. */
43
44 static tarlong prev_written; /* bytes written on previous volumes */
45 static tarlong bytes_written; /* bytes written on this volume */
46 static void *record_buffer[2]; /* allocated memory */
47 union block *record_buffer_aligned[2];
48 static int record_index;
49
50 /* FIXME: The following variables should ideally be static to this
51 module. However, this cannot be done yet. The cleanup continues! */
52
53 union block *record_start; /* start of record of archive */
54 union block *record_end; /* last+1 block of archive record */
55 union block *current_block; /* current block of archive */
56 enum access_mode access_mode; /* how do we handle the archive */
57 off_t records_read; /* number of records read from this archive */
58 off_t records_written; /* likewise, for records written */
59 extern off_t records_skipped; /* number of records skipped at the start
60 of the archive, defined in delete.c */
61
62 static off_t record_start_block; /* block ordinal at record_start */
63
64 /* Where we write list messages (not errors, not interactions) to. */
65 FILE *stdlis;
66
67 static void backspace_output (void);
68
69 /* PID of child program, if compress_option or remote archive access. */
70 static pid_t child_pid;
71
72 /* Error recovery stuff */
73 static int read_error_count;
74
75 /* Have we hit EOF yet? */
76 static bool hit_eof;
77
78 /* Checkpointing counter */
79 static unsigned checkpoint;
80
81 static bool read_full_records = false;
82
83 /* We're reading, but we just read the last block and it's time to update.
84 Declared in update.c
85
86 As least EXTERN like this one as possible. (?? --gray)
87 FIXME: Either eliminate it or move it to common.h.
88 */
89 extern bool time_to_start_writing;
90
91 bool write_archive_to_stdout;
92
93 void (*flush_write_ptr) (size_t);
94 void (*flush_read_ptr) (void);
95
96 \f
97 char *volume_label;
98 char *continued_file_name;
99 uintmax_t continued_file_size;
100 uintmax_t continued_file_offset;
101
102 \f
103 static int volno = 1; /* which volume of a multi-volume tape we're
104 on */
105 static int global_volno = 1; /* volume number to print in external
106 messages */
107
108 bool write_archive_to_stdout;
109
110 /* Used by flush_read and flush_write to store the real info about saved
111 names. */
112 static char *real_s_name;
113 static off_t real_s_totsize;
114 static off_t real_s_sizeleft;
115
116 \f
117 /* Multi-volume tracking support */
118 static char *save_name; /* name of the file we are currently writing */
119 static off_t save_totsize; /* total size of file we are writing, only
120 valid if save_name is nonzero */
121 static off_t save_sizeleft; /* where we are in the file we are writing,
122 only valid if save_name is nonzero */
123
124 void
125 mv_begin (struct tar_stat_info *st)
126 {
127 if (multi_volume_option)
128 {
129 assign_string (&save_name, st->orig_file_name);
130 save_totsize = save_sizeleft = st->stat.st_size;
131 }
132 }
133
134 void
135 mv_end ()
136 {
137 if (multi_volume_option)
138 assign_string (&save_name, 0);
139 }
140
141 void
142 mv_total_size (off_t size)
143 {
144 save_totsize = size;
145 }
146
147 void
148 mv_size_left (off_t size)
149 {
150 save_sizeleft = size;
151 }
152
153 \f
154 /* Functions. */
155
156 void
157 clear_read_error_count (void)
158 {
159 read_error_count = 0;
160 }
161
162 \f
163 /* Time-related functions */
164
165 double duration;
166
167 void
168 set_start_time ()
169 {
170 gettime (&start_time);
171 volume_start_time = start_time;
172 last_stat_time = start_time;
173 }
174
175 void
176 set_volume_start_time ()
177 {
178 gettime (&volume_start_time);
179 last_stat_time = volume_start_time;
180 }
181
182 void
183 compute_duration ()
184 {
185 struct timespec now;
186 gettime (&now);
187 duration += ((now.tv_sec - last_stat_time.tv_sec)
188 + (now.tv_nsec - last_stat_time.tv_nsec) / 1e9);
189 gettime (&last_stat_time);
190 }
191
192 \f
193 /* Compression detection */
194
195 enum compress_type {
196 ct_none,
197 ct_compress,
198 ct_gzip,
199 ct_bzip2
200 };
201
202 struct zip_magic
203 {
204 enum compress_type type;
205 size_t length;
206 char *magic;
207 char *program;
208 char *option;
209 };
210
211 static struct zip_magic const magic[] = {
212 { ct_none, },
213 { ct_compress, 2, "\037\235", "compress", "-Z" },
214 { ct_gzip, 2, "\037\213", "gzip", "-z" },
215 { ct_bzip2, 3, "BZh", "bzip2", "-j" },
216 };
217
218 #define NMAGIC (sizeof(magic)/sizeof(magic[0]))
219
220 #define compress_option(t) magic[t].option
221 #define compress_program(t) magic[t].program
222
223 /* Check if the file ARCHIVE is a compressed archive. */
224 enum compress_type
225 check_compressed_archive ()
226 {
227 struct zip_magic const *p;
228 bool sfr;
229
230 /* Prepare global data needed for find_next_block: */
231 record_end = record_start; /* set up for 1st record = # 0 */
232 sfr = read_full_records;
233 read_full_records = true; /* Suppress fatal error on reading a partial
234 record */
235 find_next_block ();
236
237 /* Restore global values */
238 read_full_records = sfr;
239
240 if (tar_checksum (record_start, true) == HEADER_SUCCESS)
241 /* Probably a valid header */
242 return ct_none;
243
244 for (p = magic + 1; p < magic + NMAGIC; p++)
245 if (memcmp (record_start->buffer, p->magic, p->length) == 0)
246 return p->type;
247
248 return ct_none;
249 }
250
251 /* Open an archive named archive_name_array[0]. Detect if it is
252 a compressed archive of known type and use corresponding decompression
253 program if so */
254 int
255 open_compressed_archive ()
256 {
257 archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
258 MODE_RW, rsh_command_option);
259 if (archive == -1)
260 return archive;
261
262 if (!multi_volume_option)
263 {
264 enum compress_type type = check_compressed_archive ();
265
266 if (type == ct_none)
267 return archive;
268
269 /* FD is not needed any more */
270 rmtclose (archive);
271
272 hit_eof = false; /* It might have been set by find_next_block in
273 check_compressed_archive */
274
275 /* Open compressed archive */
276 use_compress_program_option = compress_program (type);
277 child_pid = sys_child_open_for_uncompress ();
278 read_full_records = true;
279 }
280
281 records_read = 0;
282 record_end = record_start; /* set up for 1st record = # 0 */
283
284 return archive;
285 }
286 \f
287
288 static void
289 print_stats (FILE *fp, const char *text, tarlong numbytes)
290 {
291 char bytes[sizeof (tarlong) * CHAR_BIT];
292 char abbr[LONGEST_HUMAN_READABLE + 1];
293 char rate[LONGEST_HUMAN_READABLE + 1];
294
295 int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
296
297 sprintf (bytes, TARLONG_FORMAT, numbytes);
298
299 fprintf (fp, "%s: %s (%s, %s/s)\n",
300 text, bytes,
301 human_readable (numbytes, abbr, human_opts, 1, 1),
302 (0 < duration && numbytes / duration < (uintmax_t) -1
303 ? human_readable (numbytes / duration, rate, human_opts, 1, 1)
304 : "?"));
305 }
306
307 void
308 print_total_stats ()
309 {
310 switch (subcommand_option)
311 {
312 case CREATE_SUBCOMMAND:
313 case CAT_SUBCOMMAND:
314 case UPDATE_SUBCOMMAND:
315 case APPEND_SUBCOMMAND:
316 /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */
317 print_stats (stderr, _("Total bytes written"),
318 prev_written + bytes_written);
319 break;
320
321 case DELETE_SUBCOMMAND:
322 {
323 char buf[UINTMAX_STRSIZE_BOUND];
324 print_stats (stderr, _("Total bytes read"),
325 records_read * record_size);
326 print_stats (stderr, _("Total bytes written"),
327 prev_written + bytes_written);
328 fprintf (stderr, _("Total bytes deleted: %s\n"),
329 STRINGIFY_BIGINT ((records_read - records_skipped)
330 * record_size
331 - (prev_written + bytes_written), buf));
332 }
333 break;
334
335 case EXTRACT_SUBCOMMAND:
336 case LIST_SUBCOMMAND:
337 case DIFF_SUBCOMMAND:
338 print_stats (stderr, _("Total bytes read"),
339 records_read * record_size);
340 break;
341
342 default:
343 abort ();
344 }
345 }
346
347 /* Compute and return the block ordinal at current_block. */
348 off_t
349 current_block_ordinal (void)
350 {
351 return record_start_block + (current_block - record_start);
352 }
353
354 /* If the EOF flag is set, reset it, as well as current_block, etc. */
355 void
356 reset_eof (void)
357 {
358 if (hit_eof)
359 {
360 hit_eof = false;
361 current_block = record_start;
362 record_end = record_start + blocking_factor;
363 access_mode = ACCESS_WRITE;
364 }
365 }
366
367 /* Return the location of the next available input or output block.
368 Return zero for EOF. Once we have returned zero, we just keep returning
369 it, to avoid accidentally going on to the next file on the tape. */
370 union block *
371 find_next_block (void)
372 {
373 if (current_block == record_end)
374 {
375 if (hit_eof)
376 return 0;
377 flush_archive ();
378 if (current_block == record_end)
379 {
380 hit_eof = true;
381 return 0;
382 }
383 }
384 return current_block;
385 }
386
387 /* Indicate that we have used all blocks up thru BLOCK. */
388 void
389 set_next_block_after (union block *block)
390 {
391 while (block >= current_block)
392 current_block++;
393
394 /* Do *not* flush the archive here. If we do, the same argument to
395 set_next_block_after could mean the next block (if the input record
396 is exactly one block long), which is not what is intended. */
397
398 if (current_block > record_end)
399 abort ();
400 }
401
402 /* Return the number of bytes comprising the space between POINTER
403 through the end of the current buffer of blocks. This space is
404 available for filling with data, or taking data from. POINTER is
405 usually (but not always) the result of previous find_next_block call. */
406 size_t
407 available_space_after (union block *pointer)
408 {
409 return record_end->buffer - pointer->buffer;
410 }
411
412 /* Close file having descriptor FD, and abort if close unsuccessful. */
413 void
414 xclose (int fd)
415 {
416 if (close (fd) != 0)
417 close_error (_("(pipe)"));
418 }
419
420 static void
421 init_buffer ()
422 {
423 if (! record_buffer_aligned[record_index])
424 record_buffer_aligned[record_index] =
425 page_aligned_alloc (&record_buffer[record_index], record_size);
426
427 record_start = record_buffer_aligned[record_index];
428 current_block = record_start;
429 record_end = record_start + blocking_factor;
430 }
431
432 /* Open an archive file. The argument specifies whether we are
433 reading or writing, or both. */
434 static void
435 _open_archive (enum access_mode wanted_access)
436 {
437 int backed_up_flag = 0;
438
439 if (record_size == 0)
440 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
441
442 if (archive_names == 0)
443 FATAL_ERROR ((0, 0, _("No archive name given")));
444
445 tar_stat_destroy (&current_stat_info);
446 save_name = 0;
447 real_s_name = 0;
448
449 record_index = 0;
450 init_buffer ();
451
452 /* When updating the archive, we start with reading. */
453 access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
454
455 read_full_records = read_full_records_option;
456
457 records_read = 0;
458
459 if (use_compress_program_option)
460 {
461 switch (wanted_access)
462 {
463 case ACCESS_READ:
464 child_pid = sys_child_open_for_uncompress ();
465 read_full_records = true;
466 record_end = record_start; /* set up for 1st record = # 0 */
467 break;
468
469 case ACCESS_WRITE:
470 child_pid = sys_child_open_for_compress ();
471 break;
472
473 case ACCESS_UPDATE:
474 abort (); /* Should not happen */
475 break;
476 }
477 }
478 else if (strcmp (archive_name_array[0], "-") == 0)
479 {
480 read_full_records = true; /* could be a pipe, be safe */
481 if (verify_option)
482 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
483
484 switch (wanted_access)
485 {
486 case ACCESS_READ:
487 {
488 enum compress_type type;
489
490 archive = STDIN_FILENO;
491
492 type = check_compressed_archive ();
493 if (type != ct_none)
494 FATAL_ERROR ((0, 0,
495 _("Archive is compressed. Use %s option"),
496 compress_option (type)));
497 }
498 break;
499
500 case ACCESS_WRITE:
501 archive = STDOUT_FILENO;
502 break;
503
504 case ACCESS_UPDATE:
505 archive = STDIN_FILENO;
506 write_archive_to_stdout = true;
507 record_end = record_start; /* set up for 1st record = # 0 */
508 break;
509 }
510 }
511 else if (verify_option)
512 archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
513 MODE_RW, rsh_command_option);
514 else
515 switch (wanted_access)
516 {
517 case ACCESS_READ:
518 archive = open_compressed_archive ();
519 break;
520
521 case ACCESS_WRITE:
522 if (backup_option)
523 {
524 maybe_backup_file (archive_name_array[0], 1);
525 backed_up_flag = 1;
526 }
527 archive = rmtcreat (archive_name_array[0], MODE_RW,
528 rsh_command_option);
529 break;
530
531 case ACCESS_UPDATE:
532 archive = rmtopen (archive_name_array[0],
533 O_RDWR | O_CREAT | O_BINARY,
534 MODE_RW, rsh_command_option);
535
536 if (check_compressed_archive () != ct_none)
537 FATAL_ERROR ((0, 0,
538 _("Cannot update compressed archives")));
539 break;
540 }
541
542 if (archive < 0
543 || (! _isrmt (archive) && !sys_get_archive_stat ()))
544 {
545 int saved_errno = errno;
546
547 if (backed_up_flag)
548 undo_last_backup ();
549 errno = saved_errno;
550 open_fatal (archive_name_array[0]);
551 }
552
553 sys_detect_dev_null_output ();
554 sys_save_archive_dev_ino ();
555 SET_BINARY_MODE (archive);
556
557 switch (wanted_access)
558 {
559 case ACCESS_READ:
560 find_next_block (); /* read it in, check for EOF */
561 break;
562
563 case ACCESS_UPDATE:
564 case ACCESS_WRITE:
565 records_written = 0;
566 break;
567 }
568 }
569
570 static void
571 do_checkpoint (bool write)
572 {
573 if (checkpoint_option && !(++checkpoint % checkpoint_option))
574 {
575 switch (checkpoint_style)
576 {
577 case checkpoint_dot:
578 fputc ('.', stdlis);
579 fflush (stdlis);
580 break;
581
582 case checkpoint_text:
583 if (write)
584 /* TRANSLATORS: This is a ``checkpoint of write operation'',
585 *not* ``Writing a checkpoint''.
586 E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
587 *not* ``Escribiendo un punto de comprobaci@'on'' */
588 WARN ((0, 0, _("Write checkpoint %u"), checkpoint));
589 else
590 /* TRANSLATORS: This is a ``checkpoint of read operation'',
591 *not* ``Reading a checkpoint''.
592 E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
593 *not* ``Leyendo un punto de comprobaci@'on'' */
594 WARN ((0, 0, _("Read checkpoint %u"), checkpoint));
595 break;
596 }
597 }
598 }
599
600 /* Perform a write to flush the buffer. */
601 ssize_t
602 _flush_write (void)
603 {
604 ssize_t status;
605
606 do_checkpoint (true);
607 if (tape_length_option && tape_length_option <= bytes_written)
608 {
609 errno = ENOSPC;
610 status = 0;
611 }
612 else if (dev_null_output)
613 status = record_size;
614 else
615 status = sys_write_archive_buffer ();
616
617 return status;
618 }
619
620 /* Handle write errors on the archive. Write errors are always fatal.
621 Hitting the end of a volume does not cause a write error unless the
622 write was the first record of the volume. */
623 void
624 archive_write_error (ssize_t status)
625 {
626 /* It might be useful to know how much was written before the error
627 occurred. */
628 if (totals_option)
629 {
630 int e = errno;
631 print_total_stats ();
632 errno = e;
633 }
634
635 write_fatal_details (*archive_name_cursor, status, record_size);
636 }
637
638 /* Handle read errors on the archive. If the read should be retried,
639 return to the caller. */
640 void
641 archive_read_error (void)
642 {
643 read_error (*archive_name_cursor);
644
645 if (record_start_block == 0)
646 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
647
648 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
649 then give up on reading the archive. */
650
651 if (read_error_count++ > READ_ERROR_MAX)
652 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
653 return;
654 }
655
656 static void
657 short_read (size_t status)
658 {
659 size_t left; /* bytes left */
660 char *more; /* pointer to next byte to read */
661
662 more = record_start->buffer + status;
663 left = record_size - status;
664
665 while (left % BLOCKSIZE != 0
666 || (left && status && read_full_records))
667 {
668 if (status)
669 while ((status = rmtread (archive, more, left)) == SAFE_READ_ERROR)
670 archive_read_error ();
671
672 if (status == 0)
673 break;
674
675 if (! read_full_records)
676 {
677 unsigned long rest = record_size - left;
678
679 FATAL_ERROR ((0, 0,
680 ngettext ("Unaligned block (%lu byte) in archive",
681 "Unaligned block (%lu bytes) in archive",
682 rest),
683 rest));
684 }
685
686 /* User warned us about this. Fix up. */
687
688 left -= status;
689 more += status;
690 }
691
692 /* FIXME: for size=0, multi-volume support. On the first record, warn
693 about the problem. */
694
695 if (!read_full_records && verbose_option > 1
696 && record_start_block == 0 && status != 0)
697 {
698 unsigned long rsize = (record_size - left) / BLOCKSIZE;
699 WARN ((0, 0,
700 ngettext ("Record size = %lu block",
701 "Record size = %lu blocks",
702 rsize),
703 rsize));
704 }
705
706 record_end = record_start + (record_size - left) / BLOCKSIZE;
707 records_read++;
708 }
709
710 /* Flush the current buffer to/from the archive. */
711 void
712 flush_archive (void)
713 {
714 size_t buffer_level = current_block->buffer - record_start->buffer;
715 record_start_block += record_end - record_start;
716 current_block = record_start;
717 record_end = record_start + blocking_factor;
718
719 if (access_mode == ACCESS_READ && time_to_start_writing)
720 {
721 access_mode = ACCESS_WRITE;
722 time_to_start_writing = false;
723 backspace_output ();
724 }
725
726 switch (access_mode)
727 {
728 case ACCESS_READ:
729 flush_read ();
730 break;
731
732 case ACCESS_WRITE:
733 flush_write_ptr (buffer_level);
734 break;
735
736 case ACCESS_UPDATE:
737 abort ();
738 }
739 }
740
741 /* Backspace the archive descriptor by one record worth. If it's a
742 tape, MTIOCTOP will work. If it's something else, try to seek on
743 it. If we can't seek, we lose! */
744 static void
745 backspace_output (void)
746 {
747 #ifdef MTIOCTOP
748 {
749 struct mtop operation;
750
751 operation.mt_op = MTBSR;
752 operation.mt_count = 1;
753 if (rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
754 return;
755 if (errno == EIO && rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
756 return;
757 }
758 #endif
759
760 {
761 off_t position = rmtlseek (archive, (off_t) 0, SEEK_CUR);
762
763 /* Seek back to the beginning of this record and start writing there. */
764
765 position -= record_size;
766 if (position < 0)
767 position = 0;
768 if (rmtlseek (archive, position, SEEK_SET) != position)
769 {
770 /* Lseek failed. Try a different method. */
771
772 WARN ((0, 0,
773 _("Cannot backspace archive file; it may be unreadable without -i")));
774
775 /* Replace the first part of the record with NULs. */
776
777 if (record_start->buffer != output_start)
778 memset (record_start->buffer, 0,
779 output_start - record_start->buffer);
780 }
781 }
782 }
783
784 off_t
785 seek_archive (off_t size)
786 {
787 off_t start = current_block_ordinal ();
788 off_t offset;
789 off_t nrec, nblk;
790 off_t skipped = (blocking_factor - (current_block - record_start));
791
792 size -= skipped * BLOCKSIZE;
793
794 if (size < record_size)
795 return 0;
796 /* FIXME: flush? */
797
798 /* Compute number of records to skip */
799 nrec = size / record_size;
800 offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
801 if (offset < 0)
802 return offset;
803
804 if (offset % record_size)
805 FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
806
807 /* Convert to number of records */
808 offset /= BLOCKSIZE;
809 /* Compute number of skipped blocks */
810 nblk = offset - start;
811
812 /* Update buffering info */
813 records_read += nblk / blocking_factor;
814 record_start_block = offset - blocking_factor;
815 current_block = record_end;
816
817 return nblk;
818 }
819
820 /* Close the archive file. */
821 void
822 close_archive (void)
823 {
824 if (time_to_start_writing || access_mode == ACCESS_WRITE)
825 {
826 flush_archive ();
827 if (current_block > record_start)
828 flush_archive ();
829 }
830
831 sys_drain_input_pipe ();
832
833 compute_duration ();
834 if (verify_option)
835 verify_volume ();
836
837 if (rmtclose (archive) != 0)
838 close_warn (*archive_name_cursor);
839
840 sys_wait_for_child (child_pid);
841
842 tar_stat_destroy (&current_stat_info);
843 if (save_name)
844 free (save_name);
845 if (real_s_name)
846 free (real_s_name);
847 free (record_buffer[0]);
848 free (record_buffer[1]);
849 }
850
851 /* Called to initialize the global volume number. */
852 void
853 init_volume_number (void)
854 {
855 FILE *file = fopen (volno_file_option, "r");
856
857 if (file)
858 {
859 if (fscanf (file, "%d", &global_volno) != 1
860 || global_volno < 0)
861 FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
862 quotearg_colon (volno_file_option)));
863 if (ferror (file))
864 read_error (volno_file_option);
865 if (fclose (file) != 0)
866 close_error (volno_file_option);
867 }
868 else if (errno != ENOENT)
869 open_error (volno_file_option);
870 }
871
872 /* Called to write out the closing global volume number. */
873 void
874 closeout_volume_number (void)
875 {
876 FILE *file = fopen (volno_file_option, "w");
877
878 if (file)
879 {
880 fprintf (file, "%d\n", global_volno);
881 if (ferror (file))
882 write_error (volno_file_option);
883 if (fclose (file) != 0)
884 close_error (volno_file_option);
885 }
886 else
887 open_error (volno_file_option);
888 }
889
890 \f
891 static void
892 increase_volume_number ()
893 {
894 global_volno++;
895 if (global_volno < 0)
896 FATAL_ERROR ((0, 0, _("Volume number overflow")));
897 volno++;
898 }
899
900 void
901 change_tape_menu (FILE *read_file)
902 {
903 char *input_buffer = NULL;
904 size_t size = 0;
905 bool stop = false;
906
907 while (!stop)
908 {
909 fputc ('\007', stderr);
910 fprintf (stderr,
911 _("Prepare volume #%d for %s and hit return: "),
912 global_volno + 1, quote (*archive_name_cursor));
913 fflush (stderr);
914
915 if (getline (&input_buffer, &size, read_file) <= 0)
916 {
917 WARN ((0, 0, _("EOF where user reply was expected")));
918
919 if (subcommand_option != EXTRACT_SUBCOMMAND
920 && subcommand_option != LIST_SUBCOMMAND
921 && subcommand_option != DIFF_SUBCOMMAND)
922 WARN ((0, 0, _("WARNING: Archive is incomplete")));
923
924 fatal_exit ();
925 }
926
927 if (input_buffer[0] == '\n'
928 || input_buffer[0] == 'y'
929 || input_buffer[0] == 'Y')
930 break;
931
932 switch (input_buffer[0])
933 {
934 case '?':
935 {
936 fprintf (stderr, _("\
937 n name Give a new file name for the next (and subsequent) volume(s)\n\
938 q Abort tar\n\
939 y or newline Continue operation\n"));
940 if (!restrict_option)
941 fprintf (stderr, _(" ! Spawn a subshell\n"));
942 fprintf (stderr, _(" ? Print this list\n"));
943 }
944 break;
945
946 case 'q':
947 /* Quit. */
948
949 WARN ((0, 0, _("No new volume; exiting.\n")));
950
951 if (subcommand_option != EXTRACT_SUBCOMMAND
952 && subcommand_option != LIST_SUBCOMMAND
953 && subcommand_option != DIFF_SUBCOMMAND)
954 WARN ((0, 0, _("WARNING: Archive is incomplete")));
955
956 fatal_exit ();
957
958 case 'n':
959 /* Get new file name. */
960
961 {
962 char *name;
963 char *cursor;
964
965 for (name = input_buffer + 1;
966 *name == ' ' || *name == '\t';
967 name++)
968 ;
969
970 for (cursor = name; *cursor && *cursor != '\n'; cursor++)
971 ;
972 *cursor = '\0';
973
974 if (name[0])
975 {
976 /* FIXME: the following allocation is never reclaimed. */
977 *archive_name_cursor = xstrdup (name);
978 stop = true;
979 }
980 else
981 fprintf (stderr, "%s",
982 _("File name not specified. Try again.\n"));
983 }
984 break;
985
986 case '!':
987 if (!restrict_option)
988 {
989 sys_spawn_shell ();
990 break;
991 }
992 /* FALL THROUGH */
993
994 default:
995 fprintf (stderr, _("Invalid input. Type ? for help.\n"));
996 }
997 }
998 free (input_buffer);
999 }
1000
1001 /* We've hit the end of the old volume. Close it and open the next one.
1002 Return nonzero on success.
1003 */
1004 static bool
1005 new_volume (enum access_mode mode)
1006 {
1007 static FILE *read_file;
1008 static int looped;
1009 int prompt;
1010
1011 if (!read_file && !info_script_option)
1012 /* FIXME: if fopen is used, it will never be closed. */
1013 read_file = archive == STDIN_FILENO ? fopen (TTY_NAME, "r") : stdin;
1014
1015 if (now_verifying)
1016 return false;
1017 if (verify_option)
1018 verify_volume ();
1019
1020 assign_string (&volume_label, NULL);
1021 assign_string (&continued_file_name, NULL);
1022 continued_file_size = continued_file_offset = 0;
1023
1024 if (rmtclose (archive) != 0)
1025 close_warn (*archive_name_cursor);
1026
1027 archive_name_cursor++;
1028 if (archive_name_cursor == archive_name_array + archive_names)
1029 {
1030 archive_name_cursor = archive_name_array;
1031 looped = 1;
1032 }
1033 prompt = looped;
1034
1035 tryagain:
1036 if (prompt)
1037 {
1038 /* We have to prompt from now on. */
1039
1040 if (info_script_option)
1041 {
1042 if (volno_file_option)
1043 closeout_volume_number ();
1044 if (sys_exec_info_script (archive_name_cursor, global_volno+1))
1045 FATAL_ERROR ((0, 0, _("%s command failed"),
1046 quote (info_script_option)));
1047 }
1048 else
1049 change_tape_menu (read_file);
1050 }
1051
1052 if (strcmp (archive_name_cursor[0], "-") == 0)
1053 {
1054 read_full_records = true;
1055 archive = STDIN_FILENO;
1056 }
1057 else if (verify_option)
1058 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1059 rsh_command_option);
1060 else
1061 switch (mode)
1062 {
1063 case ACCESS_READ:
1064 archive = rmtopen (*archive_name_cursor, O_RDONLY, MODE_RW,
1065 rsh_command_option);
1066 break;
1067
1068 case ACCESS_WRITE:
1069 if (backup_option)
1070 maybe_backup_file (*archive_name_cursor, 1);
1071 archive = rmtcreat (*archive_name_cursor, MODE_RW,
1072 rsh_command_option);
1073 break;
1074
1075 case ACCESS_UPDATE:
1076 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1077 rsh_command_option);
1078 break;
1079 }
1080
1081 if (archive < 0)
1082 {
1083 open_warn (*archive_name_cursor);
1084 if (!verify_option && mode == ACCESS_WRITE && backup_option)
1085 undo_last_backup ();
1086 prompt = 1;
1087 goto tryagain;
1088 }
1089
1090 SET_BINARY_MODE (archive);
1091
1092 return true;
1093 }
1094
1095 static bool
1096 read_header0 (struct tar_stat_info *info)
1097 {
1098 enum read_header rc;
1099
1100 tar_stat_init (info);
1101 rc = read_header_primitive (false, info);
1102 if (rc == HEADER_SUCCESS)
1103 {
1104 set_next_block_after (current_header);
1105 return true;
1106 }
1107 ERROR ((0, 0, _("This does not look like a tar archive")));
1108 return false;
1109 }
1110
1111 bool
1112 try_new_volume ()
1113 {
1114 size_t status;
1115 union block *header;
1116 struct tar_stat_info dummy;
1117
1118 switch (subcommand_option)
1119 {
1120 case APPEND_SUBCOMMAND:
1121 case CAT_SUBCOMMAND:
1122 case UPDATE_SUBCOMMAND:
1123 if (!new_volume (ACCESS_UPDATE))
1124 return true;
1125 break;
1126
1127 default:
1128 if (!new_volume (ACCESS_READ))
1129 return true;
1130 break;
1131 }
1132
1133 while ((status = rmtread (archive, record_start->buffer, record_size))
1134 == SAFE_READ_ERROR)
1135 archive_read_error ();
1136
1137 if (status != record_size)
1138 short_read (status);
1139
1140 header = find_next_block ();
1141 if (!header)
1142 return false;
1143
1144 switch (header->header.typeflag)
1145 {
1146 case XGLTYPE:
1147 {
1148 if (!read_header0 (&dummy))
1149 return false;
1150 xheader_decode (&dummy); /* decodes values from the global header */
1151 tar_stat_destroy (&dummy);
1152 if (!real_s_name)
1153 {
1154 /* We have read the extended header of the first member in
1155 this volume. Put it back, so next read_header works as
1156 expected. */
1157 current_block = record_start;
1158 }
1159 break;
1160 }
1161
1162 case GNUTYPE_VOLHDR:
1163 if (!read_header0 (&dummy))
1164 return false;
1165 tar_stat_destroy (&dummy);
1166 assign_string (&volume_label, current_header->header.name);
1167 set_next_block_after (header);
1168 header = find_next_block ();
1169 if (header->header.typeflag != GNUTYPE_MULTIVOL)
1170 break;
1171 /* FALL THROUGH */
1172
1173 case GNUTYPE_MULTIVOL:
1174 if (!read_header0 (&dummy))
1175 return false;
1176 tar_stat_destroy (&dummy);
1177 assign_string (&continued_file_name, current_header->header.name);
1178 continued_file_size =
1179 UINTMAX_FROM_HEADER (current_header->header.size);
1180 continued_file_offset =
1181 UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset);
1182 break;
1183
1184 default:
1185 break;
1186 }
1187
1188 if (real_s_name)
1189 {
1190 uintmax_t s;
1191 if (!continued_file_name
1192 || strcmp (continued_file_name, real_s_name))
1193 {
1194 if ((archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
1195 && strlen (real_s_name) >= NAME_FIELD_SIZE
1196 && strncmp (continued_file_name, real_s_name,
1197 NAME_FIELD_SIZE) == 0)
1198 WARN ((0, 0,
1199 _("%s is possibly continued on this volume: header contains truncated name"),
1200 quote (real_s_name)));
1201 else
1202 {
1203 WARN ((0, 0, _("%s is not continued on this volume"),
1204 quote (real_s_name)));
1205 return false;
1206 }
1207 }
1208
1209 s = continued_file_size + continued_file_offset;
1210
1211 if (real_s_totsize != s || s < continued_file_offset)
1212 {
1213 char totsizebuf[UINTMAX_STRSIZE_BOUND];
1214 char s1buf[UINTMAX_STRSIZE_BOUND];
1215 char s2buf[UINTMAX_STRSIZE_BOUND];
1216
1217 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
1218 quote (continued_file_name),
1219 STRINGIFY_BIGINT (save_totsize, totsizebuf),
1220 STRINGIFY_BIGINT (continued_file_size, s1buf),
1221 STRINGIFY_BIGINT (continued_file_offset, s2buf)));
1222 return false;
1223 }
1224
1225 if (real_s_totsize - real_s_sizeleft != continued_file_offset)
1226 {
1227 WARN ((0, 0, _("This volume is out of sequence")));
1228 return false;
1229 }
1230 }
1231
1232 increase_volume_number ();
1233 return true;
1234 }
1235
1236 \f
1237 /* Check the LABEL block against the volume label, seen as a globbing
1238 pattern. Return true if the pattern matches. In case of failure,
1239 retry matching a volume sequence number before giving up in
1240 multi-volume mode. */
1241 static bool
1242 check_label_pattern (union block *label)
1243 {
1244 char *string;
1245 bool result;
1246
1247 if (! memchr (label->header.name, '\0', sizeof label->header.name))
1248 return false;
1249
1250 if (fnmatch (volume_label_option, label->header.name, 0) == 0)
1251 return true;
1252
1253 if (!multi_volume_option)
1254 return false;
1255
1256 string = xmalloc (strlen (volume_label_option)
1257 + sizeof VOLUME_LABEL_APPEND + 1);
1258 strcpy (string, volume_label_option);
1259 strcat (string, VOLUME_LABEL_APPEND);
1260 result = fnmatch (string, label->header.name, 0) == 0;
1261 free (string);
1262 return result;
1263 }
1264
1265 /* Check if the next block contains a volume label and if this matches
1266 the one given in the command line */
1267 static void
1268 match_volume_label (void)
1269 {
1270 union block *label = find_next_block ();
1271
1272 if (!label)
1273 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
1274 quote (volume_label_option)));
1275 if (!check_label_pattern (label))
1276 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
1277 quote_n (0, label->header.name),
1278 quote_n (1, volume_label_option)));
1279 }
1280
1281 /* Mark the archive with volume label STR. */
1282 static void
1283 _write_volume_label (const char *str)
1284 {
1285 if (archive_format == POSIX_FORMAT)
1286 xheader_store ("GNU.volume.label", NULL, str);
1287 else
1288 {
1289 union block *label = find_next_block ();
1290
1291 memset (label, 0, BLOCKSIZE);
1292
1293 strcpy (label->header.name, volume_label_option);
1294 assign_string (&current_stat_info.file_name,
1295 label->header.name);
1296 current_stat_info.had_trailing_slash =
1297 strip_trailing_slashes (current_stat_info.file_name);
1298
1299 label->header.typeflag = GNUTYPE_VOLHDR;
1300 TIME_TO_CHARS (start_time.tv_sec, label->header.mtime);
1301 finish_header (&current_stat_info, label, -1);
1302 set_next_block_after (label);
1303 }
1304 }
1305
1306 #define VOL_SUFFIX "Volume"
1307
1308 /* Add a volume label to a part of multi-volume archive */
1309 static void
1310 add_volume_label (void)
1311 {
1312 char buf[UINTMAX_STRSIZE_BOUND];
1313 char *p = STRINGIFY_BIGINT (volno, buf);
1314 char *s = xmalloc (strlen (volume_label_option) + sizeof VOL_SUFFIX
1315 + strlen (p) + 2);
1316 sprintf (s, "%s %s %s", volume_label_option, VOL_SUFFIX, p);
1317 _write_volume_label (s);
1318 free (s);
1319 }
1320
1321 static void
1322 add_chunk_header ()
1323 {
1324 if (archive_format == POSIX_FORMAT)
1325 {
1326 off_t block_ordinal;
1327 union block *blk;
1328 struct tar_stat_info st;
1329 static size_t real_s_part_no; /* FIXME */
1330
1331 real_s_part_no++;
1332 memset (&st, 0, sizeof st);
1333 st.orig_file_name = st.file_name = real_s_name;
1334 st.stat.st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
1335 st.stat.st_uid = getuid ();
1336 st.stat.st_gid = getgid ();
1337 st.orig_file_name = xheader_format_name (&st,
1338 "%d/GNUFileParts.%p/%f.%n",
1339 real_s_part_no);
1340 st.file_name = st.orig_file_name;
1341 st.archive_file_size = st.stat.st_size = real_s_sizeleft;
1342
1343 block_ordinal = current_block_ordinal ();
1344 blk = start_header (&st);
1345 if (!blk)
1346 abort (); /* FIXME */
1347 finish_header (&st, blk, block_ordinal);
1348 free (st.orig_file_name);
1349 }
1350 }
1351
1352
1353 /* Add a volume label to the current archive */
1354 static void
1355 write_volume_label (void)
1356 {
1357 if (multi_volume_option)
1358 add_volume_label ();
1359 else
1360 _write_volume_label (volume_label_option);
1361 }
1362
1363 /* Write GNU multi-volume header */
1364 static void
1365 gnu_add_multi_volume_header (void)
1366 {
1367 int tmp;
1368 union block *block = find_next_block ();
1369
1370 if (strlen (real_s_name) > NAME_FIELD_SIZE)
1371 WARN ((0, 0,
1372 _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
1373 quotearg_colon (real_s_name)));
1374
1375 memset (block, 0, BLOCKSIZE);
1376
1377 /* FIXME: Michael P Urban writes: [a long name file] is being written
1378 when a new volume rolls around [...] Looks like the wrong value is
1379 being preserved in real_s_name, though. */
1380
1381 strncpy (block->header.name, real_s_name, NAME_FIELD_SIZE);
1382 block->header.typeflag = GNUTYPE_MULTIVOL;
1383
1384 OFF_TO_CHARS (real_s_sizeleft, block->header.size);
1385 OFF_TO_CHARS (real_s_totsize - real_s_sizeleft,
1386 block->oldgnu_header.offset);
1387
1388 tmp = verbose_option;
1389 verbose_option = 0;
1390 finish_header (&current_stat_info, block, -1);
1391 verbose_option = tmp;
1392 set_next_block_after (block);
1393 }
1394
1395 /* Add a multi volume header to the current archive. The exact header format
1396 depends on the archive format. */
1397 static void
1398 add_multi_volume_header (void)
1399 {
1400 if (archive_format == POSIX_FORMAT)
1401 {
1402 off_t d = real_s_totsize - real_s_sizeleft;
1403 xheader_store ("GNU.volume.filename", NULL, real_s_name);
1404 xheader_store ("GNU.volume.size", NULL, &real_s_sizeleft);
1405 xheader_store ("GNU.volume.offset", NULL, &d);
1406 }
1407 else
1408 gnu_add_multi_volume_header ();
1409 }
1410
1411 /* Synchronize multi-volume globals */
1412 static void
1413 multi_volume_sync ()
1414 {
1415 if (multi_volume_option)
1416 {
1417 if (save_name)
1418 {
1419 assign_string (&real_s_name,
1420 safer_name_suffix (save_name, false,
1421 absolute_names_option));
1422 real_s_totsize = save_totsize;
1423 real_s_sizeleft = save_sizeleft;
1424 }
1425 else
1426 {
1427 assign_string (&real_s_name, 0);
1428 real_s_totsize = 0;
1429 real_s_sizeleft = 0;
1430 }
1431 }
1432 }
1433
1434 \f
1435 /* Low-level flush functions */
1436
1437 /* Simple flush read (no multi-volume or label extensions) */
1438 static void
1439 simple_flush_read (void)
1440 {
1441 size_t status; /* result from system call */
1442
1443 do_checkpoint (false);
1444
1445 /* Clear the count of errors. This only applies to a single call to
1446 flush_read. */
1447
1448 read_error_count = 0; /* clear error count */
1449
1450 if (write_archive_to_stdout && record_start_block != 0)
1451 {
1452 archive = STDOUT_FILENO;
1453 status = sys_write_archive_buffer ();
1454 archive = STDIN_FILENO;
1455 if (status != record_size)
1456 archive_write_error (status);
1457 }
1458
1459 for (;;)
1460 {
1461 status = rmtread (archive, record_start->buffer, record_size);
1462 if (status == record_size)
1463 {
1464 records_read++;
1465 return;
1466 }
1467 if (status == SAFE_READ_ERROR)
1468 {
1469 archive_read_error ();
1470 continue; /* try again */
1471 }
1472 break;
1473 }
1474 short_read (status);
1475 }
1476
1477 /* Simple flush write (no multi-volume or label extensions) */
1478 static void
1479 simple_flush_write (size_t level __attribute__((unused)))
1480 {
1481 ssize_t status;
1482
1483 status = _flush_write ();
1484 if (status != record_size)
1485 archive_write_error (status);
1486 else
1487 {
1488 records_written++;
1489 bytes_written += status;
1490 }
1491 }
1492
1493 \f
1494 /* GNU flush functions. These support multi-volume and archive labels in
1495 GNU and PAX archive formats. */
1496
1497 static void
1498 _gnu_flush_read (void)
1499 {
1500 size_t status; /* result from system call */
1501
1502 do_checkpoint (false);
1503
1504 /* Clear the count of errors. This only applies to a single call to
1505 flush_read. */
1506
1507 read_error_count = 0; /* clear error count */
1508
1509 if (write_archive_to_stdout && record_start_block != 0)
1510 {
1511 archive = STDOUT_FILENO;
1512 status = sys_write_archive_buffer ();
1513 archive = STDIN_FILENO;
1514 if (status != record_size)
1515 archive_write_error (status);
1516 }
1517
1518 multi_volume_sync ();
1519
1520 for (;;)
1521 {
1522 status = rmtread (archive, record_start->buffer, record_size);
1523 if (status == record_size)
1524 {
1525 records_read++;
1526 return;
1527 }
1528
1529 /* The condition below used to include
1530 || (status > 0 && !read_full_records)
1531 This is incorrect since even if new_volume() succeeds, the
1532 subsequent call to rmtread will overwrite the chunk of data
1533 already read in the buffer, so the processing will fail */
1534 if ((status == 0
1535 || (status == SAFE_READ_ERROR && errno == ENOSPC))
1536 && multi_volume_option)
1537 {
1538 while (!try_new_volume ())
1539 ;
1540 return;
1541 }
1542 else if (status == SAFE_READ_ERROR)
1543 {
1544 archive_read_error ();
1545 continue;
1546 }
1547 break;
1548 }
1549 short_read (status);
1550 }
1551
1552 static void
1553 gnu_flush_read (void)
1554 {
1555 flush_read_ptr = simple_flush_read; /* Avoid recursion */
1556 _gnu_flush_read ();
1557 flush_read_ptr = gnu_flush_read;
1558 }
1559
1560 static void
1561 _gnu_flush_write (size_t buffer_level)
1562 {
1563 ssize_t status;
1564 union block *header;
1565 char *copy_ptr;
1566 size_t copy_size;
1567 size_t bufsize;
1568
1569 status = _flush_write ();
1570 if (status != record_size && !multi_volume_option)
1571 archive_write_error (status);
1572 else
1573 {
1574 records_written++;
1575 bytes_written += status;
1576 }
1577
1578 if (status == record_size)
1579 {
1580 multi_volume_sync ();
1581 return;
1582 }
1583
1584 /* In multi-volume mode. */
1585 /* ENXIO is for the UNIX PC. */
1586 if (status < 0 && errno != ENOSPC && errno != EIO && errno != ENXIO)
1587 archive_write_error (status);
1588
1589 if (!new_volume (ACCESS_WRITE))
1590 return;
1591
1592 xheader_destroy (&extended_header);
1593
1594 increase_volume_number ();
1595 prev_written += bytes_written;
1596 bytes_written = 0;
1597
1598 copy_ptr = record_start->buffer + status;
1599 copy_size = buffer_level - status;
1600 /* Switch to the next buffer */
1601 record_index = !record_index;
1602 init_buffer ();
1603
1604 if (volume_label_option)
1605 add_volume_label ();
1606
1607 if (real_s_name)
1608 add_multi_volume_header ();
1609
1610 write_extended (true, NULL, find_next_block ());
1611 if (real_s_name)
1612 add_chunk_header ();
1613 header = find_next_block ();
1614 bufsize = available_space_after (header);
1615 while (bufsize < copy_size)
1616 {
1617 memcpy (header->buffer, copy_ptr, bufsize);
1618 copy_ptr += bufsize;
1619 copy_size -= bufsize;
1620 set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
1621 header = find_next_block ();
1622 bufsize = available_space_after (header);
1623 }
1624 memcpy (header->buffer, copy_ptr, copy_size);
1625 memset (header->buffer + copy_size, 0, bufsize - copy_size);
1626 set_next_block_after (header + (copy_size - 1) / BLOCKSIZE);
1627 find_next_block ();
1628 }
1629
1630 static void
1631 gnu_flush_write (size_t buffer_level)
1632 {
1633 flush_write_ptr = simple_flush_write; /* Avoid recursion */
1634 _gnu_flush_write (buffer_level);
1635 flush_write_ptr = gnu_flush_write;
1636 }
1637
1638 void
1639 flush_read ()
1640 {
1641 flush_read_ptr ();
1642 }
1643
1644 void
1645 flush_write ()
1646 {
1647 flush_write_ptr (record_size);
1648 }
1649
1650 void
1651 open_archive (enum access_mode wanted_access)
1652 {
1653 flush_read_ptr = gnu_flush_read;
1654 flush_write_ptr = gnu_flush_write;
1655
1656 _open_archive (wanted_access);
1657 switch (wanted_access)
1658 {
1659 case ACCESS_READ:
1660 if (volume_label_option)
1661 match_volume_label ();
1662 break;
1663
1664 case ACCESS_WRITE:
1665 records_written = 0;
1666 if (volume_label_option)
1667 write_volume_label ();
1668 break;
1669
1670 default:
1671 break;
1672 }
1673 set_volume_start_time ();
1674 }
This page took 0.116183 seconds and 5 git commands to generate.