]> Dogcows Code - chaz/tar/blob - src/buffer.c
* src/buffer.c (reading_from_pipe): Remove. All uses removed.
[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 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 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 #include <system.h>
23
24 #include <signal.h>
25
26 #include <fnmatch.h>
27 #include <human.h>
28 #include <quotearg.h>
29
30 #include "common.h"
31 #include <rmt.h>
32
33 /* Number of retries before giving up on read. */
34 #define READ_ERROR_MAX 10
35
36 /* Globbing pattern to append to volume label if initial match failed. */
37 #define VOLUME_LABEL_APPEND " Volume [1-9]*"
38 \f
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; /* allocated memory */
44
45 /* FIXME: The following variables should ideally be static to this
46 module. However, this cannot be done yet. The cleanup continues! */
47
48 union block *record_start; /* start of record of archive */
49 union block *record_end; /* last+1 block of archive record */
50 union block *current_block; /* current block of archive */
51 enum access_mode access_mode; /* how do we handle the archive */
52 off_t records_read; /* number of records read from this archive */
53 off_t records_written; /* likewise, for records written */
54
55 static off_t record_start_block; /* block ordinal at record_start */
56
57 /* Where we write list messages (not errors, not interactions) to. */
58 FILE *stdlis;
59
60 static void backspace_output (void);
61 static bool new_volume (enum access_mode);
62
63 /* PID of child program, if compress_option or remote archive access. */
64 static pid_t child_pid;
65
66 /* Error recovery stuff */
67 static int read_error_count;
68
69 /* Have we hit EOF yet? */
70 static bool hit_eof;
71
72 /* Checkpointing counter */
73 static int checkpoint;
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 As least EXTERN like this one as possible. (?? --gray)
81 FIXME: Either eliminate it or move it to common.h.
82 */
83 extern bool time_to_start_writing;
84
85 static int volno = 1; /* which volume of a multi-volume tape we're
86 on */
87 static int global_volno = 1; /* volume number to print in external
88 messages */
89
90 /* The pointer save_name, which is set in function dump_file() of module
91 create.c, points to the original long filename instead of the new,
92 shorter mangled name that is set in start_header() of module create.c.
93 The pointer save_name is only used in multi-volume mode when the file
94 being processed is non-sparse; if a file is split between volumes, the
95 save_name is used in generating the LF_MULTIVOL record on the second
96 volume. (From Pierce Cantrell, 1991-08-13.) */
97
98 char *save_name; /* name of the file we are currently writing */
99 off_t save_totsize; /* total size of file we are writing, only
100 valid if save_name is nonzero */
101 off_t save_sizeleft; /* where we are in the file we are writing,
102 only valid if save_name is nonzero */
103
104 bool write_archive_to_stdout;
105
106 /* Used by flush_read and flush_write to store the real info about saved
107 names. */
108 static char *real_s_name;
109 static off_t real_s_totsize;
110 static off_t real_s_sizeleft;
111 \f
112 /* Functions. */
113
114 void
115 clear_read_error_count (void)
116 {
117 read_error_count = 0;
118 }
119
120 \f
121 /* Time-related functions */
122
123 double duration;
124
125 void
126 set_start_time ()
127 {
128 #if HAVE_CLOCK_GETTIME
129 if (clock_gettime (CLOCK_REALTIME, &start_timespec) != 0)
130 #endif
131 start_time = time (0);
132 }
133
134 void
135 compute_duration ()
136 {
137 #if HAVE_CLOCK_GETTIME
138 struct timespec now;
139 if (clock_gettime (CLOCK_REALTIME, &now) == 0)
140 duration += ((now.tv_sec - start_timespec.tv_sec)
141 + (now.tv_nsec - start_timespec.tv_nsec) / 1e9);
142 else
143 #endif
144 duration += time (NULL) - start_time;
145 set_start_time ();
146 }
147
148 \f
149 /* Compression detection */
150
151 enum compress_type {
152 ct_none,
153 ct_compress,
154 ct_gzip,
155 ct_bzip2
156 };
157
158 struct zip_magic
159 {
160 enum compress_type type;
161 size_t length;
162 char *magic;
163 char *program;
164 char *option;
165 };
166
167 static struct zip_magic const magic[] = {
168 { ct_none, },
169 { ct_compress, 2, "\037\235", "compress", "-Z" },
170 { ct_gzip, 2, "\037\213", "gzip", "-z" },
171 { ct_bzip2, 3, "BZh", "bzip2", "-j" },
172 };
173
174 #define NMAGIC (sizeof(magic)/sizeof(magic[0]))
175
176 #define compress_option(t) magic[t].option
177 #define compress_program(t) magic[t].program
178
179 /* Check if the file ARCHIVE is a compressed archive. */
180 enum compress_type
181 check_compressed_archive ()
182 {
183 struct zip_magic const *p;
184 bool sfr;
185
186 /* Prepare global data needed for find_next_block: */
187 record_end = record_start; /* set up for 1st record = # 0 */
188 sfr = read_full_records;
189 read_full_records = true; /* Suppress fatal error on reading a partial
190 record */
191 find_next_block ();
192
193 /* Restore global values */
194 read_full_records = sfr;
195
196 if (tar_checksum (record_start, true) == HEADER_SUCCESS)
197 /* Probably a valid header */
198 return ct_none;
199
200 for (p = magic + 1; p < magic + NMAGIC; p++)
201 if (memcmp (record_start->buffer, p->magic, p->length) == 0)
202 return p->type;
203
204 return ct_none;
205 }
206
207 /* Open an archive named archive_name_array[0]. Detect if it is
208 a compressed archive of known type and use corresponding decompression
209 program if so */
210 int
211 open_compressed_archive ()
212 {
213 archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
214 MODE_RW, rsh_command_option);
215 if (archive == -1)
216 return archive;
217
218 if (!multi_volume_option)
219 {
220 enum compress_type type = check_compressed_archive ();
221
222 if (type == ct_none)
223 return archive;
224
225 /* FD is not needed any more */
226 rmtclose (archive);
227
228 hit_eof = false; /* It might have been set by find_next_block in
229 check_compressed_archive */
230
231 /* Open compressed archive */
232 use_compress_program_option = compress_program (type);
233 child_pid = sys_child_open_for_uncompress ();
234 read_full_records = true;
235 }
236
237 records_read = 0;
238 record_end = record_start; /* set up for 1st record = # 0 */
239
240 return archive;
241 }
242 \f
243
244 void
245 print_total_written (void)
246 {
247 tarlong written = prev_written + bytes_written;
248 char bytes[sizeof (tarlong) * CHAR_BIT];
249 char abbr[LONGEST_HUMAN_READABLE + 1];
250 char rate[LONGEST_HUMAN_READABLE + 1];
251
252 int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
253
254 sprintf (bytes, TARLONG_FORMAT, written);
255
256 /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */
257 fprintf (stderr, _("Total bytes written: %s (%s, %s/s)\n"), bytes,
258 human_readable (written, abbr, human_opts, 1, 1),
259 (0 < duration && written / duration < (uintmax_t) -1
260 ? human_readable (written / duration, rate, human_opts, 1, 1)
261 : "?"));
262 }
263
264 /* Compute and return the block ordinal at current_block. */
265 off_t
266 current_block_ordinal (void)
267 {
268 return record_start_block + (current_block - record_start);
269 }
270
271 /* If the EOF flag is set, reset it, as well as current_block, etc. */
272 void
273 reset_eof (void)
274 {
275 if (hit_eof)
276 {
277 hit_eof = false;
278 current_block = record_start;
279 record_end = record_start + blocking_factor;
280 access_mode = ACCESS_WRITE;
281 }
282 }
283
284 /* Return the location of the next available input or output block.
285 Return zero for EOF. Once we have returned zero, we just keep returning
286 it, to avoid accidentally going on to the next file on the tape. */
287 union block *
288 find_next_block (void)
289 {
290 if (current_block == record_end)
291 {
292 if (hit_eof)
293 return 0;
294 flush_archive ();
295 if (current_block == record_end)
296 {
297 hit_eof = true;
298 return 0;
299 }
300 }
301 return current_block;
302 }
303
304 /* Indicate that we have used all blocks up thru BLOCK. */
305 void
306 set_next_block_after (union block *block)
307 {
308 while (block >= current_block)
309 current_block++;
310
311 /* Do *not* flush the archive here. If we do, the same argument to
312 set_next_block_after could mean the next block (if the input record
313 is exactly one block long), which is not what is intended. */
314
315 if (current_block > record_end)
316 abort ();
317 }
318
319 /* Return the number of bytes comprising the space between POINTER
320 through the end of the current buffer of blocks. This space is
321 available for filling with data, or taking data from. POINTER is
322 usually (but not always) the result of previous find_next_block call. */
323 size_t
324 available_space_after (union block *pointer)
325 {
326 return record_end->buffer - pointer->buffer;
327 }
328
329 /* Close file having descriptor FD, and abort if close unsuccessful. */
330 void
331 xclose (int fd)
332 {
333 if (close (fd) != 0)
334 close_error (_("(pipe)"));
335 }
336
337 /* Check the LABEL block against the volume label, seen as a globbing
338 pattern. Return true if the pattern matches. In case of failure,
339 retry matching a volume sequence number before giving up in
340 multi-volume mode. */
341 static bool
342 check_label_pattern (union block *label)
343 {
344 char *string;
345 bool result;
346
347 if (! memchr (label->header.name, '\0', sizeof label->header.name))
348 return false;
349
350 if (fnmatch (volume_label_option, label->header.name, 0) == 0)
351 return true;
352
353 if (!multi_volume_option)
354 return false;
355
356 string = xmalloc (strlen (volume_label_option)
357 + sizeof VOLUME_LABEL_APPEND + 1);
358 strcpy (string, volume_label_option);
359 strcat (string, VOLUME_LABEL_APPEND);
360 result = fnmatch (string, label->header.name, 0) == 0;
361 free (string);
362 return result;
363 }
364
365 /* Open an archive file. The argument specifies whether we are
366 reading or writing, or both. */
367 void
368 open_archive (enum access_mode wanted_access)
369 {
370 int backed_up_flag = 0;
371
372 if (index_file_name)
373 {
374 stdlis = fopen (index_file_name, "w");
375 if (! stdlis)
376 open_error (index_file_name);
377 }
378 else
379 stdlis = to_stdout_option ? stderr : stdout;
380
381 if (record_size == 0)
382 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
383
384 if (archive_names == 0)
385 FATAL_ERROR ((0, 0, _("No archive name given")));
386
387 tar_stat_destroy (&current_stat_info);
388 save_name = 0;
389 real_s_name = 0;
390
391 record_start =
392 page_aligned_alloc (&record_buffer,
393 (record_size
394 + (multi_volume_option ? 2 * BLOCKSIZE : 0)));
395 if (multi_volume_option)
396 record_start += 2;
397
398 current_block = record_start;
399 record_end = record_start + blocking_factor;
400 /* When updating the archive, we start with reading. */
401 access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
402
403 read_full_records = read_full_records_option;
404
405 records_read = 0;
406
407 if (use_compress_program_option)
408 {
409 switch (wanted_access)
410 {
411 case ACCESS_READ:
412 child_pid = sys_child_open_for_uncompress ();
413 read_full_records = true;
414 record_end = record_start; /* set up for 1st record = # 0 */
415 break;
416
417 case ACCESS_WRITE:
418 child_pid = sys_child_open_for_compress ();
419 break;
420
421 case ACCESS_UPDATE:
422 abort (); /* Should not happen */
423 break;
424 }
425
426 if (wanted_access == ACCESS_WRITE
427 && strcmp (archive_name_array[0], "-") == 0)
428 stdlis = stderr;
429 }
430 else if (strcmp (archive_name_array[0], "-") == 0)
431 {
432 read_full_records = true; /* could be a pipe, be safe */
433 if (verify_option)
434 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
435
436 switch (wanted_access)
437 {
438 case ACCESS_READ:
439 {
440 enum compress_type type;
441
442 archive = STDIN_FILENO;
443
444 type = check_compressed_archive (archive);
445 if (type != ct_none)
446 FATAL_ERROR ((0, 0,
447 _("Archive is compressed. Use %s option"),
448 compress_option (type)));
449 }
450 break;
451
452 case ACCESS_WRITE:
453 archive = STDOUT_FILENO;
454 stdlis = stderr;
455 break;
456
457 case ACCESS_UPDATE:
458 archive = STDIN_FILENO;
459 stdlis = stderr;
460 write_archive_to_stdout = true;
461 break;
462 }
463 }
464 else if (verify_option)
465 archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
466 MODE_RW, rsh_command_option);
467 else
468 switch (wanted_access)
469 {
470 case ACCESS_READ:
471 archive = open_compressed_archive ();
472 break;
473
474 case ACCESS_WRITE:
475 if (backup_option)
476 {
477 maybe_backup_file (archive_name_array[0], 1);
478 backed_up_flag = 1;
479 }
480 archive = rmtcreat (archive_name_array[0], MODE_RW,
481 rsh_command_option);
482 break;
483
484 case ACCESS_UPDATE:
485 archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
486 MODE_RW, rsh_command_option);
487 break;
488 }
489
490 if (archive < 0
491 || (! _isrmt (archive) && !sys_get_archive_stat ()))
492 {
493 int saved_errno = errno;
494
495 if (backed_up_flag)
496 undo_last_backup ();
497 errno = saved_errno;
498 open_fatal (archive_name_array[0]);
499 }
500
501 sys_detect_dev_null_output ();
502 sys_save_archive_dev_ino ();
503 SET_BINARY_MODE (archive);
504
505 switch (wanted_access)
506 {
507 case ACCESS_UPDATE:
508 records_written = 0;
509 record_end = record_start; /* set up for 1st record = # 0 */
510
511 case ACCESS_READ:
512 find_next_block (); /* read it in, check for EOF */
513
514 if (volume_label_option)
515 {
516 union block *label = find_next_block ();
517
518 if (!label)
519 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
520 quote (volume_label_option)));
521 if (!check_label_pattern (label))
522 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
523 quote_n (0, label->header.name),
524 quote_n (1, volume_label_option)));
525 }
526 break;
527
528 case ACCESS_WRITE:
529 records_written = 0;
530 if (volume_label_option)
531 {
532 memset (record_start, 0, BLOCKSIZE);
533 if (multi_volume_option)
534 sprintf (record_start->header.name, "%s Volume 1",
535 volume_label_option);
536 else
537 strcpy (record_start->header.name, volume_label_option);
538
539 assign_string (&current_stat_info.file_name,
540 record_start->header.name);
541 current_stat_info.had_trailing_slash =
542 strip_trailing_slashes (current_stat_info.file_name);
543
544 record_start->header.typeflag = GNUTYPE_VOLHDR;
545 TIME_TO_CHARS (start_time, record_start->header.mtime);
546 finish_header (&current_stat_info, record_start, -1);
547 }
548 break;
549 }
550 }
551
552 /* Perform a write to flush the buffer. */
553 void
554 flush_write (void)
555 {
556 int copy_back;
557 ssize_t status;
558
559 if (checkpoint_option && !(++checkpoint % 10))
560 /* TRANSLATORS: This is a ``checkpoint of write operation'',
561 *not* ``Writing a checkpoint''.
562 E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
563 *not* ``Escribiendo un punto de comprobaci@'on'' */
564 WARN ((0, 0, _("Write checkpoint %d"), checkpoint));
565
566 if (tape_length_option && tape_length_option <= bytes_written)
567 {
568 errno = ENOSPC;
569 status = 0;
570 }
571 else if (dev_null_output)
572 status = record_size;
573 else
574 status = sys_write_archive_buffer ();
575 if (status != record_size && !multi_volume_option)
576 archive_write_error (status);
577
578 if (status > 0)
579 {
580 records_written++;
581 bytes_written += status;
582 }
583
584 if (status == record_size)
585 {
586 if (multi_volume_option)
587 {
588 if (save_name)
589 {
590 assign_string (&real_s_name, safer_name_suffix (save_name, false));
591 real_s_totsize = save_totsize;
592 real_s_sizeleft = save_sizeleft;
593 }
594 else
595 {
596 assign_string (&real_s_name, 0);
597 real_s_totsize = 0;
598 real_s_sizeleft = 0;
599 }
600 }
601 return;
602 }
603
604 /* We're multivol. Panic if we didn't get the right kind of response. */
605
606 /* ENXIO is for the UNIX PC. */
607 if (status < 0 && errno != ENOSPC && errno != EIO && errno != ENXIO)
608 archive_write_error (status);
609
610 /* If error indicates a short write, we just move to the next tape. */
611
612 if (!new_volume (ACCESS_WRITE))
613 return;
614
615 if (totals_option)
616 prev_written += bytes_written;
617 bytes_written = 0;
618
619 if (volume_label_option && real_s_name)
620 {
621 copy_back = 2;
622 record_start -= 2;
623 }
624 else if (volume_label_option || real_s_name)
625 {
626 copy_back = 1;
627 record_start--;
628 }
629 else
630 copy_back = 0;
631
632 if (volume_label_option)
633 {
634 memset (record_start, 0, BLOCKSIZE);
635 sprintf (record_start->header.name, "%s Volume %d",
636 volume_label_option, volno);
637 TIME_TO_CHARS (start_time, record_start->header.mtime);
638 record_start->header.typeflag = GNUTYPE_VOLHDR;
639 finish_header (&current_stat_info, record_start, -1);
640 }
641
642 if (real_s_name)
643 {
644 int tmp;
645
646 if (volume_label_option)
647 record_start++;
648
649 if (strlen (real_s_name) > NAME_FIELD_SIZE)
650 WARN ((0, 0,
651 _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
652 quotearg_colon (real_s_name)));
653
654 memset (record_start, 0, BLOCKSIZE);
655
656 /* FIXME: Michael P Urban writes: [a long name file] is being written
657 when a new volume rolls around [...] Looks like the wrong value is
658 being preserved in real_s_name, though. */
659
660 strncpy (record_start->header.name, real_s_name, NAME_FIELD_SIZE);
661 record_start->header.typeflag = GNUTYPE_MULTIVOL;
662
663 OFF_TO_CHARS (real_s_sizeleft, record_start->header.size);
664 OFF_TO_CHARS (real_s_totsize - real_s_sizeleft,
665 record_start->oldgnu_header.offset);
666
667 tmp = verbose_option;
668 verbose_option = 0;
669 finish_header (&current_stat_info, record_start, -1);
670 verbose_option = tmp;
671
672 if (volume_label_option)
673 record_start--;
674 }
675
676 status = sys_write_archive_buffer ();
677 if (status != record_size)
678 archive_write_error (status);
679
680 bytes_written += status;
681
682 if (copy_back)
683 {
684 record_start += copy_back;
685 memcpy (current_block,
686 record_start + blocking_factor - copy_back,
687 copy_back * BLOCKSIZE);
688 current_block += copy_back;
689
690 if (real_s_sizeleft >= copy_back * BLOCKSIZE)
691 real_s_sizeleft -= copy_back * BLOCKSIZE;
692 else if ((real_s_sizeleft + BLOCKSIZE - 1) / BLOCKSIZE <= copy_back)
693 assign_string (&real_s_name, 0);
694 else
695 {
696 assign_string (&real_s_name, safer_name_suffix (save_name, false));
697 real_s_sizeleft = save_sizeleft;
698 real_s_totsize = save_totsize;
699 }
700 copy_back = 0;
701 }
702 }
703
704 /* Handle write errors on the archive. Write errors are always fatal.
705 Hitting the end of a volume does not cause a write error unless the
706 write was the first record of the volume. */
707 void
708 archive_write_error (ssize_t status)
709 {
710 /* It might be useful to know how much was written before the error
711 occurred. */
712 if (totals_option)
713 {
714 int e = errno;
715 print_total_written ();
716 errno = e;
717 }
718
719 write_fatal_details (*archive_name_cursor, status, record_size);
720 }
721
722 /* Handle read errors on the archive. If the read should be retried,
723 return to the caller. */
724 void
725 archive_read_error (void)
726 {
727 read_error (*archive_name_cursor);
728
729 if (record_start_block == 0)
730 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
731
732 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
733 then give up on reading the archive. */
734
735 if (read_error_count++ > READ_ERROR_MAX)
736 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
737 return;
738 }
739
740 static void
741 short_read (size_t status)
742 {
743 size_t left; /* bytes left */
744 char *more; /* pointer to next byte to read */
745
746 more = record_start->buffer + status;
747 left = record_size - status;
748
749 while (left % BLOCKSIZE != 0
750 || (left && status && read_full_records))
751 {
752 if (status)
753 while ((status = rmtread (archive, more, left)) == SAFE_READ_ERROR)
754 archive_read_error ();
755
756 if (status == 0)
757 break;
758
759 if (! read_full_records)
760 {
761 unsigned long rest = record_size - left;
762
763 FATAL_ERROR ((0, 0,
764 ngettext ("Unaligned block (%lu byte) in archive",
765 "Unaligned block (%lu bytes) in archive",
766 rest),
767 rest));
768 }
769
770 /* User warned us about this. Fix up. */
771
772 left -= status;
773 more += status;
774 }
775
776 /* FIXME: for size=0, multi-volume support. On the first record, warn
777 about the problem. */
778
779 if (!read_full_records && verbose_option > 1
780 && record_start_block == 0 && status != 0)
781 {
782 unsigned long rsize = (record_size - left) / BLOCKSIZE;
783 WARN ((0, 0,
784 ngettext ("Record size = %lu block",
785 "Record size = %lu blocks",
786 rsize),
787 rsize));
788 }
789
790 record_end = record_start + (record_size - left) / BLOCKSIZE;
791 records_read++;
792 }
793
794 /* Perform a read to flush the buffer. */
795 void
796 flush_read (void)
797 {
798 size_t status; /* result from system call */
799
800 if (checkpoint_option && !(++checkpoint % 10))
801 /* TRANSLATORS: This is a ``checkpoint of read operation'',
802 *not* ``Reading a checkpoint''.
803 E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
804 *not* ``Leyendo un punto de comprobaci@'on'' */
805 WARN ((0, 0, _("Read checkpoint %d"), checkpoint));
806
807 /* Clear the count of errors. This only applies to a single call to
808 flush_read. */
809
810 read_error_count = 0; /* clear error count */
811
812 if (write_archive_to_stdout && record_start_block != 0)
813 {
814 archive = STDOUT_FILENO;
815 status = sys_write_archive_buffer ();
816 archive = STDIN_FILENO;
817 if (status != record_size)
818 archive_write_error (status);
819 }
820 if (multi_volume_option)
821 {
822 if (save_name)
823 {
824 assign_string (&real_s_name, safer_name_suffix (save_name, false));
825 real_s_sizeleft = save_sizeleft;
826 real_s_totsize = save_totsize;
827 }
828 else
829 {
830 assign_string (&real_s_name, 0);
831 real_s_totsize = 0;
832 real_s_sizeleft = 0;
833 }
834 }
835
836 error_loop:
837 status = rmtread (archive, record_start->buffer, record_size);
838 if (status == record_size)
839 {
840 records_read++;
841 return;
842 }
843
844 /* The condition below used to include
845 || (status > 0 && !read_full_records)
846 This is incorrect since even if new_volume() succeeds, the
847 subsequent call to rmtread will overwrite the chunk of data
848 already read in the buffer, so the processing will fail */
849
850 if ((status == 0
851 || (status == SAFE_READ_ERROR && errno == ENOSPC))
852 && multi_volume_option)
853 {
854 union block *cursor;
855
856 try_volume:
857 switch (subcommand_option)
858 {
859 case APPEND_SUBCOMMAND:
860 case CAT_SUBCOMMAND:
861 case UPDATE_SUBCOMMAND:
862 if (!new_volume (ACCESS_UPDATE))
863 return;
864 break;
865
866 default:
867 if (!new_volume (ACCESS_READ))
868 return;
869 break;
870 }
871
872 while ((status = rmtread (archive, record_start->buffer, record_size))
873 == SAFE_READ_ERROR)
874 archive_read_error ();
875
876 if (status != record_size)
877 short_read (status);
878
879 cursor = record_start;
880
881 if (cursor->header.typeflag == GNUTYPE_VOLHDR)
882 {
883 if (volume_label_option)
884 {
885 if (!check_label_pattern (cursor))
886 {
887 WARN ((0, 0, _("Volume %s does not match %s"),
888 quote_n (0, cursor->header.name),
889 quote_n (1, volume_label_option)));
890 volno--;
891 global_volno--;
892 goto try_volume;
893 }
894 }
895 if (verbose_option)
896 fprintf (stdlis, _("Reading %s\n"), quote (cursor->header.name));
897 cursor++;
898 }
899 else if (volume_label_option)
900 WARN ((0, 0, _("WARNING: No volume header")));
901
902 if (real_s_name)
903 {
904 uintmax_t s1, s2;
905 if (cursor->header.typeflag != GNUTYPE_MULTIVOL
906 || strncmp (cursor->header.name, real_s_name, NAME_FIELD_SIZE))
907 {
908 WARN ((0, 0, _("%s is not continued on this volume"),
909 quote (real_s_name)));
910 volno--;
911 global_volno--;
912 goto try_volume;
913 }
914 s1 = UINTMAX_FROM_HEADER (cursor->header.size);
915 s2 = UINTMAX_FROM_HEADER (cursor->oldgnu_header.offset);
916 if (real_s_totsize != s1 + s2 || s1 + s2 < s2)
917 {
918 char totsizebuf[UINTMAX_STRSIZE_BOUND];
919 char s1buf[UINTMAX_STRSIZE_BOUND];
920 char s2buf[UINTMAX_STRSIZE_BOUND];
921
922 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
923 quote (cursor->header.name),
924 STRINGIFY_BIGINT (save_totsize, totsizebuf),
925 STRINGIFY_BIGINT (s1, s1buf),
926 STRINGIFY_BIGINT (s2, s2buf)));
927 volno--;
928 global_volno--;
929 goto try_volume;
930 }
931 if (real_s_totsize - real_s_sizeleft
932 != OFF_FROM_HEADER (cursor->oldgnu_header.offset))
933 {
934 WARN ((0, 0, _("This volume is out of sequence")));
935 volno--;
936 global_volno--;
937 goto try_volume;
938 }
939 cursor++;
940 }
941 current_block = cursor;
942 records_read++;
943 return;
944 }
945 else if (status == SAFE_READ_ERROR)
946 {
947 archive_read_error ();
948 goto error_loop; /* try again */
949 }
950
951 short_read (status);
952 }
953
954 /* Flush the current buffer to/from the archive. */
955 void
956 flush_archive (void)
957 {
958 record_start_block += record_end - record_start;
959 current_block = record_start;
960 record_end = record_start + blocking_factor;
961
962 if (access_mode == ACCESS_READ && time_to_start_writing)
963 {
964 access_mode = ACCESS_WRITE;
965 time_to_start_writing = false;
966 backspace_output ();
967 }
968
969 switch (access_mode)
970 {
971 case ACCESS_READ:
972 flush_read ();
973 break;
974
975 case ACCESS_WRITE:
976 flush_write ();
977 break;
978
979 case ACCESS_UPDATE:
980 abort ();
981 }
982 }
983
984 /* Backspace the archive descriptor by one record worth. If it's a
985 tape, MTIOCTOP will work. If it's something else, try to seek on
986 it. If we can't seek, we lose! */
987 static void
988 backspace_output (void)
989 {
990 #ifdef MTIOCTOP
991 {
992 struct mtop operation;
993
994 operation.mt_op = MTBSR;
995 operation.mt_count = 1;
996 if (rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
997 return;
998 if (errno == EIO && rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
999 return;
1000 }
1001 #endif
1002
1003 {
1004 off_t position = rmtlseek (archive, (off_t) 0, SEEK_CUR);
1005
1006 /* Seek back to the beginning of this record and start writing there. */
1007
1008 position -= record_size;
1009 if (position < 0)
1010 position = 0;
1011 if (rmtlseek (archive, position, SEEK_SET) != position)
1012 {
1013 /* Lseek failed. Try a different method. */
1014
1015 WARN ((0, 0,
1016 _("Cannot backspace archive file; it may be unreadable without -i")));
1017
1018 /* Replace the first part of the record with NULs. */
1019
1020 if (record_start->buffer != output_start)
1021 memset (record_start->buffer, 0,
1022 output_start - record_start->buffer);
1023 }
1024 }
1025 }
1026
1027 off_t
1028 seek_archive (off_t size)
1029 {
1030 off_t start = current_block_ordinal ();
1031 off_t offset;
1032 off_t nrec, nblk;
1033 off_t skipped = (blocking_factor - (current_block - record_start));
1034
1035 size -= skipped * BLOCKSIZE;
1036
1037 if (size < record_size)
1038 return 0;
1039 /* FIXME: flush? */
1040
1041 /* Compute number of records to skip */
1042 nrec = size / record_size;
1043 offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
1044 if (offset < 0)
1045 return offset;
1046
1047 if (offset % record_size)
1048 FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
1049
1050 /* Convert to number of records */
1051 offset /= BLOCKSIZE;
1052 /* Compute number of skipped blocks */
1053 nblk = offset - start;
1054
1055 /* Update buffering info */
1056 records_read += nblk / blocking_factor;
1057 record_start_block = offset - blocking_factor;
1058 current_block = record_end;
1059
1060 return nblk;
1061 }
1062
1063 /* Close the archive file. */
1064 void
1065 close_archive (void)
1066 {
1067 if (time_to_start_writing || access_mode == ACCESS_WRITE)
1068 flush_archive ();
1069
1070 sys_drain_input_pipe ();
1071
1072 compute_duration ();
1073 if (verify_option)
1074 verify_volume ();
1075
1076 if (rmtclose (archive) != 0)
1077 close_warn (*archive_name_cursor);
1078
1079 sys_wait_for_child (child_pid);
1080
1081 tar_stat_destroy (&current_stat_info);
1082 if (save_name)
1083 free (save_name);
1084 if (real_s_name)
1085 free (real_s_name);
1086 free (record_buffer);
1087 }
1088
1089 /* Called to initialize the global volume number. */
1090 void
1091 init_volume_number (void)
1092 {
1093 FILE *file = fopen (volno_file_option, "r");
1094
1095 if (file)
1096 {
1097 if (fscanf (file, "%d", &global_volno) != 1
1098 || global_volno < 0)
1099 FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
1100 quotearg_colon (volno_file_option)));
1101 if (ferror (file))
1102 read_error (volno_file_option);
1103 if (fclose (file) != 0)
1104 close_error (volno_file_option);
1105 }
1106 else if (errno != ENOENT)
1107 open_error (volno_file_option);
1108 }
1109
1110 /* Called to write out the closing global volume number. */
1111 void
1112 closeout_volume_number (void)
1113 {
1114 FILE *file = fopen (volno_file_option, "w");
1115
1116 if (file)
1117 {
1118 fprintf (file, "%d\n", global_volno);
1119 if (ferror (file))
1120 write_error (volno_file_option);
1121 if (fclose (file) != 0)
1122 close_error (volno_file_option);
1123 }
1124 else
1125 open_error (volno_file_option);
1126 }
1127
1128 /* We've hit the end of the old volume. Close it and open the next one.
1129 Return nonzero on success.
1130 */
1131 static bool
1132 new_volume (enum access_mode mode)
1133 {
1134 static FILE *read_file;
1135 static int looped;
1136
1137 if (!read_file && !info_script_option)
1138 /* FIXME: if fopen is used, it will never be closed. */
1139 read_file = archive == STDIN_FILENO ? fopen (TTY_NAME, "r") : stdin;
1140
1141 if (now_verifying)
1142 return false;
1143 if (verify_option)
1144 verify_volume ();
1145
1146 if (rmtclose (archive) != 0)
1147 close_warn (*archive_name_cursor);
1148
1149 global_volno++;
1150 if (global_volno < 0)
1151 FATAL_ERROR ((0, 0, _("Volume number overflow")));
1152 volno++;
1153 archive_name_cursor++;
1154 if (archive_name_cursor == archive_name_array + archive_names)
1155 {
1156 archive_name_cursor = archive_name_array;
1157 looped = 1;
1158 }
1159
1160 tryagain:
1161 if (looped)
1162 {
1163 /* We have to prompt from now on. */
1164
1165 if (info_script_option)
1166 {
1167 if (volno_file_option)
1168 closeout_volume_number ();
1169 if (system (info_script_option) != 0)
1170 FATAL_ERROR ((0, 0, _("%s command failed"),
1171 quote (info_script_option)));
1172 }
1173 else
1174 while (1)
1175 {
1176 char input_buffer[80];
1177
1178 fputc ('\007', stderr);
1179 fprintf (stderr,
1180 _("Prepare volume #%d for %s and hit return: "),
1181 global_volno, quote (*archive_name_cursor));
1182 fflush (stderr);
1183
1184 if (fgets (input_buffer, sizeof input_buffer, read_file) == 0)
1185 {
1186 WARN ((0, 0, _("EOF where user reply was expected")));
1187
1188 if (subcommand_option != EXTRACT_SUBCOMMAND
1189 && subcommand_option != LIST_SUBCOMMAND
1190 && subcommand_option != DIFF_SUBCOMMAND)
1191 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1192
1193 fatal_exit ();
1194 }
1195 if (input_buffer[0] == '\n'
1196 || input_buffer[0] == 'y'
1197 || input_buffer[0] == 'Y')
1198 break;
1199
1200 switch (input_buffer[0])
1201 {
1202 case '?':
1203 {
1204 /* FIXME: Might it be useful to disable the '!' command? */
1205 fprintf (stderr, _("\
1206 n [name] Give a new file name for the next (and subsequent) volume(s)\n\
1207 q Abort tar\n\
1208 ! Spawn a subshell\n\
1209 ? Print this list\n"));
1210 }
1211 break;
1212
1213 case 'q':
1214 /* Quit. */
1215
1216 WARN ((0, 0, _("No new volume; exiting.\n")));
1217
1218 if (subcommand_option != EXTRACT_SUBCOMMAND
1219 && subcommand_option != LIST_SUBCOMMAND
1220 && subcommand_option != DIFF_SUBCOMMAND)
1221 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1222
1223 fatal_exit ();
1224
1225 case 'n':
1226 /* Get new file name. */
1227
1228 {
1229 char *name = &input_buffer[1];
1230 char *cursor;
1231
1232 for (name = input_buffer + 1;
1233 *name == ' ' || *name == '\t';
1234 name++)
1235 ;
1236
1237 for (cursor = name; *cursor && *cursor != '\n'; cursor++)
1238 ;
1239 *cursor = '\0';
1240
1241 /* FIXME: the following allocation is never reclaimed. */
1242 *archive_name_cursor = xstrdup (name);
1243 }
1244 break;
1245
1246 case '!':
1247 sys_spawn_shell ();
1248 break;
1249 }
1250 }
1251 }
1252
1253 if (strcmp (archive_name_cursor[0], "-") == 0)
1254 {
1255 read_full_records = true;
1256 archive = STDIN_FILENO;
1257 }
1258 else if (verify_option)
1259 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1260 rsh_command_option);
1261 else
1262 switch (mode)
1263 {
1264 case ACCESS_READ:
1265 archive = rmtopen (*archive_name_cursor, O_RDONLY, MODE_RW,
1266 rsh_command_option);
1267 break;
1268
1269 case ACCESS_WRITE:
1270 if (backup_option)
1271 maybe_backup_file (*archive_name_cursor, 1);
1272 archive = rmtcreat (*archive_name_cursor, MODE_RW,
1273 rsh_command_option);
1274 break;
1275
1276 case ACCESS_UPDATE:
1277 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1278 rsh_command_option);
1279 break;
1280 }
1281
1282 if (archive < 0)
1283 {
1284 open_warn (*archive_name_cursor);
1285 if (!verify_option && mode == ACCESS_WRITE && backup_option)
1286 undo_last_backup ();
1287 goto tryagain;
1288 }
1289
1290 SET_BINARY_MODE (archive);
1291
1292 return true;
1293 }
This page took 0.088785 seconds and 5 git commands to generate.