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