]> Dogcows Code - chaz/tar/blob - src/buffer.c
(flush_read): Fixed behavior on short
[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 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 #if MSDOS
27 # include <process.h>
28 #endif
29
30 #if XENIX
31 # include <sys/inode.h>
32 #endif
33
34 #include <fnmatch.h>
35 #include <human.h>
36 #include <quotearg.h>
37
38 #include "common.h"
39 #include "rmt.h"
40
41 #define PREAD 0 /* read file descriptor from pipe() */
42 #define PWRITE 1 /* write file descriptor from pipe() */
43
44 /* Number of retries before giving up on read. */
45 #define READ_ERROR_MAX 10
46
47 /* Globbing pattern to append to volume label if initial match failed. */
48 #define VOLUME_LABEL_APPEND " Volume [1-9]*"
49 \f
50 /* Variables. */
51
52 static tarlong prev_written; /* bytes written on previous volumes */
53 static tarlong bytes_written; /* bytes written on this volume */
54
55 /* FIXME: The following variables should ideally be static to this
56 module. However, this cannot be done yet. The cleanup continues! */
57
58 union block *record_start; /* start of record of archive */
59 union block *record_end; /* last+1 block of archive record */
60 union block *current_block; /* current block of archive */
61 enum access_mode access_mode; /* how do we handle the archive */
62 off_t records_read; /* number of records read from this archive */
63 off_t records_written; /* likewise, for records written */
64
65 static struct stat archive_stat; /* stat block for archive file */
66
67 static off_t record_start_block; /* block ordinal at record_start */
68
69 /* Where we write list messages (not errors, not interactions) to. */
70 FILE *stdlis;
71
72 static void backspace_output (void);
73 static int new_volume (enum access_mode);
74 static void archive_write_error (ssize_t) __attribute__ ((noreturn));
75 static void archive_read_error (void);
76
77 #if !MSDOS
78 /* Obnoxious test to see if dimwit is trying to dump the archive. */
79 dev_t ar_dev;
80 ino_t ar_ino;
81 #endif
82
83 /* PID of child program, if compress_option or remote archive access. */
84 static pid_t child_pid;
85
86 /* Error recovery stuff */
87 static int read_error_count;
88
89 /* Have we hit EOF yet? */
90 static int hit_eof;
91
92 /* Checkpointing counter */
93 static int checkpoint;
94
95 /* We're reading, but we just read the last block and its time to update. */
96 /* As least EXTERN like this one as possible. FIXME! */
97 extern int time_to_start_writing;
98
99 int file_to_switch_to = -1; /* if remote update, close archive, and use
100 this descriptor to write to */
101
102 static int volno = 1; /* which volume of a multi-volume tape we're
103 on */
104 static int global_volno = 1; /* volume number to print in external
105 messages */
106
107 /* The pointer save_name, which is set in function dump_file() of module
108 create.c, points to the original long filename instead of the new,
109 shorter mangled name that is set in start_header() of module create.c.
110 The pointer save_name is only used in multi-volume mode when the file
111 being processed is non-sparse; if a file is split between volumes, the
112 save_name is used in generating the LF_MULTIVOL record on the second
113 volume. (From Pierce Cantrell, 1991-08-13.) */
114
115 char *save_name; /* name of the file we are currently writing */
116 off_t save_totsize; /* total size of file we are writing, only
117 valid if save_name is nonzero */
118 off_t save_sizeleft; /* where we are in the file we are writing,
119 only valid if save_name is nonzero */
120
121 bool write_archive_to_stdout;
122
123 /* Used by flush_read and flush_write to store the real info about saved
124 names. */
125 static char *real_s_name;
126 static off_t real_s_totsize;
127 static off_t real_s_sizeleft;
128 \f
129 /* Functions. */
130
131 void
132 print_total_written (void)
133 {
134 tarlong written = prev_written + bytes_written;
135 char bytes[sizeof (tarlong) * CHAR_BIT];
136 char abbr[LONGEST_HUMAN_READABLE + 1];
137 char rate[LONGEST_HUMAN_READABLE + 1];
138 double seconds;
139 int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
140
141 #if HAVE_CLOCK_GETTIME
142 struct timespec now;
143 if (clock_gettime (CLOCK_REALTIME, &now) == 0)
144 seconds = ((now.tv_sec - start_timespec.tv_sec)
145 + (now.tv_nsec - start_timespec.tv_nsec) / 1e9);
146 else
147 #endif
148 seconds = time (0) - start_time;
149
150 sprintf (bytes, TARLONG_FORMAT, written);
151
152 /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */
153 fprintf (stderr, _("Total bytes written: %s (%s, %s/s)\n"), bytes,
154 human_readable (written, abbr, human_opts, 1, 1),
155 (0 < seconds && written / seconds < (uintmax_t) -1
156 ? human_readable (written / seconds, rate, human_opts, 1, 1)
157 : "?"));
158 }
159
160 /* Compute and return the block ordinal at current_block. */
161 off_t
162 current_block_ordinal (void)
163 {
164 return record_start_block + (current_block - record_start);
165 }
166
167 /* If the EOF flag is set, reset it, as well as current_block, etc. */
168 void
169 reset_eof (void)
170 {
171 if (hit_eof)
172 {
173 hit_eof = 0;
174 current_block = record_start;
175 record_end = record_start + blocking_factor;
176 access_mode = ACCESS_WRITE;
177 }
178 }
179
180 /* Return the location of the next available input or output block.
181 Return zero for EOF. Once we have returned zero, we just keep returning
182 it, to avoid accidentally going on to the next file on the tape. */
183 union block *
184 find_next_block (void)
185 {
186 if (current_block == record_end)
187 {
188 if (hit_eof)
189 return 0;
190 flush_archive ();
191 if (current_block == record_end)
192 {
193 hit_eof = 1;
194 return 0;
195 }
196 }
197 return current_block;
198 }
199
200 /* Indicate that we have used all blocks up thru BLOCK.
201 FIXME: should the arg have an off-by-1? */
202 void
203 set_next_block_after (union block *block)
204 {
205 while (block >= current_block)
206 current_block++;
207
208 /* Do *not* flush the archive here. If we do, the same argument to
209 set_next_block_after could mean the next block (if the input record
210 is exactly one block long), which is not what is intended. */
211
212 if (current_block > record_end)
213 abort ();
214 }
215
216 /* Return the number of bytes comprising the space between POINTER
217 through the end of the current buffer of blocks. This space is
218 available for filling with data, or taking data from. POINTER is
219 usually (but not always) the result previous find_next_block call. */
220 size_t
221 available_space_after (union block *pointer)
222 {
223 return record_end->buffer - pointer->buffer;
224 }
225
226 /* Close file having descriptor FD, and abort if close unsuccessful. */
227 static void
228 xclose (int fd)
229 {
230 if (close (fd) != 0)
231 close_error (_("(pipe)"));
232 }
233
234 /* Duplicate file descriptor FROM into becoming INTO.
235 INTO is closed first and has to be the next available slot. */
236 static void
237 xdup2 (int from, int into)
238 {
239 if (from != into)
240 {
241 int status = close (into);
242
243 if (status != 0 && errno != EBADF)
244 {
245 int e = errno;
246 FATAL_ERROR ((0, e, _("Cannot close")));
247 }
248 status = dup (from);
249 if (status != into)
250 {
251 if (status < 0)
252 {
253 int e = errno;
254 FATAL_ERROR ((0, e, _("Cannot dup")));
255 }
256 abort ();
257 }
258 xclose (from);
259 }
260 }
261
262 #if MSDOS
263
264 /* Set ARCHIVE for writing, then compressing an archive. */
265 static void
266 child_open_for_compress (void)
267 {
268 FATAL_ERROR ((0, 0, _("Cannot use compressed or remote archives")));
269 }
270
271 /* Set ARCHIVE for uncompressing, then reading an archive. */
272 static void
273 child_open_for_uncompress (void)
274 {
275 FATAL_ERROR ((0, 0, _("Cannot use compressed or remote archives")));
276 }
277
278 #else /* not MSDOS */
279
280 /* Return nonzero if NAME is the name of a regular file, or if the file
281 does not exist (so it would be created as a regular file). */
282 static int
283 is_regular_file (const char *name)
284 {
285 struct stat stbuf;
286
287 if (stat (name, &stbuf) == 0)
288 return S_ISREG (stbuf.st_mode);
289 else
290 return errno == ENOENT;
291 }
292
293 static ssize_t
294 write_archive_buffer (void)
295 {
296 ssize_t status;
297 ssize_t written = 0;
298
299 while (0 <= (status = rmtwrite (archive, record_start->buffer + written,
300 record_size - written)))
301 {
302 written += status;
303 if (written == record_size
304 || _isrmt (archive)
305 || ! (S_ISFIFO (archive_stat.st_mode)
306 || S_ISSOCK (archive_stat.st_mode)))
307 break;
308 }
309
310 return written ? written : status;
311 }
312
313 /* Set ARCHIVE for writing, then compressing an archive. */
314 static void
315 child_open_for_compress (void)
316 {
317 int parent_pipe[2];
318 int child_pipe[2];
319 pid_t grandchild_pid;
320 int wait_status;
321
322 xpipe (parent_pipe);
323 child_pid = xfork ();
324
325 if (child_pid > 0)
326 {
327 /* The parent tar is still here! Just clean up. */
328
329 archive = parent_pipe[PWRITE];
330 xclose (parent_pipe[PREAD]);
331 return;
332 }
333
334 /* The new born child tar is here! */
335
336 program_name = _("tar (child)");
337
338 xdup2 (parent_pipe[PREAD], STDIN_FILENO);
339 xclose (parent_pipe[PWRITE]);
340
341 /* Check if we need a grandchild tar. This happens only if either:
342 a) we are writing stdout: to force reblocking;
343 b) the file is to be accessed by rmt: compressor doesn't know how;
344 c) the file is not a plain file. */
345
346 if (strcmp (archive_name_array[0], "-") != 0
347 && !_remdev (archive_name_array[0])
348 && is_regular_file (archive_name_array[0]))
349 {
350 if (backup_option)
351 maybe_backup_file (archive_name_array[0], 1);
352
353 /* We don't need a grandchild tar. Open the archive and launch the
354 compressor. */
355
356 archive = creat (archive_name_array[0], MODE_RW);
357 if (archive < 0)
358 {
359 int saved_errno = errno;
360
361 if (backup_option)
362 undo_last_backup ();
363 errno = saved_errno;
364 open_fatal (archive_name_array[0]);
365 }
366 xdup2 (archive, STDOUT_FILENO);
367 execlp (use_compress_program_option, use_compress_program_option,
368 (char *) 0);
369 exec_fatal (use_compress_program_option);
370 }
371
372 /* We do need a grandchild tar. */
373
374 xpipe (child_pipe);
375 grandchild_pid = xfork ();
376
377 if (grandchild_pid == 0)
378 {
379 /* The newborn grandchild tar is here! Launch the compressor. */
380
381 program_name = _("tar (grandchild)");
382
383 xdup2 (child_pipe[PWRITE], STDOUT_FILENO);
384 xclose (child_pipe[PREAD]);
385 execlp (use_compress_program_option, use_compress_program_option,
386 (char *) 0);
387 exec_fatal (use_compress_program_option);
388 }
389
390 /* The child tar is still here! */
391
392 /* Prepare for reblocking the data from the compressor into the archive. */
393
394 xdup2 (child_pipe[PREAD], STDIN_FILENO);
395 xclose (child_pipe[PWRITE]);
396
397 if (strcmp (archive_name_array[0], "-") == 0)
398 archive = STDOUT_FILENO;
399 else
400 {
401 archive = rmtcreat (archive_name_array[0], MODE_RW, rsh_command_option);
402 if (archive < 0)
403 open_fatal (archive_name_array[0]);
404 }
405
406 /* Let's read out of the stdin pipe and write an archive. */
407
408 while (1)
409 {
410 ssize_t status = 0;
411 char *cursor;
412 size_t length;
413
414 /* Assemble a record. */
415
416 for (length = 0, cursor = record_start->buffer;
417 length < record_size;
418 length += status, cursor += status)
419 {
420 size_t size = record_size - length;
421
422 status = safe_read (STDIN_FILENO, cursor, size);
423 if (status <= 0)
424 break;
425 }
426
427 if (status < 0)
428 read_fatal (use_compress_program_option);
429
430 /* Copy the record. */
431
432 if (status == 0)
433 {
434 /* We hit the end of the file. Write last record at
435 full length, as the only role of the grandchild is
436 doing proper reblocking. */
437
438 if (length > 0)
439 {
440 memset (record_start->buffer + length, 0, record_size - length);
441 status = write_archive_buffer ();
442 if (status != record_size)
443 archive_write_error (status);
444 }
445
446 /* There is nothing else to read, break out. */
447 break;
448 }
449
450 status = write_archive_buffer ();
451 if (status != record_size)
452 archive_write_error (status);
453 }
454
455 #if 0
456 close_archive ();
457 #endif
458
459 /* Propagate any failure of the grandchild back to the parent. */
460
461 while (waitpid (grandchild_pid, &wait_status, 0) == -1)
462 if (errno != EINTR)
463 {
464 waitpid_error (use_compress_program_option);
465 break;
466 }
467
468 if (WIFSIGNALED (wait_status))
469 {
470 kill (child_pid, WTERMSIG (wait_status));
471 exit_status = TAREXIT_FAILURE;
472 }
473 else if (WEXITSTATUS (wait_status) != 0)
474 exit_status = WEXITSTATUS (wait_status);
475
476 exit (exit_status);
477 }
478
479 /* Set ARCHIVE for uncompressing, then reading an archive. */
480 static void
481 child_open_for_uncompress (void)
482 {
483 int parent_pipe[2];
484 int child_pipe[2];
485 pid_t grandchild_pid;
486 int wait_status;
487
488 xpipe (parent_pipe);
489 child_pid = xfork ();
490
491 if (child_pid > 0)
492 {
493 /* The parent tar is still here! Just clean up. */
494
495 read_full_records_option = 1;
496 archive = parent_pipe[PREAD];
497 xclose (parent_pipe[PWRITE]);
498 return;
499 }
500
501 /* The newborn child tar is here! */
502
503 program_name = _("tar (child)");
504
505 xdup2 (parent_pipe[PWRITE], STDOUT_FILENO);
506 xclose (parent_pipe[PREAD]);
507
508 /* Check if we need a grandchild tar. This happens only if either:
509 a) we're reading stdin: to force unblocking;
510 b) the file is to be accessed by rmt: compressor doesn't know how;
511 c) the file is not a plain file. */
512
513 if (strcmp (archive_name_array[0], "-") != 0
514 && !_remdev (archive_name_array[0])
515 && is_regular_file (archive_name_array[0]))
516 {
517 /* We don't need a grandchild tar. Open the archive and lauch the
518 uncompressor. */
519
520 archive = open (archive_name_array[0], O_RDONLY | O_BINARY, MODE_RW);
521 if (archive < 0)
522 open_fatal (archive_name_array[0]);
523 xdup2 (archive, STDIN_FILENO);
524 execlp (use_compress_program_option, use_compress_program_option,
525 "-d", (char *) 0);
526 exec_fatal (use_compress_program_option);
527 }
528
529 /* We do need a grandchild tar. */
530
531 xpipe (child_pipe);
532 grandchild_pid = xfork ();
533
534 if (grandchild_pid == 0)
535 {
536 /* The newborn grandchild tar is here! Launch the uncompressor. */
537
538 program_name = _("tar (grandchild)");
539
540 xdup2 (child_pipe[PREAD], STDIN_FILENO);
541 xclose (child_pipe[PWRITE]);
542 execlp (use_compress_program_option, use_compress_program_option,
543 "-d", (char *) 0);
544 exec_fatal (use_compress_program_option);
545 }
546
547 /* The child tar is still here! */
548
549 /* Prepare for unblocking the data from the archive into the
550 uncompressor. */
551
552 xdup2 (child_pipe[PWRITE], STDOUT_FILENO);
553 xclose (child_pipe[PREAD]);
554
555 if (strcmp (archive_name_array[0], "-") == 0)
556 archive = STDIN_FILENO;
557 else
558 archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
559 MODE_RW, rsh_command_option);
560 if (archive < 0)
561 open_fatal (archive_name_array[0]);
562
563 /* Let's read the archive and pipe it into stdout. */
564
565 while (1)
566 {
567 char *cursor;
568 size_t maximum;
569 size_t count;
570 ssize_t status;
571
572 read_error_count = 0;
573
574 error_loop:
575 status = rmtread (archive, record_start->buffer, record_size);
576 if (status < 0)
577 {
578 archive_read_error ();
579 goto error_loop;
580 }
581 if (status == 0)
582 break;
583 cursor = record_start->buffer;
584 maximum = status;
585 while (maximum)
586 {
587 count = maximum < BLOCKSIZE ? maximum : BLOCKSIZE;
588 if (full_write (STDOUT_FILENO, cursor, count) != count)
589 write_error (use_compress_program_option);
590 cursor += count;
591 maximum -= count;
592 }
593 }
594
595 xclose (STDOUT_FILENO);
596 #if 0
597 close_archive ();
598 #endif
599
600 /* Propagate any failure of the grandchild back to the parent. */
601
602 while (waitpid (grandchild_pid, &wait_status, 0) == -1)
603 if (errno != EINTR)
604 {
605 waitpid_error (use_compress_program_option);
606 break;
607 }
608
609 if (WIFSIGNALED (wait_status))
610 {
611 kill (child_pid, WTERMSIG (wait_status));
612 exit_status = TAREXIT_FAILURE;
613 }
614 else if (WEXITSTATUS (wait_status) != 0)
615 exit_status = WEXITSTATUS (wait_status);
616
617 exit (exit_status);
618 }
619
620 #endif /* not MSDOS */
621
622 /* Check the LABEL block against the volume label, seen as a globbing
623 pattern. Return true if the pattern matches. In case of failure,
624 retry matching a volume sequence number before giving up in
625 multi-volume mode. */
626 static int
627 check_label_pattern (union block *label)
628 {
629 char *string;
630 int result;
631
632 if (! memchr (label->header.name, '\0', sizeof label->header.name))
633 return 0;
634
635 if (fnmatch (volume_label_option, label->header.name, 0) == 0)
636 return 1;
637
638 if (!multi_volume_option)
639 return 0;
640
641 string = xmalloc (strlen (volume_label_option)
642 + sizeof VOLUME_LABEL_APPEND + 1);
643 strcpy (string, volume_label_option);
644 strcat (string, VOLUME_LABEL_APPEND);
645 result = fnmatch (string, label->header.name, 0) == 0;
646 free (string);
647 return result;
648 }
649
650 /* Open an archive file. The argument specifies whether we are
651 reading or writing, or both. */
652 void
653 open_archive (enum access_mode wanted_access)
654 {
655 int backed_up_flag = 0;
656
657 if (index_file_name)
658 {
659 stdlis = fopen (index_file_name, "w");
660 if (! stdlis)
661 open_error (index_file_name);
662 }
663 else
664 stdlis = to_stdout_option ? stderr : stdout;
665
666 if (record_size == 0)
667 FATAL_ERROR ((0, 0, _("Invalid value for record_size")));
668
669 if (archive_names == 0)
670 FATAL_ERROR ((0, 0, _("No archive name given")));
671
672 current_file_name = 0;
673 current_link_name = 0;
674 save_name = 0;
675 real_s_name = 0;
676
677 if (multi_volume_option)
678 {
679 if (verify_option)
680 FATAL_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
681 record_start = valloc (record_size + (2 * BLOCKSIZE));
682 if (record_start)
683 record_start += 2;
684 }
685 else
686 record_start = valloc (record_size);
687 if (!record_start)
688 FATAL_ERROR ((0, 0, _("Cannot allocate memory for blocking factor %d"),
689 blocking_factor));
690
691 current_block = record_start;
692 record_end = record_start + blocking_factor;
693 /* When updating the archive, we start with reading. */
694 access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
695
696 if (use_compress_program_option)
697 {
698 if (multi_volume_option)
699 FATAL_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
700 if (verify_option)
701 FATAL_ERROR ((0, 0, _("Cannot verify compressed archives")));
702
703 switch (wanted_access)
704 {
705 case ACCESS_READ:
706 child_open_for_uncompress ();
707 break;
708
709 case ACCESS_WRITE:
710 child_open_for_compress ();
711 break;
712
713 case ACCESS_UPDATE:
714 FATAL_ERROR ((0, 0, _("Cannot update compressed archives")));
715 break;
716 }
717
718 if (wanted_access == ACCESS_WRITE
719 && strcmp (archive_name_array[0], "-") == 0)
720 stdlis = stderr;
721 }
722 else if (strcmp (archive_name_array[0], "-") == 0)
723 {
724 read_full_records_option = 1; /* could be a pipe, be safe */
725 if (verify_option)
726 FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive")));
727
728 switch (wanted_access)
729 {
730 case ACCESS_READ:
731 archive = STDIN_FILENO;
732 break;
733
734 case ACCESS_WRITE:
735 archive = STDOUT_FILENO;
736 stdlis = stderr;
737 break;
738
739 case ACCESS_UPDATE:
740 archive = STDIN_FILENO;
741 stdlis = stderr;
742 write_archive_to_stdout = 1;
743 break;
744 }
745 }
746 else if (verify_option)
747 archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
748 MODE_RW, rsh_command_option);
749 else
750 switch (wanted_access)
751 {
752 case ACCESS_READ:
753 archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
754 MODE_RW, rsh_command_option);
755 break;
756
757 case ACCESS_WRITE:
758 if (backup_option)
759 {
760 maybe_backup_file (archive_name_array[0], 1);
761 backed_up_flag = 1;
762 }
763 archive = rmtcreat (archive_name_array[0], MODE_RW,
764 rsh_command_option);
765 break;
766
767 case ACCESS_UPDATE:
768 archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY,
769 MODE_RW, rsh_command_option);
770 break;
771 }
772
773 if (archive < 0
774 || (! _isrmt (archive) && fstat (archive, &archive_stat) < 0))
775 {
776 int saved_errno = errno;
777
778 if (backed_up_flag)
779 undo_last_backup ();
780 errno = saved_errno;
781 open_fatal (archive_name_array[0]);
782 }
783
784 #if !MSDOS
785
786 /* Detect if outputting to "/dev/null". */
787 {
788 static char const dev_null[] = "/dev/null";
789 struct stat dev_null_stat;
790
791 dev_null_output =
792 (strcmp (archive_name_array[0], dev_null) == 0
793 || (! _isrmt (archive)
794 && S_ISCHR (archive_stat.st_mode)
795 && stat (dev_null, &dev_null_stat) == 0
796 && archive_stat.st_dev == dev_null_stat.st_dev
797 && archive_stat.st_ino == dev_null_stat.st_ino));
798 }
799
800 if (!_isrmt (archive) && S_ISREG (archive_stat.st_mode))
801 {
802 ar_dev = archive_stat.st_dev;
803 ar_ino = archive_stat.st_ino;
804 }
805 else
806 ar_dev = 0;
807
808 #endif /* not MSDOS */
809
810 #if MSDOS
811 setmode (archive, O_BINARY);
812 #endif
813
814 switch (wanted_access)
815 {
816 case ACCESS_UPDATE:
817 records_written = 0;
818 case ACCESS_READ:
819 records_read = 0;
820 record_end = record_start; /* set up for 1st record = # 0 */
821 find_next_block (); /* read it in, check for EOF */
822
823 if (volume_label_option)
824 {
825 union block *label = find_next_block ();
826
827 if (!label)
828 FATAL_ERROR ((0, 0, _("Archive not labeled to match %s"),
829 quote (volume_label_option)));
830 if (!check_label_pattern (label))
831 FATAL_ERROR ((0, 0, _("Volume %s does not match %s"),
832 quote_n (0, label->header.name),
833 quote_n (1, volume_label_option)));
834 }
835 break;
836
837 case ACCESS_WRITE:
838 records_written = 0;
839 if (volume_label_option)
840 {
841 memset (record_start, 0, BLOCKSIZE);
842 if (multi_volume_option)
843 sprintf (record_start->header.name, "%s Volume 1",
844 volume_label_option);
845 else
846 strcpy (record_start->header.name, volume_label_option);
847
848 assign_string (&current_file_name, record_start->header.name);
849 current_trailing_slash = strip_trailing_slashes (current_file_name);
850
851 record_start->header.typeflag = GNUTYPE_VOLHDR;
852 TIME_TO_CHARS (start_time, record_start->header.mtime);
853 finish_header (record_start, -1);
854 #if 0
855 current_block++;
856 #endif
857 }
858 break;
859 }
860 }
861
862 /* Perform a write to flush the buffer. */
863 void
864 flush_write (void)
865 {
866 int copy_back;
867 ssize_t status;
868
869 if (checkpoint_option && !(++checkpoint % 10))
870 WARN ((0, 0, _("Write checkpoint %d"), checkpoint));
871
872 if (tape_length_option && tape_length_option <= bytes_written)
873 {
874 errno = ENOSPC;
875 status = 0;
876 }
877 else if (dev_null_output)
878 status = record_size;
879 else
880 status = write_archive_buffer ();
881 if (status != record_size && !multi_volume_option)
882 archive_write_error (status);
883
884 if (status > 0)
885 {
886 records_written++;
887 bytes_written += status;
888 }
889
890 if (status == record_size)
891 {
892 if (multi_volume_option)
893 {
894 if (save_name)
895 {
896 assign_string (&real_s_name, safer_name_suffix (save_name, 0));
897 real_s_totsize = save_totsize;
898 real_s_sizeleft = save_sizeleft;
899 }
900 else
901 {
902 assign_string (&real_s_name, 0);
903 real_s_totsize = 0;
904 real_s_sizeleft = 0;
905 }
906 }
907 return;
908 }
909
910 /* We're multivol. Panic if we didn't get the right kind of response. */
911
912 /* ENXIO is for the UNIX PC. */
913 if (status < 0 && errno != ENOSPC && errno != EIO && errno != ENXIO)
914 archive_write_error (status);
915
916 /* If error indicates a short write, we just move to the next tape. */
917
918 if (!new_volume (ACCESS_WRITE))
919 return;
920
921 if (totals_option)
922 prev_written += bytes_written;
923 bytes_written = 0;
924
925 if (volume_label_option && real_s_name)
926 {
927 copy_back = 2;
928 record_start -= 2;
929 }
930 else if (volume_label_option || real_s_name)
931 {
932 copy_back = 1;
933 record_start--;
934 }
935 else
936 copy_back = 0;
937
938 if (volume_label_option)
939 {
940 memset (record_start, 0, BLOCKSIZE);
941 sprintf (record_start->header.name, "%s Volume %d",
942 volume_label_option, volno);
943 TIME_TO_CHARS (start_time, record_start->header.mtime);
944 record_start->header.typeflag = GNUTYPE_VOLHDR;
945 finish_header (record_start, -1);
946 }
947
948 if (real_s_name)
949 {
950 int tmp;
951
952 if (volume_label_option)
953 record_start++;
954
955 memset (record_start, 0, BLOCKSIZE);
956
957 /* FIXME: Michael P Urban writes: [a long name file] is being written
958 when a new volume rolls around [...] Looks like the wrong value is
959 being preserved in real_s_name, though. */
960
961 strcpy (record_start->header.name, real_s_name);
962 record_start->header.typeflag = GNUTYPE_MULTIVOL;
963 OFF_TO_CHARS (real_s_sizeleft, record_start->header.size);
964 OFF_TO_CHARS (real_s_totsize - real_s_sizeleft,
965 record_start->oldgnu_header.offset);
966 tmp = verbose_option;
967 verbose_option = 0;
968 finish_header (record_start, -1);
969 verbose_option = tmp;
970
971 if (volume_label_option)
972 record_start--;
973 }
974
975 status = write_archive_buffer ();
976 if (status != record_size)
977 archive_write_error (status);
978
979 bytes_written += status;
980
981 if (copy_back)
982 {
983 record_start += copy_back;
984 memcpy (current_block,
985 record_start + blocking_factor - copy_back,
986 copy_back * BLOCKSIZE);
987 current_block += copy_back;
988
989 if (real_s_sizeleft >= copy_back * BLOCKSIZE)
990 real_s_sizeleft -= copy_back * BLOCKSIZE;
991 else if ((real_s_sizeleft + BLOCKSIZE - 1) / BLOCKSIZE <= copy_back)
992 assign_string (&real_s_name, 0);
993 else
994 {
995 assign_string (&real_s_name, safer_name_suffix (save_name, 0));
996 real_s_sizeleft = save_sizeleft;
997 real_s_totsize = save_totsize;
998 }
999 copy_back = 0;
1000 }
1001 }
1002
1003 /* Handle write errors on the archive. Write errors are always fatal.
1004 Hitting the end of a volume does not cause a write error unless the
1005 write was the first record of the volume. */
1006 static void
1007 archive_write_error (ssize_t status)
1008 {
1009 /* It might be useful to know how much was written before the error
1010 occurred. */
1011 if (totals_option)
1012 {
1013 int e = errno;
1014 print_total_written ();
1015 errno = e;
1016 }
1017
1018 write_fatal_details (*archive_name_cursor, status, record_size);
1019 }
1020
1021 /* Handle read errors on the archive. If the read should be retried,
1022 return to the caller. */
1023 static void
1024 archive_read_error (void)
1025 {
1026 read_error (*archive_name_cursor);
1027
1028 if (record_start_block == 0)
1029 FATAL_ERROR ((0, 0, _("At beginning of tape, quitting now")));
1030
1031 /* Read error in mid archive. We retry up to READ_ERROR_MAX times and
1032 then give up on reading the archive. */
1033
1034 if (read_error_count++ > READ_ERROR_MAX)
1035 FATAL_ERROR ((0, 0, _("Too many errors, quitting")));
1036 return;
1037 }
1038
1039 static void
1040 short_read (ssize_t status)
1041 {
1042 size_t left; /* bytes left */
1043 char *more; /* pointer to next byte to read */
1044
1045 more = record_start->buffer + status;
1046 left = record_size - status;
1047
1048 while (left % BLOCKSIZE != 0
1049 || (left && status && read_full_records_option))
1050 {
1051 if (status)
1052 while ((status = rmtread (archive, more, left)) < 0)
1053 archive_read_error ();
1054
1055 if (status == 0)
1056 break;
1057
1058 if (! read_full_records_option)
1059 FATAL_ERROR ((0, 0, _("Unaligned block (%lu bytes) in archive"),
1060 (unsigned long) (record_size - left)));
1061
1062 /* User warned us about this. Fix up. */
1063
1064 left -= status;
1065 more += status;
1066 }
1067
1068 /* FIXME: for size=0, multi-volume support. On the first record, warn
1069 about the problem. */
1070
1071 if (!read_full_records_option && verbose_option
1072 && record_start_block == 0 && status > 0)
1073 WARN ((0, 0, _("Record size = %lu blocks"),
1074 (unsigned long) ((record_size - left) / BLOCKSIZE)));
1075
1076 record_end = record_start + (record_size - left) / BLOCKSIZE;
1077 records_read++;
1078 }
1079
1080 /* Perform a read to flush the buffer. */
1081 void
1082 flush_read (void)
1083 {
1084 ssize_t status; /* result from system call */
1085
1086 if (checkpoint_option && !(++checkpoint % 10))
1087 WARN ((0, 0, _("Read checkpoint %d"), checkpoint));
1088
1089 /* Clear the count of errors. This only applies to a single call to
1090 flush_read. */
1091
1092 read_error_count = 0; /* clear error count */
1093
1094 if (write_archive_to_stdout && record_start_block != 0)
1095 {
1096 archive = STDOUT_FILENO;
1097 status = write_archive_buffer ();
1098 archive = STDIN_FILENO;
1099 if (status != record_size)
1100 archive_write_error (status);
1101 }
1102 if (multi_volume_option)
1103 {
1104 if (save_name)
1105 {
1106 assign_string (&real_s_name, safer_name_suffix (save_name, 0));
1107 real_s_sizeleft = save_sizeleft;
1108 real_s_totsize = save_totsize;
1109 }
1110 else
1111 {
1112 assign_string (&real_s_name, 0);
1113 real_s_totsize = 0;
1114 real_s_sizeleft = 0;
1115 }
1116 }
1117
1118 error_loop:
1119 status = rmtread (archive, record_start->buffer, record_size);
1120 if (status == record_size)
1121 {
1122 records_read++;
1123 return;
1124 }
1125
1126 if ((status == 0
1127 || (status < 0 && errno == ENOSPC)
1128 || (status > 0 && !read_full_records_option))
1129 && multi_volume_option)
1130 {
1131 union block *cursor;
1132
1133 try_volume:
1134 switch (subcommand_option)
1135 {
1136 case APPEND_SUBCOMMAND:
1137 case CAT_SUBCOMMAND:
1138 case UPDATE_SUBCOMMAND:
1139 if (!new_volume (ACCESS_UPDATE))
1140 return;
1141 break;
1142
1143 default:
1144 if (!new_volume (ACCESS_READ))
1145 return;
1146 break;
1147 }
1148
1149 vol_error:
1150 status = rmtread (archive, record_start->buffer, record_size);
1151 if (status < 0)
1152 {
1153 archive_read_error ();
1154 goto vol_error;
1155 }
1156 if (status != record_size)
1157 short_read (status);
1158
1159 cursor = record_start;
1160
1161 if (cursor->header.typeflag == GNUTYPE_VOLHDR)
1162 {
1163 if (volume_label_option)
1164 {
1165 if (!check_label_pattern (cursor))
1166 {
1167 WARN ((0, 0, _("Volume %s does not match %s"),
1168 quote_n (0, cursor->header.name),
1169 quote_n (1, volume_label_option)));
1170 volno--;
1171 global_volno--;
1172 goto try_volume;
1173 }
1174 }
1175 if (verbose_option)
1176 fprintf (stdlis, _("Reading %s\n"), quote (cursor->header.name));
1177 cursor++;
1178 }
1179 else if (volume_label_option)
1180 WARN ((0, 0, _("WARNING: No volume header")));
1181
1182 if (real_s_name)
1183 {
1184 uintmax_t s1, s2;
1185 if (cursor->header.typeflag != GNUTYPE_MULTIVOL
1186 || strcmp (cursor->header.name, real_s_name))
1187 {
1188 WARN ((0, 0, _("%s is not continued on this volume"),
1189 quote (real_s_name)));
1190 volno--;
1191 global_volno--;
1192 goto try_volume;
1193 }
1194 s1 = UINTMAX_FROM_HEADER (cursor->header.size);
1195 s2 = UINTMAX_FROM_HEADER (cursor->oldgnu_header.offset);
1196 if (real_s_totsize != s1 + s2 || s1 + s2 < s2)
1197 {
1198 char totsizebuf[UINTMAX_STRSIZE_BOUND];
1199 char s1buf[UINTMAX_STRSIZE_BOUND];
1200 char s2buf[UINTMAX_STRSIZE_BOUND];
1201
1202 WARN ((0, 0, _("%s is the wrong size (%s != %s + %s)"),
1203 quote (cursor->header.name),
1204 STRINGIFY_BIGINT (save_totsize, totsizebuf),
1205 STRINGIFY_BIGINT (s1, s1buf),
1206 STRINGIFY_BIGINT (s2, s2buf)));
1207 volno--;
1208 global_volno--;
1209 goto try_volume;
1210 }
1211 if (real_s_totsize - real_s_sizeleft
1212 != OFF_FROM_HEADER (cursor->oldgnu_header.offset))
1213 {
1214 WARN ((0, 0, _("This volume is out of sequence")));
1215 volno--;
1216 global_volno--;
1217 goto try_volume;
1218 }
1219 cursor++;
1220 }
1221 current_block = cursor;
1222 records_read++;
1223 return;
1224 }
1225 else if (status < 0)
1226 {
1227 archive_read_error ();
1228 goto error_loop; /* try again */
1229 }
1230
1231 short_read (status);
1232 }
1233
1234 /* Flush the current buffer to/from the archive. */
1235 void
1236 flush_archive (void)
1237 {
1238 record_start_block += record_end - record_start;
1239 current_block = record_start;
1240 record_end = record_start + blocking_factor;
1241
1242 if (access_mode == ACCESS_READ && time_to_start_writing)
1243 {
1244 access_mode = ACCESS_WRITE;
1245 time_to_start_writing = 0;
1246
1247 if (file_to_switch_to >= 0)
1248 {
1249 if (rmtclose (archive) != 0)
1250 close_warn (*archive_name_cursor);
1251
1252 archive = file_to_switch_to;
1253 }
1254 else
1255 backspace_output ();
1256 }
1257
1258 switch (access_mode)
1259 {
1260 case ACCESS_READ:
1261 flush_read ();
1262 break;
1263
1264 case ACCESS_WRITE:
1265 flush_write ();
1266 break;
1267
1268 case ACCESS_UPDATE:
1269 abort ();
1270 }
1271 }
1272
1273 /* Backspace the archive descriptor by one record worth. If it's a
1274 tape, MTIOCTOP will work. If it's something else, try to seek on
1275 it. If we can't seek, we lose! */
1276 static void
1277 backspace_output (void)
1278 {
1279 #ifdef MTIOCTOP
1280 {
1281 struct mtop operation;
1282
1283 operation.mt_op = MTBSR;
1284 operation.mt_count = 1;
1285 if (rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
1286 return;
1287 if (errno == EIO && rmtioctl (archive, MTIOCTOP, (char *) &operation) >= 0)
1288 return;
1289 }
1290 #endif
1291
1292 {
1293 off_t position = rmtlseek (archive, (off_t) 0, SEEK_CUR);
1294
1295 /* Seek back to the beginning of this record and start writing there. */
1296
1297 position -= record_size;
1298 if (position < 0)
1299 position = 0;
1300 if (rmtlseek (archive, position, SEEK_SET) != position)
1301 {
1302 /* Lseek failed. Try a different method. */
1303
1304 WARN ((0, 0,
1305 _("Cannot backspace archive file; it may be unreadable without -i")));
1306
1307 /* Replace the first part of the record with NULs. */
1308
1309 if (record_start->buffer != output_start)
1310 memset (record_start->buffer, 0,
1311 output_start - record_start->buffer);
1312 }
1313 }
1314 }
1315
1316 /* Close the archive file. */
1317 void
1318 close_archive (void)
1319 {
1320 if (time_to_start_writing || access_mode == ACCESS_WRITE)
1321 flush_archive ();
1322
1323 #if !MSDOS
1324
1325 /* Manage to fully drain a pipe we might be reading, so to not break it on
1326 the producer after the EOF block. FIXME: one of these days, GNU tar
1327 might become clever enough to just stop working, once there is no more
1328 work to do, we might have to revise this area in such time. */
1329
1330 if (access_mode == ACCESS_READ
1331 && ! _isrmt (archive)
1332 && (S_ISFIFO (archive_stat.st_mode) || S_ISSOCK (archive_stat.st_mode)))
1333 while (rmtread (archive, record_start->buffer, record_size) > 0)
1334 continue;
1335 #endif
1336
1337 if (verify_option)
1338 verify_volume ();
1339
1340 if (rmtclose (archive) != 0)
1341 close_warn (*archive_name_cursor);
1342
1343 #if !MSDOS
1344
1345 if (child_pid)
1346 {
1347 int wait_status;
1348
1349 while (waitpid (child_pid, &wait_status, 0) == -1)
1350 if (errno != EINTR)
1351 {
1352 waitpid_error (use_compress_program_option);
1353 break;
1354 }
1355
1356 if (WIFSIGNALED (wait_status))
1357 ERROR ((0, 0, _("Child died with signal %d"),
1358 WTERMSIG (wait_status)));
1359 else if (WEXITSTATUS (wait_status) != 0)
1360 ERROR ((0, 0, _("Child returned status %d"),
1361 WEXITSTATUS (wait_status)));
1362 }
1363 #endif /* !MSDOS */
1364
1365 if (current_file_name)
1366 free (current_file_name);
1367 if (current_link_name)
1368 free (current_link_name);
1369 if (save_name)
1370 free (save_name);
1371 if (real_s_name)
1372 free (real_s_name);
1373 free (multi_volume_option ? record_start - 2 : record_start);
1374 }
1375
1376 /* Called to initialize the global volume number. */
1377 void
1378 init_volume_number (void)
1379 {
1380 FILE *file = fopen (volno_file_option, "r");
1381
1382 if (file)
1383 {
1384 if (fscanf (file, "%d", &global_volno) != 1
1385 || global_volno < 0)
1386 FATAL_ERROR ((0, 0, _("%s: contains invalid volume number"),
1387 quotearg_colon (volno_file_option)));
1388 if (ferror (file))
1389 read_error (volno_file_option);
1390 if (fclose (file) != 0)
1391 close_error (volno_file_option);
1392 }
1393 else if (errno != ENOENT)
1394 open_error (volno_file_option);
1395 }
1396
1397 /* Called to write out the closing global volume number. */
1398 void
1399 closeout_volume_number (void)
1400 {
1401 FILE *file = fopen (volno_file_option, "w");
1402
1403 if (file)
1404 {
1405 fprintf (file, "%d\n", global_volno);
1406 if (ferror (file))
1407 write_error (volno_file_option);
1408 if (fclose (file) != 0)
1409 close_error (volno_file_option);
1410 }
1411 else
1412 open_error (volno_file_option);
1413 }
1414
1415 /* We've hit the end of the old volume. Close it and open the next one.
1416 Return nonzero on success. */
1417 static int
1418 new_volume (enum access_mode access)
1419 {
1420 static FILE *read_file;
1421 static int looped;
1422
1423 if (!read_file && !info_script_option)
1424 /* FIXME: if fopen is used, it will never be closed. */
1425 read_file = archive == STDIN_FILENO ? fopen (TTY_NAME, "r") : stdin;
1426
1427 if (now_verifying)
1428 return 0;
1429 if (verify_option)
1430 verify_volume ();
1431
1432 if (rmtclose (archive) != 0)
1433 close_warn (*archive_name_cursor);
1434
1435 global_volno++;
1436 if (global_volno < 0)
1437 FATAL_ERROR ((0, 0, _("Volume number overflow")));
1438 volno++;
1439 archive_name_cursor++;
1440 if (archive_name_cursor == archive_name_array + archive_names)
1441 {
1442 archive_name_cursor = archive_name_array;
1443 looped = 1;
1444 }
1445
1446 tryagain:
1447 if (looped)
1448 {
1449 /* We have to prompt from now on. */
1450
1451 if (info_script_option)
1452 {
1453 if (volno_file_option)
1454 closeout_volume_number ();
1455 if (system (info_script_option) != 0)
1456 FATAL_ERROR ((0, 0, _("`%s' command failed"), info_script_option));
1457 }
1458 else
1459 while (1)
1460 {
1461 char input_buffer[80];
1462
1463 fputc ('\007', stderr);
1464 fprintf (stderr,
1465 _("Prepare volume #%d for %s and hit return: "),
1466 global_volno, quote (*archive_name_cursor));
1467 fflush (stderr);
1468
1469 if (fgets (input_buffer, sizeof input_buffer, read_file) == 0)
1470 {
1471 WARN ((0, 0, _("EOF where user reply was expected")));
1472
1473 if (subcommand_option != EXTRACT_SUBCOMMAND
1474 && subcommand_option != LIST_SUBCOMMAND
1475 && subcommand_option != DIFF_SUBCOMMAND)
1476 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1477
1478 fatal_exit ();
1479 }
1480 if (input_buffer[0] == '\n'
1481 || input_buffer[0] == 'y'
1482 || input_buffer[0] == 'Y')
1483 break;
1484
1485 switch (input_buffer[0])
1486 {
1487 case '?':
1488 {
1489 fprintf (stderr, _("\
1490 n [name] Give a new file name for the next (and subsequent) volume(s)\n\
1491 q Abort tar\n\
1492 ! Spawn a subshell\n\
1493 ? Print this list\n"));
1494 }
1495 break;
1496
1497 case 'q':
1498 /* Quit. */
1499
1500 WARN ((0, 0, _("No new volume; exiting.\n")));
1501
1502 if (subcommand_option != EXTRACT_SUBCOMMAND
1503 && subcommand_option != LIST_SUBCOMMAND
1504 && subcommand_option != DIFF_SUBCOMMAND)
1505 WARN ((0, 0, _("WARNING: Archive is incomplete")));
1506
1507 fatal_exit ();
1508
1509 case 'n':
1510 /* Get new file name. */
1511
1512 {
1513 char *name = &input_buffer[1];
1514 char *cursor;
1515
1516 while (*name == ' ' || *name == '\t')
1517 name++;
1518 cursor = name;
1519 while (*cursor && *cursor != '\n')
1520 cursor++;
1521 *cursor = '\0';
1522
1523 /* FIXME: the following allocation is never reclaimed. */
1524 *archive_name_cursor = xstrdup (name);
1525 }
1526 break;
1527
1528 case '!':
1529 #if MSDOS
1530 spawnl (P_WAIT, getenv ("COMSPEC"), "-", 0);
1531 #else /* not MSDOS */
1532 {
1533 pid_t child;
1534 const char *shell = getenv ("SHELL");
1535 if (! shell)
1536 shell = "/bin/sh";
1537 child = xfork ();
1538 if (child == 0)
1539 {
1540 execlp (shell, "-sh", "-i", 0);
1541 exec_fatal (shell);
1542 }
1543 else
1544 {
1545 int wait_status;
1546 while (waitpid (child, &wait_status, 0) == -1)
1547 if (errno != EINTR)
1548 {
1549 waitpid_error (shell);
1550 break;
1551 }
1552 }
1553 }
1554 #endif /* not MSDOS */
1555 break;
1556 }
1557 }
1558 }
1559
1560 if (strcmp (archive_name_cursor[0], "-") == 0)
1561 {
1562 read_full_records_option = true;
1563 archive = STDIN_FILENO;
1564 }
1565 else if (verify_option)
1566 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1567 rsh_command_option);
1568 else
1569 switch (access)
1570 {
1571 case ACCESS_READ:
1572 archive = rmtopen (*archive_name_cursor, O_RDONLY, MODE_RW,
1573 rsh_command_option);
1574 break;
1575
1576 case ACCESS_WRITE:
1577 if (backup_option)
1578 maybe_backup_file (*archive_name_cursor, 1);
1579 archive = rmtcreat (*archive_name_cursor, MODE_RW,
1580 rsh_command_option);
1581 break;
1582
1583 case ACCESS_UPDATE:
1584 archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
1585 rsh_command_option);
1586 break;
1587 }
1588
1589 if (archive < 0)
1590 {
1591 open_warn (*archive_name_cursor);
1592 if (!verify_option && access == ACCESS_WRITE && backup_option)
1593 undo_last_backup ();
1594 goto tryagain;
1595 }
1596
1597 #if MSDOS
1598 setmode (archive, O_BINARY);
1599 #endif
1600
1601 return 1;
1602 }
1603
This page took 0.099738 seconds and 5 git commands to generate.