]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - bin/pax/ar_io.c
contrib/tzdata: import tzdata 2024a
[FreeBSD/FreeBSD.git] / bin / pax / ar_io.c
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1992 Keith Muller.
5  * Copyright (c) 1992, 1993
6  *      The Regents of the University of California.  All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Keith Muller of the University of California, San Diego.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35
36 #include <sys/types.h>
37 #include <sys/ioctl.h>
38 #include <sys/mtio.h>
39 #include <sys/stat.h>
40 #include <sys/wait.h>
41 #include <err.h>
42 #include <errno.h>
43 #include <fcntl.h>
44 #include <signal.h>
45 #include <stdint.h>
46 #include <stdio.h>
47 #include <string.h>
48 #include <stdlib.h>
49 #include <unistd.h>
50 #include "pax.h"
51 #include "options.h"
52 #include "extern.h"
53
54 /*
55  * Routines which deal directly with the archive I/O device/file.
56  */
57
58 #define DMOD            0666            /* default mode of created archives */
59 #define EXT_MODE        O_RDONLY        /* open mode for list/extract */
60 #define AR_MODE         (O_WRONLY | O_CREAT | O_TRUNC)  /* mode for archive */
61 #define APP_MODE        O_RDWR          /* mode for append */
62
63 static char none[] = "<NONE>";          /* pseudo name for no file */
64 static char stdo[] = "<STDOUT>";        /* pseudo name for stdout */
65 static char stdn[] = "<STDIN>";         /* pseudo name for stdin */
66 static int arfd = -1;                   /* archive file descriptor */
67 static int artyp = ISREG;               /* archive type: file/FIFO/tape */
68 static int arvol = 1;                   /* archive volume number */
69 static int lstrval = -1;                /* return value from last i/o */
70 static int io_ok;                       /* i/o worked on volume after resync */
71 static int did_io;                      /* did i/o ever occur on volume? */
72 static int done;                        /* set via tty termination */
73 static struct stat arsb;                /* stat of archive device at open */
74 static int invld_rec;                   /* tape has out of spec record size */
75 static int wr_trail = 1;                /* trailer was rewritten in append */
76 static int can_unlnk = 0;               /* do we unlink null archives?  */
77 const char *arcname;                    /* printable name of archive */
78 const char *gzip_program;               /* name of gzip program */
79 static pid_t zpid = -1;                 /* pid of child process */
80
81 static int get_phys(void);
82 static void ar_start_gzip(int, const char *, int);
83
84 /*
85  * ar_open()
86  *      Opens the next archive volume. Determines the type of the device and
87  *      sets up block sizes as required by the archive device and the format.
88  *      Note: we may be called with name == NULL on the first open only.
89  * Return:
90  *      -1 on failure, 0 otherwise
91  */
92
93 int
94 ar_open(const char *name)
95 {
96         struct mtget mb;
97
98         if (arfd != -1)
99                 (void)close(arfd);
100         arfd = -1;
101         can_unlnk = did_io = io_ok = invld_rec = 0;
102         artyp = ISREG;
103         flcnt = 0;
104
105         /*
106          * open based on overall operation mode
107          */
108         switch (act) {
109         case LIST:
110         case EXTRACT:
111                 if (name == NULL) {
112                         arfd = STDIN_FILENO;
113                         arcname = stdn;
114                 } else if ((arfd = open(name, EXT_MODE, DMOD)) < 0)
115                         syswarn(0, errno, "Failed open to read on %s", name);
116                 if (arfd != -1 && gzip_program != NULL)
117                         ar_start_gzip(arfd, gzip_program, 0);
118                 break;
119         case ARCHIVE:
120                 if (name == NULL) {
121                         arfd = STDOUT_FILENO;
122                         arcname = stdo;
123                 } else if ((arfd = open(name, AR_MODE, DMOD)) < 0)
124                         syswarn(0, errno, "Failed open to write on %s", name);
125                 else
126                         can_unlnk = 1;
127                 if (arfd != -1 && gzip_program != NULL)
128                         ar_start_gzip(arfd, gzip_program, 1);
129                 break;
130         case APPND:
131                 if (name == NULL) {
132                         arfd = STDOUT_FILENO;
133                         arcname = stdo;
134                 } else if ((arfd = open(name, APP_MODE, DMOD)) < 0)
135                         syswarn(0, errno, "Failed open to read/write on %s",
136                                 name);
137                 break;
138         case COPY:
139                 /*
140                  * arfd not used in COPY mode
141                  */
142                 arcname = none;
143                 lstrval = 1;
144                 return(0);
145         }
146         if (arfd < 0)
147                 return(-1);
148
149         if (chdname != NULL)
150                 if (chdir(chdname) != 0) {
151                         syswarn(1, errno, "Failed chdir to %s", chdname);
152                         return(-1);
153                 }
154         /*
155          * set up is based on device type
156          */
157         if (fstat(arfd, &arsb) < 0) {
158                 syswarn(0, errno, "Failed stat on %s", arcname);
159                 (void)close(arfd);
160                 arfd = -1;
161                 can_unlnk = 0;
162                 return(-1);
163         }
164         if (S_ISDIR(arsb.st_mode)) {
165                 paxwarn(0, "Cannot write an archive on top of a directory %s",
166                     arcname);
167                 (void)close(arfd);
168                 arfd = -1;
169                 can_unlnk = 0;
170                 return(-1);
171         }
172
173         if (S_ISCHR(arsb.st_mode))
174                 artyp = ioctl(arfd, MTIOCGET, &mb) ? ISCHR : ISTAPE;
175         else if (S_ISBLK(arsb.st_mode))
176                 artyp = ISBLK;
177         else if ((lseek(arfd, (off_t)0L, SEEK_CUR) == -1) && (errno == ESPIPE))
178                 artyp = ISPIPE;
179         else
180                 artyp = ISREG;
181
182         /*
183          * make sure we beyond any doubt that we only can unlink regular files
184          * we created
185          */
186         if (artyp != ISREG)
187                 can_unlnk = 0;
188         /*
189          * if we are writing, we are done
190          */
191         if (act == ARCHIVE) {
192                 blksz = rdblksz = wrblksz;
193                 lstrval = 1;
194                 return(0);
195         }
196
197         /*
198          * set default blksz on read. APPNDs writes rdblksz on the last volume
199          * On all new archive volumes, we shift to wrblksz (if the user
200          * specified one, otherwise we will continue to use rdblksz). We
201          * must set blocksize based on what kind of device the archive is
202          * stored.
203          */
204         switch(artyp) {
205         case ISTAPE:
206                 /*
207                  * Tape drives come in at least two flavors. Those that support
208                  * variable sized records and those that have fixed sized
209                  * records. They must be treated differently. For tape drives
210                  * that support variable sized records, we must make large
211                  * reads to make sure we get the entire record, otherwise we
212                  * will just get the first part of the record (up to size we
213                  * asked). Tapes with fixed sized records may or may not return
214                  * multiple records in a single read. We really do not care
215                  * what the physical record size is UNLESS we are going to
216                  * append. (We will need the physical block size to rewrite
217                  * the trailer). Only when we are appending do we go to the
218                  * effort to figure out the true PHYSICAL record size.
219                  */
220                 blksz = rdblksz = MAXBLK;
221                 break;
222         case ISPIPE:
223         case ISBLK:
224         case ISCHR:
225                 /*
226                  * Blocksize is not a major issue with these devices (but must
227                  * be kept a multiple of 512). If the user specified a write
228                  * block size, we use that to read. Under append, we must
229                  * always keep blksz == rdblksz. Otherwise we go ahead and use
230                  * the device optimal blocksize as (and if) returned by stat
231                  * and if it is within pax specs.
232                  */
233                 if ((act == APPND) && wrblksz) {
234                         blksz = rdblksz = wrblksz;
235                         break;
236                 }
237
238                 if ((arsb.st_blksize > 0) && (arsb.st_blksize < MAXBLK) &&
239                     ((arsb.st_blksize % BLKMULT) == 0))
240                         rdblksz = arsb.st_blksize;
241                 else
242                         rdblksz = DEVBLK;
243                 /*
244                  * For performance go for large reads when we can without harm
245                  */
246                 if ((act == APPND) || (artyp == ISCHR))
247                         blksz = rdblksz;
248                 else
249                         blksz = MAXBLK;
250                 break;
251         case ISREG:
252                 /*
253                  * if the user specified wrblksz works, use it. Under appends
254                  * we must always keep blksz == rdblksz
255                  */
256                 if ((act == APPND) && wrblksz && ((arsb.st_size%wrblksz)==0)){
257                         blksz = rdblksz = wrblksz;
258                         break;
259                 }
260                 /*
261                  * See if we can find the blocking factor from the file size
262                  */
263                 for (rdblksz = MAXBLK; rdblksz > 0; rdblksz -= BLKMULT)
264                         if ((arsb.st_size % rdblksz) == 0)
265                                 break;
266                 /*
267                  * When we cannot find a match, we may have a flawed archive.
268                  */
269                 if (rdblksz <= 0)
270                         rdblksz = FILEBLK;
271                 /*
272                  * for performance go for large reads when we can
273                  */
274                 if (act == APPND)
275                         blksz = rdblksz;
276                 else
277                         blksz = MAXBLK;
278                 break;
279         default:
280                 /*
281                  * should never happen, worst case, slow...
282                  */
283                 blksz = rdblksz = BLKMULT;
284                 break;
285         }
286         lstrval = 1;
287         return(0);
288 }
289
290 /*
291  * ar_close()
292  *      closes archive device, increments volume number, and prints i/o summary
293  */
294 void
295 ar_close(void)
296 {
297         int status;
298
299         if (arfd < 0) {
300                 did_io = io_ok = flcnt = 0;
301                 return;
302         }
303
304         /*
305          * Close archive file. This may take a LONG while on tapes (we may be
306          * forced to wait for the rewind to complete) so tell the user what is
307          * going on (this avoids the user hitting control-c thinking pax is
308          * broken).
309          */
310         if (vflag && (artyp == ISTAPE)) {
311                 if (vfpart)
312                         (void)putc('\n', listf);
313                 (void)fprintf(listf,
314                         "%s: Waiting for tape drive close to complete...",
315                         argv0);
316                 (void)fflush(listf);
317         }
318
319         /*
320          * if nothing was written to the archive (and we created it), we remove
321          * it
322          */
323         if (can_unlnk && (fstat(arfd, &arsb) == 0) && (S_ISREG(arsb.st_mode)) &&
324             (arsb.st_size == 0)) {
325                 (void)unlink(arcname);
326                 can_unlnk = 0;
327         }
328
329         /*
330          * for a quick extract/list, pax frequently exits before the child
331          * process is done
332          */
333         if ((act == LIST || act == EXTRACT) && nflag && zpid > 0)
334                 kill(zpid, SIGINT);
335
336         (void)close(arfd);
337
338         /* Do not exit before child to ensure data integrity */
339         if (zpid > 0)
340                 waitpid(zpid, &status, 0);
341
342         if (vflag && (artyp == ISTAPE)) {
343                 (void)fputs("done.\n", listf);
344                 vfpart = 0;
345                 (void)fflush(listf);
346         }
347         arfd = -1;
348
349         if (!io_ok && !did_io) {
350                 flcnt = 0;
351                 return;
352         }
353         did_io = io_ok = 0;
354
355         /*
356          * The volume number is only increased when the last device has data
357          * and we have already determined the archive format.
358          */
359         if (frmt != NULL)
360                 ++arvol;
361
362         if (!vflag) {
363                 flcnt = 0;
364                 return;
365         }
366
367         /*
368          * Print out a summary of I/O for this archive volume.
369          */
370         if (vfpart) {
371                 (void)putc('\n', listf);
372                 vfpart = 0;
373         }
374
375         /*
376          * If we have not determined the format yet, we just say how many bytes
377          * we have skipped over looking for a header to id. There is no way we
378          * could have written anything yet.
379          */
380         if (frmt == NULL) {
381                 (void)fprintf(listf, "%s: unknown format, %ju bytes skipped.\n",
382                     argv0, (uintmax_t)rdcnt);
383                 (void)fflush(listf);
384                 flcnt = 0;
385                 return;
386         }
387
388         if (strcmp(NM_CPIO, argv0) == 0)
389                 (void)fprintf(listf, "%llu blocks\n",
390                     (unsigned long long)((rdcnt ? rdcnt : wrcnt) / 5120));
391         else if (strcmp(NM_TAR, argv0) != 0)
392                 (void)fprintf(listf,
393                     "%s: %s vol %d, %ju files, %ju bytes read, %ju bytes written.\n",
394                     argv0, frmt->name, arvol-1, (uintmax_t)flcnt,
395                     (uintmax_t)rdcnt, (uintmax_t)wrcnt);
396         (void)fflush(listf);
397         flcnt = 0;
398 }
399
400 /*
401  * ar_drain()
402  *      drain any archive format independent padding from an archive read
403  *      from a socket or a pipe. This is to prevent the process on the
404  *      other side of the pipe from getting a SIGPIPE (pax will stop
405  *      reading an archive once a format dependent trailer is detected).
406  */
407 void
408 ar_drain(void)
409 {
410         int res;
411         char drbuf[MAXBLK];
412
413         /*
414          * we only drain from a pipe/socket. Other devices can be closed
415          * without reading up to end of file. We sure hope that pipe is closed
416          * on the other side so we will get an EOF.
417          */
418         if ((artyp != ISPIPE) || (lstrval <= 0))
419                 return;
420
421         /*
422          * keep reading until pipe is drained
423          */
424         while ((res = read(arfd, drbuf, sizeof(drbuf))) > 0)
425                 ;
426         lstrval = res;
427 }
428
429 /*
430  * ar_set_wr()
431  *      Set up device right before switching from read to write in an append.
432  *      device dependent code (if required) to do this should be added here.
433  *      For all archive devices we are already positioned at the place we want
434  *      to start writing when this routine is called.
435  * Return:
436  *      0 if all ready to write, -1 otherwise
437  */
438
439 int
440 ar_set_wr(void)
441 {
442         off_t cpos;
443
444         /*
445          * we must make sure the trailer is rewritten on append, ar_next()
446          * will stop us if the archive containing the trailer was not written
447          */
448         wr_trail = 0;
449
450         /*
451          * Add any device dependent code as required here
452          */
453         if (artyp != ISREG)
454                 return(0);
455         /*
456          * Ok we have an archive in a regular file. If we were rewriting a
457          * file, we must get rid of all the stuff after the current offset
458          * (it was not written by pax).
459          */
460         if (((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0) ||
461             (ftruncate(arfd, cpos) < 0)) {
462                 syswarn(1, errno, "Unable to truncate archive file");
463                 return(-1);
464         }
465         return(0);
466 }
467
468 /*
469  * ar_app_ok()
470  *      check if the last volume in the archive allows appends. We cannot check
471  *      this until we are ready to write since there is no spec that says all
472  *      volumes in a single archive have to be of the same type...
473  * Return:
474  *      0 if we can append, -1 otherwise.
475  */
476
477 int
478 ar_app_ok(void)
479 {
480         if (artyp == ISPIPE) {
481                 paxwarn(1, "Cannot append to an archive obtained from a pipe.");
482                 return(-1);
483         }
484
485         if (!invld_rec)
486                 return(0);
487         paxwarn(1,"Cannot append, device record size %d does not support %s spec",
488                 rdblksz, argv0);
489         return(-1);
490 }
491
492 /*
493  * ar_read()
494  *      read up to a specified number of bytes from the archive into the
495  *      supplied buffer. When dealing with tapes we may not always be able to
496  *      read what we want.
497  * Return:
498  *      Number of bytes in buffer. 0 for end of file, -1 for a read error.
499  */
500
501 int
502 ar_read(char *buf, int cnt)
503 {
504         int res = 0;
505
506         /*
507          * if last i/o was in error, no more reads until reset or new volume
508          */
509         if (lstrval <= 0)
510                 return(lstrval);
511
512         /*
513          * how we read must be based on device type
514          */
515         switch (artyp) {
516         case ISTAPE:
517                 if ((res = read(arfd, buf, cnt)) > 0) {
518                         /*
519                          * CAUTION: tape systems may not always return the same
520                          * sized records so we leave blksz == MAXBLK. The
521                          * physical record size that a tape drive supports is
522                          * very hard to determine in a uniform and portable
523                          * manner.
524                          */
525                         io_ok = 1;
526                         if (res != rdblksz) {
527                                 /*
528                                  * Record size changed. If this happens on
529                                  * any record after the first, we probably have
530                                  * a tape drive which has a fixed record size
531                                  * (we are getting multiple records in a single
532                                  * read). Watch out for record blocking that
533                                  * violates pax spec (must be a multiple of
534                                  * BLKMULT).
535                                  */
536                                 rdblksz = res;
537                                 if (rdblksz % BLKMULT)
538                                         invld_rec = 1;
539                         }
540                         return(res);
541                 }
542                 break;
543         case ISREG:
544         case ISBLK:
545         case ISCHR:
546         case ISPIPE:
547         default:
548                 /*
549                  * Files are so easy to deal with. These other things cannot
550                  * be trusted at all. So when we are dealing with character
551                  * devices and pipes we just take what they have ready for us
552                  * and return. Trying to do anything else with them runs the
553                  * risk of failure.
554                  */
555                 if ((res = read(arfd, buf, cnt)) > 0) {
556                         io_ok = 1;
557                         return(res);
558                 }
559                 break;
560         }
561
562         /*
563          * We are in trouble at this point, something is broken...
564          */
565         lstrval = res;
566         if (res < 0)
567                 syswarn(1, errno, "Failed read on archive volume %d", arvol);
568         else
569                 paxwarn(0, "End of archive volume %d reached", arvol);
570         return(res);
571 }
572
573 /*
574  * ar_write()
575  *      Write a specified number of bytes in supplied buffer to the archive
576  *      device so it appears as a single "block". Deals with errors and tries
577  *      to recover when faced with short writes.
578  * Return:
579  *      Number of bytes written. 0 indicates end of volume reached and with no
580  *      flaws (as best that can be detected). A -1 indicates an unrecoverable
581  *      error in the archive occurred.
582  */
583
584 int
585 ar_write(char *buf, int bsz)
586 {
587         int res;
588         off_t cpos;
589
590         /*
591          * do not allow pax to create a "bad" archive. Once a write fails on
592          * an archive volume prevent further writes to it.
593          */
594         if (lstrval <= 0)
595                 return(lstrval);
596
597         if ((res = write(arfd, buf, bsz)) == bsz) {
598                 wr_trail = 1;
599                 io_ok = 1;
600                 return(bsz);
601         }
602         /*
603          * write broke, see what we can do with it. We try to send any partial
604          * writes that may violate pax spec to the next archive volume.
605          */
606         if (res < 0)
607                 lstrval = res;
608         else
609                 lstrval = 0;
610
611         switch (artyp) {
612         case ISREG:
613                 if ((res > 0) && (res % BLKMULT)) {
614                         /*
615                          * try to fix up partial writes which are not BLKMULT
616                          * in size by forcing the runt record to next archive
617                          * volume
618                          */
619                         if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0)
620                                 break;
621                         cpos -= (off_t)res;
622                         if (ftruncate(arfd, cpos) < 0)
623                                 break;
624                         res = lstrval = 0;
625                         break;
626                 }
627                 if (res >= 0)
628                         break;
629                 /*
630                  * if file is out of space, handle it like a return of 0
631                  */
632                 if ((errno == ENOSPC) || (errno == EFBIG) || (errno == EDQUOT))
633                         res = lstrval = 0;
634                 break;
635         case ISTAPE:
636         case ISCHR:
637         case ISBLK:
638                 if (res >= 0)
639                         break;
640                 if (errno == EACCES) {
641                         paxwarn(0, "Write failed, archive is write protected.");
642                         res = lstrval = 0;
643                         return(0);
644                 }
645                 /*
646                  * see if we reached the end of media, if so force a change to
647                  * the next volume
648                  */
649                 if ((errno == ENOSPC) || (errno == EIO) || (errno == ENXIO))
650                         res = lstrval = 0;
651                 break;
652         case ISPIPE:
653         default:
654                 /*
655                  * we cannot fix errors to these devices
656                  */
657                 break;
658         }
659
660         /*
661          * Better tell the user the bad news...
662          * if this is a block aligned archive format, we may have a bad archive
663          * if the format wants the header to start at a BLKMULT boundary. While
664          * we can deal with the mis-aligned data, it violates spec and other
665          * archive readers will likely fail. If the format is not block
666          * aligned, the user may be lucky (and the archive is ok).
667          */
668         if (res >= 0) {
669                 if (res > 0)
670                         wr_trail = 1;
671                 io_ok = 1;
672         }
673
674         /*
675          * If we were trying to rewrite the trailer and it didn't work, we
676          * must quit right away.
677          */
678         if (!wr_trail && (res <= 0)) {
679                 paxwarn(1,"Unable to append, trailer re-write failed. Quitting.");
680                 return(res);
681         }
682
683         if (res == 0)
684                 paxwarn(0, "End of archive volume %d reached", arvol);
685         else if (res < 0)
686                 syswarn(1, errno, "Failed write to archive volume: %d", arvol);
687         else if (!frmt->blkalgn || ((res % frmt->blkalgn) == 0))
688                 paxwarn(0,"WARNING: partial archive write. Archive MAY BE FLAWED");
689         else
690                 paxwarn(1,"WARNING: partial archive write. Archive IS FLAWED");
691         return(res);
692 }
693
694 /*
695  * ar_rdsync()
696  *      Try to move past a bad spot on a flawed archive as needed to continue
697  *      I/O. Clears error flags to allow I/O to continue.
698  * Return:
699  *      0 when ok to try i/o again, -1 otherwise.
700  */
701
702 int
703 ar_rdsync(void)
704 {
705         long fsbz;
706         off_t cpos;
707         off_t mpos;
708         struct mtop mb;
709
710         /*
711          * Fail resync attempts at user request (done) or if this is going to be
712          * an update/append to an existing archive. If last i/o hit media end,
713          * we need to go to the next volume not try a resync.
714          */
715         if ((done > 0) || (lstrval == 0))
716                 return(-1);
717
718         if ((act == APPND) || (act == ARCHIVE)) {
719                 paxwarn(1, "Cannot allow updates to an archive with flaws.");
720                 return(-1);
721         }
722         if (io_ok)
723                 did_io = 1;
724
725         switch(artyp) {
726         case ISTAPE:
727                 /*
728                  * if the last i/o was a successful data transfer, we assume
729                  * the fault is just a bad record on the tape that we are now
730                  * past. If we did not get any data since the last resync try
731                  * to move the tape forward one PHYSICAL record past any
732                  * damaged tape section. Some tape drives are stubborn and need
733                  * to be pushed.
734                  */
735                 if (io_ok) {
736                         io_ok = 0;
737                         lstrval = 1;
738                         break;
739                 }
740                 mb.mt_op = MTFSR;
741                 mb.mt_count = 1;
742                 if (ioctl(arfd, MTIOCTOP, &mb) < 0)
743                         break;
744                 lstrval = 1;
745                 break;
746         case ISREG:
747         case ISCHR:
748         case ISBLK:
749                 /*
750                  * try to step over the bad part of the device.
751                  */
752                 io_ok = 0;
753                 if (((fsbz = arsb.st_blksize) <= 0) || (artyp != ISREG))
754                         fsbz = BLKMULT;
755                 if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0)
756                         break;
757                 mpos = fsbz - (cpos % (off_t)fsbz);
758                 if (lseek(arfd, mpos, SEEK_CUR) < 0)
759                         break;
760                 lstrval = 1;
761                 break;
762         case ISPIPE:
763         default:
764                 /*
765                  * cannot recover on these archive device types
766                  */
767                 io_ok = 0;
768                 break;
769         }
770         if (lstrval <= 0) {
771                 paxwarn(1, "Unable to recover from an archive read failure.");
772                 return(-1);
773         }
774         paxwarn(0, "Attempting to recover from an archive read failure.");
775         return(0);
776 }
777
778 /*
779  * ar_fow()
780  *      Move the I/O position within the archive forward the specified number of
781  *      bytes as supported by the device. If we cannot move the requested
782  *      number of bytes, return the actual number of bytes moved in skipped.
783  * Return:
784  *      0 if moved the requested distance, -1 on complete failure, 1 on
785  *      partial move (the amount moved is in skipped)
786  */
787
788 int
789 ar_fow(off_t sksz, off_t *skipped)
790 {
791         off_t cpos;
792         off_t mpos;
793
794         *skipped = 0;
795         if (sksz <= 0)
796                 return(0);
797
798         /*
799          * we cannot move forward at EOF or error
800          */
801         if (lstrval <= 0)
802                 return(lstrval);
803
804         /*
805          * Safer to read forward on devices where it is hard to find the end of
806          * the media without reading to it. With tapes we cannot be sure of the
807          * number of physical blocks to skip (we do not know physical block
808          * size at this point), so we must only read forward on tapes!
809          */
810         if (artyp != ISREG)
811                 return(0);
812
813         /*
814          * figure out where we are in the archive
815          */
816         if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) >= 0) {
817                 /*
818                  * we can be asked to move farther than there are bytes in this
819                  * volume, if so, just go to file end and let normal buf_fill()
820                  * deal with the end of file (it will go to next volume by
821                  * itself)
822                  */
823                 if ((mpos = cpos + sksz) > arsb.st_size) {
824                         *skipped = arsb.st_size - cpos;
825                         mpos = arsb.st_size;
826                 } else
827                         *skipped = sksz;
828                 if (lseek(arfd, mpos, SEEK_SET) >= 0)
829                         return(0);
830         }
831         syswarn(1, errno, "Forward positioning operation on archive failed");
832         lstrval = -1;
833         return(-1);
834 }
835
836 /*
837  * ar_rev()
838  *      move the i/o position within the archive backwards the specified byte
839  *      count as supported by the device. With tapes drives we RESET rdblksz to
840  *      the PHYSICAL blocksize.
841  *      NOTE: We should only be called to move backwards so we can rewrite the
842  *      last records (the trailer) of an archive (APPEND).
843  * Return:
844  *      0 if moved the requested distance, -1 on complete failure
845  */
846
847 int
848 ar_rev(off_t sksz)
849 {
850         off_t cpos;
851         struct mtop mb;
852         int phyblk;
853
854         /*
855          * make sure we do not have try to reverse on a flawed archive
856          */
857         if (lstrval < 0)
858                 return(lstrval);
859
860         switch(artyp) {
861         case ISPIPE:
862                 if (sksz <= 0)
863                         break;
864                 /*
865                  * cannot go backwards on these critters
866                  */
867                 paxwarn(1, "Reverse positioning on pipes is not supported.");
868                 lstrval = -1;
869                 return(-1);
870         case ISREG:
871         case ISBLK:
872         case ISCHR:
873         default:
874                 if (sksz <= 0)
875                         break;
876
877                 /*
878                  * For things other than files, backwards movement has a very
879                  * high probability of failure as we really do not know the
880                  * true attributes of the device we are talking to (the device
881                  * may not even have the ability to lseek() in any direction).
882                  * First we figure out where we are in the archive.
883                  */
884                 if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0) {
885                         syswarn(1, errno,
886                            "Unable to obtain current archive byte offset");
887                         lstrval = -1;
888                         return(-1);
889                 }
890
891                 /*
892                  * we may try to go backwards past the start when the archive
893                  * is only a single record. If this happens and we are on a
894                  * multi volume archive, we need to go to the end of the
895                  * previous volume and continue our movement backwards from
896                  * there.
897                  */
898                 if ((cpos -= sksz) < (off_t)0L) {
899                         if (arvol > 1) {
900                                 /*
901                                  * this should never happen
902                                  */
903                                 paxwarn(1,"Reverse position on previous volume.");
904                                 lstrval = -1;
905                                 return(-1);
906                         }
907                         cpos = (off_t)0L;
908                 }
909                 if (lseek(arfd, cpos, SEEK_SET) < 0) {
910                         syswarn(1, errno, "Unable to seek archive backwards");
911                         lstrval = -1;
912                         return(-1);
913                 }
914                 break;
915         case ISTAPE:
916                 /*
917                  * Calculate and move the proper number of PHYSICAL tape
918                  * blocks. If the sksz is not an even multiple of the physical
919                  * tape size, we cannot do the move (this should never happen).
920                  * (We also cannot handle trailers spread over two vols).
921                  * get_phys() also makes sure we are in front of the filemark.
922                  */
923                 if ((phyblk = get_phys()) <= 0) {
924                         lstrval = -1;
925                         return(-1);
926                 }
927
928                 /*
929                  * make sure future tape reads only go by physical tape block
930                  * size (set rdblksz to the real size).
931                  */
932                 rdblksz = phyblk;
933
934                 /*
935                  * if no movement is required, just return (we must be after
936                  * get_phys() so the physical blocksize is properly set)
937                  */
938                 if (sksz <= 0)
939                         break;
940
941                 /*
942                  * ok we have to move. Make sure the tape drive can do it.
943                  */
944                 if (sksz % phyblk) {
945                         paxwarn(1,
946                             "Tape drive unable to backspace requested amount");
947                         lstrval = -1;
948                         return(-1);
949                 }
950
951                 /*
952                  * move backwards the requested number of bytes
953                  */
954                 mb.mt_op = MTBSR;
955                 mb.mt_count = sksz/phyblk;
956                 if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
957                         syswarn(1,errno, "Unable to backspace tape %d blocks.",
958                             mb.mt_count);
959                         lstrval = -1;
960                         return(-1);
961                 }
962                 break;
963         }
964         lstrval = 1;
965         return(0);
966 }
967
968 /*
969  * get_phys()
970  *      Determine the physical block size on a tape drive. We need the physical
971  *      block size so we know how many bytes we skip over when we move with
972  *      mtio commands. We also make sure we are BEFORE THE TAPE FILEMARK when
973  *      return.
974  *      This is one really SLOW routine...
975  * Return:
976  *      physical block size if ok (ok > 0), -1 otherwise
977  */
978
979 static int
980 get_phys(void)
981 {
982         int padsz = 0;
983         int res;
984         int phyblk;
985         struct mtop mb;
986         char scbuf[MAXBLK];
987
988         /*
989          * move to the file mark, and then back up one record and read it.
990          * this should tell us the physical record size the tape is using.
991          */
992         if (lstrval == 1) {
993                 /*
994                  * we know we are at file mark when we get back a 0 from
995                  * read()
996                  */
997                 while ((res = read(arfd, scbuf, sizeof(scbuf))) > 0)
998                         padsz += res;
999                 if (res < 0) {
1000                         syswarn(1, errno, "Unable to locate tape filemark.");
1001                         return(-1);
1002                 }
1003         }
1004
1005         /*
1006          * move backwards over the file mark so we are at the end of the
1007          * last record.
1008          */
1009         mb.mt_op = MTBSF;
1010         mb.mt_count = 1;
1011         if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
1012                 syswarn(1, errno, "Unable to backspace over tape filemark.");
1013                 return(-1);
1014         }
1015
1016         /*
1017          * move backwards so we are in front of the last record and read it to
1018          * get physical tape blocksize.
1019          */
1020         mb.mt_op = MTBSR;
1021         mb.mt_count = 1;
1022         if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
1023                 syswarn(1, errno, "Unable to backspace over last tape block.");
1024                 return(-1);
1025         }
1026         if ((phyblk = read(arfd, scbuf, sizeof(scbuf))) <= 0) {
1027                 syswarn(1, errno, "Cannot determine archive tape blocksize.");
1028                 return(-1);
1029         }
1030
1031         /*
1032          * read forward to the file mark, then back up in front of the filemark
1033          * (this is a bit paranoid, but should be safe to do).
1034          */
1035         while ((res = read(arfd, scbuf, sizeof(scbuf))) > 0)
1036                 ;
1037         if (res < 0) {
1038                 syswarn(1, errno, "Unable to locate tape filemark.");
1039                 return(-1);
1040         }
1041         mb.mt_op = MTBSF;
1042         mb.mt_count = 1;
1043         if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
1044                 syswarn(1, errno, "Unable to backspace over tape filemark.");
1045                 return(-1);
1046         }
1047
1048         /*
1049          * set lstrval so we know that the filemark has not been seen
1050          */
1051         lstrval = 1;
1052
1053         /*
1054          * return if there was no padding
1055          */
1056         if (padsz == 0)
1057                 return(phyblk);
1058
1059         /*
1060          * make sure we can move backwards over the padding. (this should
1061          * never fail).
1062          */
1063         if (padsz % phyblk) {
1064                 paxwarn(1, "Tape drive unable to backspace requested amount");
1065                 return(-1);
1066         }
1067
1068         /*
1069          * move backwards over the padding so the head is where it was when
1070          * we were first called (if required).
1071          */
1072         mb.mt_op = MTBSR;
1073         mb.mt_count = padsz/phyblk;
1074         if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
1075                 syswarn(1,errno,"Unable to backspace tape over %d pad blocks",
1076                     mb.mt_count);
1077                 return(-1);
1078         }
1079         return(phyblk);
1080 }
1081
1082 /*
1083  * ar_next()
1084  *      prompts the user for the next volume in this archive. For some devices
1085  *      we may allow the media to be changed. Otherwise a new archive is
1086  *      prompted for. By pax spec, if there is no controlling tty or an eof is
1087  *      read on tty input, we must quit pax.
1088  * Return:
1089  *      0 when ready to continue, -1 when all done
1090  */
1091
1092 int
1093 ar_next(void)
1094 {
1095         static char *arcbuf;
1096         char buf[PAXPATHLEN+2];
1097         sigset_t o_mask;
1098
1099         /*
1100          * WE MUST CLOSE THE DEVICE. A lot of devices must see last close, (so
1101          * things like writing EOF etc will be done) (Watch out ar_close() can
1102          * also be called via a signal handler, so we must prevent a race.
1103          */
1104         if (sigprocmask(SIG_BLOCK, &s_mask, &o_mask) < 0)
1105                 syswarn(0, errno, "Unable to set signal mask");
1106         ar_close();
1107         if (sigprocmask(SIG_SETMASK, &o_mask, NULL) < 0)
1108                 syswarn(0, errno, "Unable to restore signal mask");
1109
1110         if (done || !wr_trail || Oflag || strcmp(NM_TAR, argv0) == 0)
1111                 return(-1);
1112
1113         tty_prnt("\nATTENTION! %s archive volume change required.\n", argv0);
1114
1115         /*
1116          * if i/o is on stdin or stdout, we cannot reopen it (we do not know
1117          * the name), the user will be forced to type it in.
1118          */
1119         if (strcmp(arcname, stdo) && strcmp(arcname, stdn) && (artyp != ISREG)
1120             && (artyp != ISPIPE)) {
1121                 if (artyp == ISTAPE) {
1122                         tty_prnt("%s ready for archive tape volume: %d\n",
1123                                 arcname, arvol);
1124                         tty_prnt("Load the NEXT TAPE on the tape drive");
1125                 } else {
1126                         tty_prnt("%s ready for archive volume: %d\n",
1127                                 arcname, arvol);
1128                         tty_prnt("Load the NEXT STORAGE MEDIA (if required)");
1129                 }
1130
1131                 if ((act == ARCHIVE) || (act == APPND))
1132                         tty_prnt(" and make sure it is WRITE ENABLED.\n");
1133                 else
1134                         tty_prnt("\n");
1135
1136                 for(;;) {
1137                         tty_prnt("Type \"y\" to continue, \".\" to quit %s,",
1138                                 argv0);
1139                         tty_prnt(" or \"s\" to switch to new device.\nIf you");
1140                         tty_prnt(" cannot change storage media, type \"s\"\n");
1141                         tty_prnt("Is the device ready and online? > ");
1142
1143                         if ((tty_read(buf,sizeof(buf))<0) || !strcmp(buf,".")){
1144                                 done = 1;
1145                                 lstrval = -1;
1146                                 tty_prnt("Quitting %s!\n", argv0);
1147                                 vfpart = 0;
1148                                 return(-1);
1149                         }
1150
1151                         if ((buf[0] == '\0') || (buf[1] != '\0')) {
1152                                 tty_prnt("%s unknown command, try again\n",buf);
1153                                 continue;
1154                         }
1155
1156                         switch (buf[0]) {
1157                         case 'y':
1158                         case 'Y':
1159                                 /*
1160                                  * we are to continue with the same device
1161                                  */
1162                                 if (ar_open(arcname) >= 0)
1163                                         return(0);
1164                                 tty_prnt("Cannot re-open %s, try again\n",
1165                                         arcname);
1166                                 continue;
1167                         case 's':
1168                         case 'S':
1169                                 /*
1170                                  * user wants to open a different device
1171                                  */
1172                                 tty_prnt("Switching to a different archive\n");
1173                                 break;
1174                         default:
1175                                 tty_prnt("%s unknown command, try again\n",buf);
1176                                 continue;
1177                         }
1178                         break;
1179                 }
1180         } else
1181                 tty_prnt("Ready for archive volume: %d\n", arvol);
1182
1183         /*
1184          * have to go to a different archive
1185          */
1186         for (;;) {
1187                 tty_prnt("Input archive name or \".\" to quit %s.\n", argv0);
1188                 tty_prnt("Archive name > ");
1189
1190                 if ((tty_read(buf, sizeof(buf)) < 0) || !strcmp(buf, ".")) {
1191                         done = 1;
1192                         lstrval = -1;
1193                         tty_prnt("Quitting %s!\n", argv0);
1194                         vfpart = 0;
1195                         return(-1);
1196                 }
1197                 if (buf[0] == '\0') {
1198                         tty_prnt("Empty file name, try again\n");
1199                         continue;
1200                 }
1201                 if (!strcmp(buf, "..")) {
1202                         tty_prnt("Illegal file name: .. try again\n");
1203                         continue;
1204                 }
1205                 if (strlen(buf) > PAXPATHLEN) {
1206                         tty_prnt("File name too long, try again\n");
1207                         continue;
1208                 }
1209
1210                 /*
1211                  * try to open new archive
1212                  */
1213                 if (ar_open(buf) >= 0) {
1214                         free(arcbuf);
1215                         if ((arcbuf = strdup(buf)) == NULL) {
1216                                 done = 1;
1217                                 lstrval = -1;
1218                                 paxwarn(0, "Cannot save archive name.");
1219                                 return(-1);
1220                         }
1221                         arcname = arcbuf;
1222                         break;
1223                 }
1224                 tty_prnt("Cannot open %s, try again\n", buf);
1225                 continue;
1226         }
1227         return(0);
1228 }
1229
1230 /*
1231  * ar_start_gzip()
1232  * starts the gzip compression/decompression process as a child, using magic
1233  * to keep the fd the same in the calling function (parent).
1234  */
1235 void
1236 ar_start_gzip(int fd, const char *gzip_prog, int wr)
1237 {
1238         int fds[2];
1239         const char *gzip_flags;
1240
1241         if (pipe(fds) < 0)
1242                 err(1, "could not pipe");
1243         zpid = fork();
1244         if (zpid < 0)
1245                 err(1, "could not fork");
1246
1247         /* parent */
1248         if (zpid) {
1249                 if (wr)
1250                         dup2(fds[1], fd);
1251                 else
1252                         dup2(fds[0], fd);
1253                 close(fds[0]);
1254                 close(fds[1]);
1255         } else {
1256                 if (wr) {
1257                         dup2(fds[0], STDIN_FILENO);
1258                         dup2(fd, STDOUT_FILENO);
1259                         gzip_flags = "-c";
1260                 } else {
1261                         dup2(fds[1], STDOUT_FILENO);
1262                         dup2(fd, STDIN_FILENO);
1263                         gzip_flags = "-dc";
1264                 }
1265                 close(fds[0]);
1266                 close(fds[1]);
1267                 if (execlp(gzip_prog, gzip_prog, gzip_flags,
1268                     (char *)NULL) < 0)
1269                         err(1, "could not exec");
1270                 /* NOTREACHED */
1271         }
1272 }