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