Home | History | Annotate | Line # | Download | only in pax
ar_io.c revision 1.39.2.1
      1  1.39.2.1      tron /*	$NetBSD: ar_io.c,v 1.39.2.1 2004/06/22 07:29:43 tron Exp $	*/
      2       1.4       cgd 
      3       1.1       jtc /*-
      4      1.38       agc  * Copyright (c) 1992 Keith Muller.
      5       1.1       jtc  * Copyright (c) 1992, 1993
      6       1.1       jtc  *	The Regents of the University of California.  All rights reserved.
      7       1.1       jtc  *
      8       1.1       jtc  * This code is derived from software contributed to Berkeley by
      9       1.1       jtc  * Keith Muller of the University of California, San Diego.
     10       1.1       jtc  *
     11       1.1       jtc  * Redistribution and use in source and binary forms, with or without
     12       1.1       jtc  * modification, are permitted provided that the following conditions
     13       1.1       jtc  * are met:
     14       1.1       jtc  * 1. Redistributions of source code must retain the above copyright
     15       1.1       jtc  *    notice, this list of conditions and the following disclaimer.
     16       1.1       jtc  * 2. Redistributions in binary form must reproduce the above copyright
     17       1.1       jtc  *    notice, this list of conditions and the following disclaimer in the
     18       1.1       jtc  *    documentation and/or other materials provided with the distribution.
     19      1.36       agc  * 3. Neither the name of the University nor the names of its contributors
     20      1.36       agc  *    may be used to endorse or promote products derived from this software
     21      1.36       agc  *    without specific prior written permission.
     22      1.36       agc  *
     23      1.36       agc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24      1.36       agc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25      1.36       agc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26      1.36       agc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27      1.36       agc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28      1.36       agc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29      1.36       agc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30      1.36       agc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31      1.36       agc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32      1.36       agc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33      1.36       agc  * SUCH DAMAGE.
     34      1.36       agc  */
     35      1.36       agc 
     36      1.39     lukem #if HAVE_NBTOOL_CONFIG_H
     37      1.39     lukem #include "nbtool_config.h"
     38      1.39     lukem #endif
     39      1.39     lukem 
     40       1.7  christos #include <sys/cdefs.h>
     41      1.39     lukem #if !defined(lint)
     42       1.4       cgd #if 0
     43       1.4       cgd static char sccsid[] = "@(#)ar_io.c	8.2 (Berkeley) 4/18/94";
     44       1.4       cgd #else
     45  1.39.2.1      tron __RCSID("$NetBSD: ar_io.c,v 1.39.2.1 2004/06/22 07:29:43 tron Exp $");
     46       1.4       cgd #endif
     47       1.1       jtc #endif /* not lint */
     48       1.1       jtc 
     49       1.1       jtc #include <sys/types.h>
     50       1.1       jtc #include <sys/time.h>
     51       1.1       jtc #include <sys/stat.h>
     52       1.1       jtc #include <sys/ioctl.h>
     53       1.1       jtc #include <sys/mtio.h>
     54       1.1       jtc #include <sys/param.h>
     55      1.23  christos #include <sys/wait.h>
     56       1.1       jtc #include <signal.h>
     57       1.1       jtc #include <string.h>
     58       1.1       jtc #include <fcntl.h>
     59       1.1       jtc #include <unistd.h>
     60       1.1       jtc #include <stdio.h>
     61       1.1       jtc #include <ctype.h>
     62       1.1       jtc #include <errno.h>
     63       1.1       jtc #include <stdlib.h>
     64      1.25   thorpej #ifdef SUPPORT_RMT
     65      1.23  christos #define __RMTLIB_PRIVATE
     66      1.23  christos #include <rmt.h>
     67      1.25   thorpej #endif /* SUPPORT_RMT */
     68       1.1       jtc #include "pax.h"
     69      1.23  christos #include "options.h"
     70       1.1       jtc #include "extern.h"
     71       1.1       jtc 
     72       1.1       jtc /*
     73       1.1       jtc  * Routines which deal directly with the archive I/O device/file.
     74       1.1       jtc  */
     75       1.1       jtc 
     76       1.1       jtc #define DMOD		0666		/* default mode of created archives */
     77       1.1       jtc #define EXT_MODE	O_RDONLY	/* open mode for list/extract */
     78       1.1       jtc #define AR_MODE		(O_WRONLY | O_CREAT | O_TRUNC)	/* mode for archive */
     79       1.1       jtc #define APP_MODE	O_RDWR		/* mode for append */
     80      1.17     itohy #define STDO		"<STDOUT>"	/* pseudo name for stdout */
     81      1.17     itohy #define STDN		"<STDIN>"	/* pseudo name for stdin */
     82       1.1       jtc static int arfd = -1;			/* archive file descriptor */
     83       1.1       jtc static int artyp = ISREG;		/* archive type: file/FIFO/tape */
     84       1.1       jtc static int arvol = 1;			/* archive volume number */
     85       1.1       jtc static int lstrval = -1;		/* return value from last i/o */
     86       1.1       jtc static int io_ok;			/* i/o worked on volume after resync */
     87       1.1       jtc static int did_io;			/* did i/o ever occur on volume? */
     88       1.1       jtc static int done;			/* set via tty termination */
     89       1.1       jtc static struct stat arsb;		/* stat of archive device at open */
     90       1.1       jtc static int invld_rec;			/* tape has out of spec record size */
     91       1.1       jtc static int wr_trail = 1;		/* trailer was rewritten in append */
     92       1.1       jtc static int can_unlnk = 0;		/* do we unlink null archives?  */
     93      1.17     itohy const char *arcname;			/* printable name of archive */
     94       1.9   mycroft const char *gzip_program;		/* name of gzip program */
     95      1.23  christos static pid_t zpid = -1;			/* pid of child process */
     96      1.13  christos time_t starttime;			/* time the run started */
     97      1.18   thorpej int force_one_volume;			/* 1 if we ignore volume changes */
     98       1.1       jtc 
     99      1.20     lukem static int get_phys(void);
    100       1.1       jtc extern sigset_t s_mask;
    101      1.23  christos static void ar_start_gzip(int, const char *, int);
    102      1.20     lukem static const char *timefmt(char *, size_t, off_t, time_t);
    103      1.20     lukem static const char *sizefmt(char *, size_t, off_t);
    104      1.24   thorpej 
    105      1.24   thorpej #ifdef SUPPORT_RMT
    106      1.23  christos #ifdef SYS_NO_RESTART
    107      1.23  christos static int rmtread_with_restart(int, void *, int);
    108      1.23  christos static int rmtwrite_with_restart(int, void *, int);
    109      1.23  christos #else
    110      1.23  christos #define rmtread_with_restart(a, b, c) rmtread((a), (b), (c))
    111      1.23  christos #define rmtwrite_with_restart(a, b, c) rmtwrite((a), (b), (c))
    112      1.23  christos #endif
    113      1.24   thorpej #endif /* SUPPORT_RMT */
    114       1.1       jtc 
    115       1.1       jtc /*
    116       1.1       jtc  * ar_open()
    117       1.1       jtc  *	Opens the next archive volume. Determines the type of the device and
    118       1.1       jtc  *	sets up block sizes as required by the archive device and the format.
    119       1.1       jtc  *	Note: we may be called with name == NULL on the first open only.
    120       1.1       jtc  * Return:
    121       1.1       jtc  *	-1 on failure, 0 otherwise
    122       1.1       jtc  */
    123       1.1       jtc 
    124       1.1       jtc int
    125       1.9   mycroft ar_open(const char *name)
    126       1.1       jtc {
    127      1.17     itohy 	struct mtget mb;
    128       1.8       mrg 
    129       1.1       jtc 	if (arfd != -1)
    130       1.1       jtc 		(void)close(arfd);
    131       1.1       jtc 	arfd = -1;
    132       1.1       jtc 	can_unlnk = did_io = io_ok = invld_rec = 0;
    133       1.1       jtc 	artyp = ISREG;
    134       1.1       jtc 	flcnt = 0;
    135       1.1       jtc 
    136      1.24   thorpej #ifdef SUPPORT_RMT
    137      1.26  christos 	if (name && strchr(name, ':') != NULL && !forcelocal) {
    138      1.23  christos 		artyp = ISRMT;
    139      1.23  christos 		if ((arfd = rmtopen(name, O_RDWR, DMOD)) == -1) {
    140      1.23  christos 			syswarn(0, errno, "Failed open on %s", name);
    141      1.23  christos 			return -1;
    142      1.23  christos 		}
    143      1.23  christos 		blksz = rdblksz = 8192;
    144      1.23  christos 		lstrval = 1;
    145      1.23  christos 		return 0;
    146      1.23  christos 	}
    147      1.24   thorpej #endif /* SUPPORT_RMT */
    148      1.23  christos 
    149       1.1       jtc 	/*
    150       1.1       jtc 	 * open based on overall operation mode
    151       1.1       jtc 	 */
    152       1.1       jtc 	switch (act) {
    153       1.1       jtc 	case LIST:
    154       1.1       jtc 	case EXTRACT:
    155       1.1       jtc 		if (name == NULL) {
    156       1.1       jtc 			arfd = STDIN_FILENO;
    157       1.1       jtc 			arcname = STDN;
    158       1.1       jtc 		} else if ((arfd = open(name, EXT_MODE, DMOD)) < 0)
    159       1.1       jtc 			syswarn(0, errno, "Failed open to read on %s", name);
    160      1.23  christos 		if (arfd != -1 && gzip_program != NULL)
    161      1.23  christos 			ar_start_gzip(arfd, gzip_program, 0);
    162       1.1       jtc 		break;
    163       1.1       jtc 	case ARCHIVE:
    164       1.1       jtc 		if (name == NULL) {
    165       1.1       jtc 			arfd = STDOUT_FILENO;
    166       1.1       jtc 			arcname = STDO;
    167       1.1       jtc 		} else if ((arfd = open(name, AR_MODE, DMOD)) < 0)
    168       1.1       jtc 			syswarn(0, errno, "Failed open to write on %s", name);
    169       1.1       jtc 		else
    170       1.1       jtc 			can_unlnk = 1;
    171      1.23  christos 		if (arfd != -1 && gzip_program != NULL)
    172      1.23  christos 			ar_start_gzip(arfd, gzip_program, 1);
    173       1.1       jtc 		break;
    174       1.1       jtc 	case APPND:
    175       1.1       jtc 		if (name == NULL) {
    176       1.1       jtc 			arfd = STDOUT_FILENO;
    177       1.1       jtc 			arcname = STDO;
    178       1.1       jtc 		} else if ((arfd = open(name, APP_MODE, DMOD)) < 0)
    179       1.1       jtc 			syswarn(0, errno, "Failed open to read/write on %s",
    180       1.1       jtc 				name);
    181       1.1       jtc 		break;
    182       1.1       jtc 	case COPY:
    183       1.1       jtc 		/*
    184       1.1       jtc 		 * arfd not used in COPY mode
    185       1.1       jtc 		 */
    186       1.1       jtc 		arcname = "<NONE>";
    187       1.1       jtc 		lstrval = 1;
    188       1.1       jtc 		return(0);
    189       1.1       jtc 	}
    190       1.1       jtc 	if (arfd < 0)
    191       1.1       jtc 		return(-1);
    192       1.1       jtc 
    193      1.23  christos 	if (chdname != NULL)
    194      1.23  christos 		if (chdir(chdname) != 0)
    195      1.23  christos 			syswarn(1, errno, "Failed chdir to %s", chdname);
    196       1.1       jtc 	/*
    197       1.1       jtc 	 * set up is based on device type
    198       1.1       jtc 	 */
    199       1.1       jtc 	if (fstat(arfd, &arsb) < 0) {
    200       1.1       jtc 		syswarn(0, errno, "Failed stat on %s", arcname);
    201       1.1       jtc 		(void)close(arfd);
    202       1.1       jtc 		arfd = -1;
    203       1.1       jtc 		can_unlnk = 0;
    204       1.1       jtc 		return(-1);
    205       1.1       jtc 	}
    206       1.1       jtc 	if (S_ISDIR(arsb.st_mode)) {
    207       1.7  christos 		tty_warn(0, "Cannot write an archive on top of a directory %s",
    208       1.1       jtc 		    arcname);
    209       1.1       jtc 		(void)close(arfd);
    210       1.1       jtc 		arfd = -1;
    211       1.1       jtc 		can_unlnk = 0;
    212       1.1       jtc 		return(-1);
    213       1.1       jtc 	}
    214       1.1       jtc 
    215       1.1       jtc 	if (S_ISCHR(arsb.st_mode))
    216       1.1       jtc 		artyp = ioctl(arfd, MTIOCGET, &mb) ? ISCHR : ISTAPE;
    217       1.1       jtc 	else if (S_ISBLK(arsb.st_mode))
    218       1.1       jtc 		artyp = ISBLK;
    219       1.1       jtc 	else if ((lseek(arfd, (off_t)0L, SEEK_CUR) == -1) && (errno == ESPIPE))
    220       1.1       jtc 		artyp = ISPIPE;
    221       1.1       jtc 	else
    222       1.1       jtc 		artyp = ISREG;
    223      1.29  christos 
    224      1.29  christos 	/*
    225      1.29  christos 	 * Special handling for empty files.
    226      1.29  christos 	 */
    227      1.29  christos 	if (artyp == ISREG && arsb.st_size == 0) {
    228      1.29  christos 		switch (act) {
    229      1.29  christos 		case LIST:
    230      1.29  christos 		case EXTRACT:
    231      1.29  christos 			return -1;
    232      1.29  christos 		case APPND:
    233      1.30  christos 			act = -ARCHIVE;
    234      1.29  christos 			return -1;
    235      1.29  christos 		case ARCHIVE:
    236      1.29  christos 			break;
    237      1.29  christos 		}
    238      1.29  christos 	}
    239       1.1       jtc 
    240       1.1       jtc 	/*
    241       1.1       jtc 	 * make sure we beyond any doubt that we only can unlink regular files
    242       1.1       jtc 	 * we created
    243       1.1       jtc 	 */
    244       1.1       jtc 	if (artyp != ISREG)
    245       1.1       jtc 		can_unlnk = 0;
    246      1.14        is 
    247      1.14        is 	/*
    248       1.1       jtc 	 * if we are writing, we are done
    249       1.1       jtc 	 */
    250       1.1       jtc 	if (act == ARCHIVE) {
    251       1.1       jtc 		blksz = rdblksz = wrblksz;
    252       1.1       jtc 		lstrval = 1;
    253       1.1       jtc 		return(0);
    254       1.8       mrg 	}
    255       1.8       mrg 
    256       1.8       mrg 	/*
    257       1.1       jtc 	 * set default blksz on read. APPNDs writes rdblksz on the last volume
    258       1.1       jtc 	 * On all new archive volumes, we shift to wrblksz (if the user
    259       1.1       jtc 	 * specified one, otherwize we will continue to use rdblksz). We
    260      1.31       wiz 	 * must set blocksize based on what kind of device the archive is
    261       1.1       jtc 	 * stored.
    262       1.1       jtc 	 */
    263       1.1       jtc 	switch(artyp) {
    264       1.1       jtc 	case ISTAPE:
    265       1.1       jtc 		/*
    266       1.1       jtc 		 * Tape drives come in at least two flavors. Those that support
    267       1.1       jtc 		 * variable sized records and those that have fixed sized
    268       1.1       jtc 		 * records. They must be treated differently. For tape drives
    269       1.1       jtc 		 * that support variable sized records, we must make large
    270       1.1       jtc 		 * reads to make sure we get the entire record, otherwise we
    271       1.1       jtc 		 * will just get the first part of the record (up to size we
    272       1.1       jtc 		 * asked). Tapes with fixed sized records may or may not return
    273       1.1       jtc 		 * multiple records in a single read. We really do not care
    274       1.1       jtc 		 * what the physical record size is UNLESS we are going to
    275       1.1       jtc 		 * append. (We will need the physical block size to rewrite
    276       1.1       jtc 		 * the trailer). Only when we are appending do we go to the
    277       1.1       jtc 		 * effort to figure out the true PHYSICAL record size.
    278       1.1       jtc 		 */
    279       1.1       jtc 		blksz = rdblksz = MAXBLK;
    280       1.1       jtc 		break;
    281       1.1       jtc 	case ISPIPE:
    282       1.1       jtc 	case ISBLK:
    283       1.1       jtc 	case ISCHR:
    284       1.1       jtc 		/*
    285       1.1       jtc 		 * Blocksize is not a major issue with these devices (but must
    286       1.1       jtc 		 * be kept a multiple of 512). If the user specified a write
    287       1.1       jtc 		 * block size, we use that to read. Under append, we must
    288       1.1       jtc 		 * always keep blksz == rdblksz. Otherwise we go ahead and use
    289       1.1       jtc 		 * the device optimal blocksize as (and if) returned by stat
    290       1.1       jtc 		 * and if it is within pax specs.
    291       1.1       jtc 		 */
    292       1.1       jtc 		if ((act == APPND) && wrblksz) {
    293       1.1       jtc 			blksz = rdblksz = wrblksz;
    294       1.1       jtc 			break;
    295       1.1       jtc 		}
    296       1.1       jtc 
    297       1.1       jtc 		if ((arsb.st_blksize > 0) && (arsb.st_blksize < MAXBLK) &&
    298       1.1       jtc 		    ((arsb.st_blksize % BLKMULT) == 0))
    299       1.1       jtc 			rdblksz = arsb.st_blksize;
    300       1.1       jtc 		else
    301       1.1       jtc 			rdblksz = DEVBLK;
    302       1.1       jtc 		/*
    303       1.1       jtc 		 * For performance go for large reads when we can without harm
    304       1.1       jtc 		 */
    305       1.1       jtc 		if ((act == APPND) || (artyp == ISCHR))
    306       1.1       jtc 			blksz = rdblksz;
    307       1.1       jtc 		else
    308       1.1       jtc 			blksz = MAXBLK;
    309       1.1       jtc 		break;
    310       1.1       jtc 	case ISREG:
    311       1.1       jtc 		/*
    312       1.1       jtc 		 * if the user specified wrblksz works, use it. Under appends
    313       1.1       jtc 		 * we must always keep blksz == rdblksz
    314       1.1       jtc 		 */
    315       1.1       jtc 		if ((act == APPND) && wrblksz && ((arsb.st_size%wrblksz)==0)){
    316       1.1       jtc 			blksz = rdblksz = wrblksz;
    317       1.1       jtc 			break;
    318       1.1       jtc 		}
    319       1.1       jtc 		/*
    320       1.1       jtc 		 * See if we can find the blocking factor from the file size
    321       1.1       jtc 		 */
    322       1.1       jtc 		for (rdblksz = MAXBLK; rdblksz > 0; rdblksz -= BLKMULT)
    323       1.1       jtc 			if ((arsb.st_size % rdblksz) == 0)
    324       1.1       jtc 				break;
    325       1.1       jtc 		/*
    326      1.17     itohy 		 * When we cannot find a match, we may have a flawed archive.
    327       1.1       jtc 		 */
    328       1.1       jtc 		if (rdblksz <= 0)
    329       1.1       jtc 			rdblksz = FILEBLK;
    330       1.1       jtc 		/*
    331       1.1       jtc 		 * for performance go for large reads when we can
    332       1.1       jtc 		 */
    333       1.1       jtc 		if (act == APPND)
    334       1.1       jtc 			blksz = rdblksz;
    335       1.1       jtc 		else
    336       1.1       jtc 			blksz = MAXBLK;
    337       1.1       jtc 		break;
    338       1.1       jtc 	default:
    339       1.1       jtc 		/*
    340      1.31       wiz 		 * should never happen, worst case, slow...
    341       1.1       jtc 		 */
    342       1.1       jtc 		blksz = rdblksz = BLKMULT;
    343       1.1       jtc 		break;
    344       1.1       jtc 	}
    345       1.1       jtc 	lstrval = 1;
    346       1.1       jtc 	return(0);
    347       1.1       jtc }
    348       1.1       jtc 
    349       1.1       jtc /*
    350       1.1       jtc  * ar_close()
    351       1.1       jtc  *	closes archive device, increments volume number, and prints i/o summary
    352       1.1       jtc  */
    353       1.1       jtc void
    354       1.1       jtc ar_close(void)
    355       1.1       jtc {
    356      1.37     grant 	int status;
    357      1.37     grant 
    358       1.1       jtc 	if (arfd < 0) {
    359       1.1       jtc 		did_io = io_ok = flcnt = 0;
    360       1.1       jtc 		return;
    361       1.1       jtc 	}
    362       1.1       jtc 
    363       1.1       jtc 
    364       1.1       jtc 	/*
    365       1.1       jtc 	 * Close archive file. This may take a LONG while on tapes (we may be
    366       1.1       jtc 	 * forced to wait for the rewind to complete) so tell the user what is
    367       1.1       jtc 	 * going on (this avoids the user hitting control-c thinking pax is
    368       1.1       jtc 	 * broken).
    369       1.1       jtc 	 */
    370       1.1       jtc 	if (vflag && (artyp == ISTAPE)) {
    371       1.1       jtc 		if (vfpart)
    372      1.23  christos 			(void)putc('\n', listf);
    373      1.23  christos 		(void)fprintf(listf,
    374       1.1       jtc 			"%s: Waiting for tape drive close to complete...",
    375       1.1       jtc 			argv0);
    376      1.23  christos 		(void)fflush(listf);
    377       1.1       jtc 	}
    378       1.1       jtc 
    379       1.1       jtc 	/*
    380       1.1       jtc 	 * if nothing was written to the archive (and we created it), we remove
    381       1.1       jtc 	 * it
    382       1.1       jtc 	 */
    383       1.1       jtc 	if (can_unlnk && (fstat(arfd, &arsb) == 0) && (S_ISREG(arsb.st_mode)) &&
    384       1.1       jtc 	    (arsb.st_size == 0)) {
    385       1.1       jtc 		(void)unlink(arcname);
    386       1.1       jtc 		can_unlnk = 0;
    387       1.1       jtc 	}
    388       1.1       jtc 
    389      1.23  christos 	/*
    390      1.23  christos 	 * for a quick extract/list, pax frequently exits before the child
    391      1.23  christos 	 * process is done
    392      1.23  christos 	 */
    393      1.37     grant 	if ((act == LIST || act == EXTRACT) && nflag && zpid > 0)
    394      1.23  christos 		kill(zpid, SIGINT);
    395      1.23  christos 
    396      1.24   thorpej #ifdef SUPPORT_RMT
    397      1.23  christos 	if (artyp == ISRMT)
    398      1.23  christos 		(void)rmtclose(arfd);
    399      1.23  christos 	else
    400      1.24   thorpej #endif /* SUPPORT_RMT */
    401      1.23  christos 		(void)close(arfd);
    402      1.37     grant 
    403      1.37     grant 	/* Do not exit before child to ensure data integrity */
    404      1.37     grant 	if (zpid > 0)
    405      1.37     grant 		waitpid(zpid, &status, 0);
    406       1.1       jtc 
    407       1.1       jtc 	if (vflag && (artyp == ISTAPE)) {
    408      1.23  christos 		(void)fputs("done.\n", listf);
    409       1.1       jtc 		vfpart = 0;
    410      1.23  christos 		(void)fflush(listf);
    411       1.1       jtc 	}
    412       1.1       jtc 	arfd = -1;
    413       1.1       jtc 
    414       1.1       jtc 	if (!io_ok && !did_io) {
    415       1.1       jtc 		flcnt = 0;
    416       1.1       jtc 		return;
    417       1.1       jtc 	}
    418       1.1       jtc 	did_io = io_ok = 0;
    419       1.1       jtc 
    420       1.1       jtc 	/*
    421       1.1       jtc 	 * The volume number is only increased when the last device has data
    422       1.1       jtc 	 * and we have already determined the archive format.
    423       1.1       jtc 	 */
    424       1.1       jtc 	if (frmt != NULL)
    425       1.1       jtc 		++arvol;
    426       1.1       jtc 
    427       1.1       jtc 	if (!vflag) {
    428       1.1       jtc 		flcnt = 0;
    429       1.1       jtc 		return;
    430       1.1       jtc 	}
    431       1.1       jtc 
    432       1.1       jtc 	/*
    433       1.1       jtc 	 * Print out a summary of I/O for this archive volume.
    434       1.1       jtc 	 */
    435       1.1       jtc 	if (vfpart) {
    436      1.23  christos 		(void)putc('\n', listf);
    437       1.1       jtc 		vfpart = 0;
    438       1.1       jtc 	}
    439      1.23  christos 	/*
    440      1.23  christos 	 * If we have not determined the format yet, we just say how many bytes
    441      1.23  christos 	 * we have skipped over looking for a header to id. there is no way we
    442      1.23  christos 	 * could have written anything yet.
    443      1.23  christos 	 */
    444      1.23  christos 	if (frmt == NULL) {
    445      1.23  christos 		(void)fprintf(listf, "%s: unknown format, " OFFT_F
    446      1.23  christos 		    " bytes skipped.\n", argv0, rdcnt);
    447      1.23  christos 		(void)fflush(listf);
    448      1.23  christos 		flcnt = 0;
    449      1.23  christos 		return;
    450      1.23  christos 	}
    451      1.23  christos 
    452      1.23  christos 	if (strcmp(NM_CPIO, argv0) == 0) {
    453      1.23  christos 		(void)fprintf(listf, OFFT_F " blocks\n",
    454      1.23  christos 		    (rdcnt ? rdcnt : wrcnt) / 5120);
    455      1.23  christos 	}
    456       1.1       jtc 
    457      1.13  christos 	ar_summary(0);
    458       1.1       jtc 
    459      1.23  christos 	(void)fflush(listf);
    460       1.1       jtc 	flcnt = 0;
    461       1.1       jtc }
    462       1.1       jtc 
    463       1.1       jtc /*
    464       1.1       jtc  * ar_drain()
    465       1.1       jtc  *	drain any archive format independent padding from an archive read
    466       1.1       jtc  *	from a socket or a pipe. This is to prevent the process on the
    467       1.1       jtc  *	other side of the pipe from getting a SIGPIPE (pax will stop
    468       1.1       jtc  *	reading an archive once a format dependent trailer is detected).
    469       1.1       jtc  */
    470       1.1       jtc void
    471       1.1       jtc ar_drain(void)
    472       1.1       jtc {
    473       1.6       tls 	int res;
    474       1.1       jtc 	char drbuf[MAXBLK];
    475       1.1       jtc 
    476       1.1       jtc 	/*
    477       1.1       jtc 	 * we only drain from a pipe/socket. Other devices can be closed
    478       1.1       jtc 	 * without reading up to end of file. We sure hope that pipe is closed
    479       1.1       jtc 	 * on the other side so we will get an EOF.
    480       1.1       jtc 	 */
    481       1.1       jtc 	if ((artyp != ISPIPE) || (lstrval <= 0))
    482       1.1       jtc 		return;
    483       1.1       jtc 
    484       1.1       jtc 	/*
    485       1.1       jtc 	 * keep reading until pipe is drained
    486       1.1       jtc 	 */
    487      1.24   thorpej #ifdef SUPPORT_RMT
    488      1.23  christos 	if (artyp == ISRMT) {
    489      1.24   thorpej 		while ((res = rmtread_with_restart(arfd,
    490      1.24   thorpej 						   drbuf, sizeof(drbuf))) > 0)
    491      1.23  christos 			continue;
    492      1.23  christos 	} else {
    493      1.24   thorpej #endif /* SUPPORT_RMT */
    494      1.24   thorpej 		while ((res = read_with_restart(arfd,
    495      1.24   thorpej 						drbuf, sizeof(drbuf))) > 0)
    496      1.23  christos 			continue;
    497      1.24   thorpej #ifdef SUPPORT_RMT
    498      1.23  christos 	}
    499      1.24   thorpej #endif /* SUPPORT_RMT */
    500       1.1       jtc 	lstrval = res;
    501       1.1       jtc }
    502       1.1       jtc 
    503       1.1       jtc /*
    504       1.1       jtc  * ar_set_wr()
    505       1.1       jtc  *	Set up device right before switching from read to write in an append.
    506       1.1       jtc  *	device dependent code (if required) to do this should be added here.
    507       1.1       jtc  *	For all archive devices we are already positioned at the place we want
    508       1.1       jtc  *	to start writing when this routine is called.
    509       1.1       jtc  * Return:
    510       1.1       jtc  *	0 if all ready to write, -1 otherwise
    511       1.1       jtc  */
    512       1.1       jtc 
    513       1.1       jtc int
    514       1.1       jtc ar_set_wr(void)
    515       1.1       jtc {
    516       1.1       jtc 	off_t cpos;
    517       1.1       jtc 
    518       1.1       jtc 	/*
    519       1.1       jtc 	 * we must make sure the trailer is rewritten on append, ar_next()
    520       1.1       jtc 	 * will stop us if the archive containing the trailer was not written
    521       1.1       jtc 	 */
    522       1.1       jtc 	wr_trail = 0;
    523      1.17     itohy 
    524      1.17     itohy 	/*
    525       1.1       jtc 	 * Add any device dependent code as required here
    526       1.1       jtc 	 */
    527       1.1       jtc 	if (artyp != ISREG)
    528       1.1       jtc 		return(0);
    529       1.1       jtc 	/*
    530       1.1       jtc 	 * Ok we have an archive in a regular file. If we were rewriting a
    531       1.1       jtc 	 * file, we must get rid of all the stuff after the current offset
    532       1.1       jtc 	 * (it was not written by pax).
    533       1.1       jtc 	 */
    534       1.1       jtc 	if (((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0) ||
    535       1.1       jtc 	    (ftruncate(arfd, cpos) < 0)) {
    536       1.1       jtc 		syswarn(1, errno, "Unable to truncate archive file");
    537       1.1       jtc 		return(-1);
    538       1.1       jtc 	}
    539       1.1       jtc 	return(0);
    540       1.1       jtc }
    541       1.1       jtc 
    542       1.1       jtc /*
    543       1.1       jtc  * ar_app_ok()
    544       1.1       jtc  *	check if the last volume in the archive allows appends. We cannot check
    545      1.17     itohy  *	this until we are ready to write since there is no spec that says all
    546       1.1       jtc  *	volumes in a single archive have to be of the same type...
    547       1.1       jtc  * Return:
    548       1.1       jtc  *	0 if we can append, -1 otherwise.
    549       1.1       jtc  */
    550       1.1       jtc 
    551       1.1       jtc int
    552       1.1       jtc ar_app_ok(void)
    553       1.1       jtc {
    554       1.1       jtc 	if (artyp == ISPIPE) {
    555       1.7  christos 		tty_warn(1,
    556       1.7  christos 		    "Cannot append to an archive obtained from a pipe.");
    557       1.1       jtc 		return(-1);
    558       1.1       jtc 	}
    559       1.1       jtc 
    560       1.1       jtc 	if (!invld_rec)
    561       1.1       jtc 		return(0);
    562       1.7  christos 	tty_warn(1,
    563       1.7  christos 	    "Cannot append, device record size %d does not support %s spec",
    564       1.7  christos 	    rdblksz, argv0);
    565       1.1       jtc 	return(-1);
    566       1.1       jtc }
    567       1.1       jtc 
    568      1.15     itohy #ifdef SYS_NO_RESTART
    569      1.15     itohy /*
    570      1.15     itohy  * read_with_restart()
    571      1.15     itohy  *	Equivalent to read() but does retry on signals.
    572      1.15     itohy  *	This function is not needed on 4.2BSD and later.
    573      1.15     itohy  * Return:
    574      1.15     itohy  *	Number of bytes written.  -1 indicates an error.
    575      1.15     itohy  */
    576      1.15     itohy 
    577      1.15     itohy int
    578      1.15     itohy read_with_restart(int fd, void *buf, int bsz)
    579      1.15     itohy {
    580      1.15     itohy 	int r;
    581      1.15     itohy 
    582      1.15     itohy 	while (((r = read(fd, buf, bsz)) < 0) && errno == EINTR)
    583      1.23  christos 		continue;
    584      1.23  christos 
    585      1.23  christos 	return(r);
    586      1.23  christos }
    587      1.23  christos 
    588      1.23  christos /*
    589      1.23  christos  * rmtread_with_restart()
    590      1.23  christos  *	Equivalent to rmtread() but does retry on signals.
    591      1.23  christos  *	This function is not needed on 4.2BSD and later.
    592      1.23  christos  * Return:
    593      1.23  christos  *	Number of bytes written.  -1 indicates an error.
    594      1.23  christos  */
    595      1.23  christos static int
    596      1.23  christos rmtread_with_restart(int fd, void *buf, int bsz)
    597      1.23  christos {
    598      1.23  christos 	int r;
    599      1.23  christos 
    600      1.23  christos 	while (((r = rmtread(fd, buf, bsz)) < 0) && errno == EINTR)
    601      1.23  christos 		continue;
    602      1.15     itohy 
    603      1.15     itohy 	return(r);
    604      1.15     itohy }
    605      1.15     itohy #endif
    606      1.15     itohy 
    607      1.15     itohy /*
    608      1.15     itohy  * xread()
    609      1.15     itohy  *	Equivalent to read() but does retry on partial read, which may occur
    610      1.15     itohy  *	on signals.
    611      1.15     itohy  * Return:
    612      1.15     itohy  *	Number of bytes read.  0 for end of file, -1 for an error.
    613      1.15     itohy  */
    614      1.15     itohy 
    615      1.15     itohy int
    616      1.15     itohy xread(int fd, void *buf, int bsz)
    617      1.15     itohy {
    618      1.15     itohy 	char *b = buf;
    619      1.15     itohy 	int nread = 0;
    620      1.15     itohy 	int r;
    621      1.15     itohy 
    622      1.15     itohy 	do {
    623      1.24   thorpej #ifdef SUPPORT_RMT
    624      1.23  christos 		if ((r = rmtread_with_restart(fd, b, bsz)) <= 0)
    625      1.15     itohy 			break;
    626      1.24   thorpej #else
    627      1.24   thorpej 		if ((r = read_with_restart(fd, b, bsz)) <= 0)
    628      1.24   thorpej 			break;
    629      1.24   thorpej #endif /* SUPPORT_RMT */
    630      1.15     itohy 		b += r;
    631      1.15     itohy 		bsz -= r;
    632      1.15     itohy 		nread += r;
    633      1.15     itohy 	} while (bsz > 0);
    634      1.15     itohy 
    635      1.15     itohy 	return(nread ? nread : r);
    636      1.15     itohy }
    637      1.15     itohy 
    638      1.15     itohy #ifdef SYS_NO_RESTART
    639      1.15     itohy /*
    640      1.15     itohy  * write_with_restart()
    641      1.15     itohy  *	Equivalent to write() but does retry on signals.
    642      1.15     itohy  *	This function is not needed on 4.2BSD and later.
    643      1.15     itohy  * Return:
    644      1.15     itohy  *	Number of bytes written.  -1 indicates an error.
    645      1.15     itohy  */
    646      1.15     itohy 
    647      1.15     itohy int
    648      1.15     itohy write_with_restart(int fd, void *buf, int bsz)
    649      1.15     itohy {
    650      1.15     itohy 	int r;
    651      1.15     itohy 
    652      1.15     itohy 	while (((r = write(fd, buf, bsz)) < 0) && errno == EINTR)
    653      1.15     itohy 		;
    654      1.15     itohy 
    655      1.15     itohy 	return(r);
    656      1.15     itohy }
    657      1.23  christos 
    658      1.23  christos /*
    659      1.23  christos  * rmtwrite_with_restart()
    660      1.23  christos  *	Equivalent to write() but does retry on signals.
    661      1.23  christos  *	This function is not needed on 4.2BSD and later.
    662      1.23  christos  * Return:
    663      1.23  christos  *	Number of bytes written.  -1 indicates an error.
    664      1.23  christos  */
    665      1.23  christos 
    666      1.23  christos static int
    667      1.23  christos rmtwrite_with_restart(int fd, void *buf, int bsz)
    668      1.23  christos {
    669      1.23  christos 	int r;
    670      1.23  christos 
    671      1.23  christos 	while (((r = rmtwrite(fd, buf, bsz)) < 0) && errno == EINTR)
    672      1.23  christos 		;
    673      1.23  christos 
    674      1.23  christos 	return(r);
    675      1.23  christos }
    676      1.15     itohy #endif
    677      1.15     itohy 
    678      1.15     itohy /*
    679      1.15     itohy  * xwrite()
    680      1.15     itohy  *	Equivalent to write() but does retry on partial write, which may occur
    681      1.15     itohy  *	on signals.
    682      1.15     itohy  * Return:
    683      1.15     itohy  *	Number of bytes written.  -1 indicates an error.
    684      1.15     itohy  */
    685      1.15     itohy 
    686      1.15     itohy int
    687      1.15     itohy xwrite(int fd, void *buf, int bsz)
    688      1.15     itohy {
    689      1.15     itohy 	char *b = buf;
    690      1.15     itohy 	int written = 0;
    691      1.15     itohy 	int r;
    692      1.15     itohy 
    693      1.15     itohy 	do {
    694      1.24   thorpej #ifdef SUPPORT_RMT
    695      1.23  christos 		if ((r = rmtwrite_with_restart(fd, b, bsz)) <= 0)
    696      1.15     itohy 			break;
    697      1.24   thorpej #else
    698      1.24   thorpej 		if ((r = write_with_restart(fd, b, bsz)) <= 0)
    699      1.24   thorpej 			break;
    700      1.24   thorpej #endif /* SUPPORT_RMT */
    701      1.15     itohy 		b += r;
    702      1.15     itohy 		bsz -= r;
    703      1.15     itohy 		written += r;
    704      1.15     itohy 	} while (bsz > 0);
    705      1.15     itohy 
    706      1.15     itohy 	return(written ? written : r);
    707      1.15     itohy }
    708      1.15     itohy 
    709       1.1       jtc /*
    710       1.1       jtc  * ar_read()
    711       1.1       jtc  *	read up to a specified number of bytes from the archive into the
    712       1.1       jtc  *	supplied buffer. When dealing with tapes we may not always be able to
    713       1.1       jtc  *	read what we want.
    714       1.1       jtc  * Return:
    715       1.1       jtc  *	Number of bytes in buffer. 0 for end of file, -1 for a read error.
    716       1.1       jtc  */
    717       1.1       jtc 
    718       1.1       jtc int
    719       1.6       tls ar_read(char *buf, int cnt)
    720       1.1       jtc {
    721       1.6       tls 	int res = 0;
    722       1.1       jtc 
    723       1.1       jtc 	/*
    724       1.1       jtc 	 * if last i/o was in error, no more reads until reset or new volume
    725       1.1       jtc 	 */
    726       1.1       jtc 	if (lstrval <= 0)
    727       1.1       jtc 		return(lstrval);
    728       1.1       jtc 
    729       1.1       jtc 	/*
    730       1.1       jtc 	 * how we read must be based on device type
    731       1.1       jtc 	 */
    732       1.1       jtc 	switch (artyp) {
    733      1.24   thorpej #ifdef SUPPORT_RMT
    734      1.23  christos 	case ISRMT:
    735      1.23  christos 		if ((res = rmtread_with_restart(arfd, buf, cnt)) > 0) {
    736      1.23  christos 			io_ok = 1;
    737      1.23  christos 			return res;
    738      1.23  christos 		}
    739      1.23  christos 		break;
    740      1.24   thorpej #endif /* SUPPORT_RMT */
    741       1.1       jtc 	case ISTAPE:
    742      1.15     itohy 		if ((res = read_with_restart(arfd, buf, cnt)) > 0) {
    743       1.1       jtc 			/*
    744       1.1       jtc 			 * CAUTION: tape systems may not always return the same
    745       1.1       jtc 			 * sized records so we leave blksz == MAXBLK. The
    746       1.1       jtc 			 * physical record size that a tape drive supports is
    747       1.1       jtc 			 * very hard to determine in a uniform and portable
    748       1.1       jtc 			 * manner.
    749       1.1       jtc 			 */
    750       1.1       jtc 			io_ok = 1;
    751       1.1       jtc 			if (res != rdblksz) {
    752       1.1       jtc 				/*
    753      1.31       wiz 				 * Record size changed. If this happens on
    754       1.1       jtc 				 * any record after the first, we probably have
    755       1.1       jtc 				 * a tape drive which has a fixed record size
    756      1.31       wiz 				 * (we are getting multiple records in a single
    757       1.1       jtc 				 * read). Watch out for record blocking that
    758       1.1       jtc 				 * violates pax spec (must be a multiple of
    759       1.1       jtc 				 * BLKMULT).
    760       1.1       jtc 				 */
    761       1.1       jtc 				rdblksz = res;
    762       1.1       jtc 				if (rdblksz % BLKMULT)
    763       1.1       jtc 					invld_rec = 1;
    764       1.1       jtc 			}
    765       1.1       jtc 			return(res);
    766       1.1       jtc 		}
    767       1.1       jtc 		break;
    768       1.1       jtc 	case ISREG:
    769       1.1       jtc 	case ISBLK:
    770       1.1       jtc 	case ISCHR:
    771       1.1       jtc 	case ISPIPE:
    772       1.1       jtc 	default:
    773       1.1       jtc 		/*
    774       1.1       jtc 		 * Files are so easy to deal with. These other things cannot
    775       1.1       jtc 		 * be trusted at all. So when we are dealing with character
    776       1.1       jtc 		 * devices and pipes we just take what they have ready for us
    777       1.1       jtc 		 * and return. Trying to do anything else with them runs the
    778       1.1       jtc 		 * risk of failure.
    779       1.1       jtc 		 */
    780      1.15     itohy 		if ((res = read_with_restart(arfd, buf, cnt)) > 0) {
    781       1.1       jtc 			io_ok = 1;
    782       1.1       jtc 			return(res);
    783       1.1       jtc 		}
    784       1.1       jtc 		break;
    785       1.1       jtc 	}
    786       1.1       jtc 
    787       1.1       jtc 	/*
    788       1.1       jtc 	 * We are in trouble at this point, something is broken...
    789       1.1       jtc 	 */
    790       1.1       jtc 	lstrval = res;
    791       1.1       jtc 	if (res < 0)
    792       1.1       jtc 		syswarn(1, errno, "Failed read on archive volume %d", arvol);
    793      1.34  christos 	else
    794       1.7  christos 		tty_warn(0, "End of archive volume %d reached", arvol);
    795       1.1       jtc 	return(res);
    796      1.17     itohy }
    797       1.1       jtc 
    798       1.1       jtc /*
    799       1.1       jtc  * ar_write()
    800       1.1       jtc  *	Write a specified number of bytes in supplied buffer to the archive
    801       1.1       jtc  *	device so it appears as a single "block". Deals with errors and tries
    802       1.1       jtc  *	to recover when faced with short writes.
    803       1.1       jtc  * Return:
    804       1.1       jtc  *	Number of bytes written. 0 indicates end of volume reached and with no
    805       1.1       jtc  *	flaws (as best that can be detected). A -1 indicates an unrecoverable
    806      1.19       wiz  *	error in the archive occurred.
    807       1.1       jtc  */
    808       1.1       jtc 
    809       1.1       jtc int
    810       1.6       tls ar_write(char *buf, int bsz)
    811       1.1       jtc {
    812       1.6       tls 	int res;
    813       1.1       jtc 	off_t cpos;
    814       1.1       jtc 
    815       1.1       jtc 	/*
    816       1.1       jtc 	 * do not allow pax to create a "bad" archive. Once a write fails on
    817       1.1       jtc 	 * an archive volume prevent further writes to it.
    818       1.1       jtc 	 */
    819       1.1       jtc 	if (lstrval <= 0)
    820       1.1       jtc 		return(lstrval);
    821       1.1       jtc 
    822      1.15     itohy 	if ((res = xwrite(arfd, buf, bsz)) == bsz) {
    823       1.1       jtc 		wr_trail = 1;
    824       1.1       jtc 		io_ok = 1;
    825       1.1       jtc 		return(bsz);
    826       1.1       jtc 	}
    827       1.1       jtc 	/*
    828       1.1       jtc 	 * write broke, see what we can do with it. We try to send any partial
    829       1.1       jtc 	 * writes that may violate pax spec to the next archive volume.
    830       1.1       jtc 	 */
    831       1.1       jtc 	if (res < 0)
    832       1.1       jtc 		lstrval = res;
    833       1.1       jtc 	else
    834       1.1       jtc 		lstrval = 0;
    835       1.1       jtc 
    836       1.1       jtc 	switch (artyp) {
    837       1.1       jtc 	case ISREG:
    838       1.1       jtc 		if ((res > 0) && (res % BLKMULT)) {
    839       1.1       jtc 			/*
    840      1.17     itohy 			 * try to fix up partial writes which are not BLKMULT
    841       1.1       jtc 			 * in size by forcing the runt record to next archive
    842       1.1       jtc 			 * volume
    843      1.17     itohy 			 */
    844       1.1       jtc 			if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0)
    845       1.1       jtc 				break;
    846       1.1       jtc 			cpos -= (off_t)res;
    847       1.1       jtc 			if (ftruncate(arfd, cpos) < 0)
    848       1.1       jtc 				break;
    849       1.1       jtc 			res = lstrval = 0;
    850       1.1       jtc 			break;
    851       1.1       jtc 		}
    852       1.1       jtc 		if (res >= 0)
    853       1.1       jtc 			break;
    854       1.1       jtc 		/*
    855       1.1       jtc 		 * if file is out of space, handle it like a return of 0
    856       1.1       jtc 		 */
    857  1.39.2.1      tron 		if ((errno == ENOSPC) || (errno == EFBIG))
    858       1.1       jtc 			res = lstrval = 0;
    859  1.39.2.1      tron #ifdef EDQUOT
    860  1.39.2.1      tron 		if (errno == EDQUOT)
    861  1.39.2.1      tron 			res = lstrval = 0;
    862  1.39.2.1      tron #endif
    863       1.1       jtc 		break;
    864       1.1       jtc 	case ISTAPE:
    865       1.1       jtc 	case ISCHR:
    866       1.1       jtc 	case ISBLK:
    867      1.24   thorpej #ifdef SUPPORT_RMT
    868      1.23  christos 	case ISRMT:
    869      1.24   thorpej #endif /* SUPPORT_RMT */
    870       1.1       jtc 		if (res >= 0)
    871       1.1       jtc 			break;
    872       1.1       jtc 		if (errno == EACCES) {
    873       1.7  christos 			tty_warn(0,
    874       1.7  christos 			    "Write failed, archive is write protected.");
    875       1.1       jtc 			res = lstrval = 0;
    876       1.1       jtc 			return(0);
    877       1.1       jtc 		}
    878       1.1       jtc 		/*
    879       1.1       jtc 		 * see if we reached the end of media, if so force a change to
    880       1.1       jtc 		 * the next volume
    881       1.1       jtc 		 */
    882       1.1       jtc 		if ((errno == ENOSPC) || (errno == EIO) || (errno == ENXIO))
    883       1.1       jtc 			res = lstrval = 0;
    884       1.1       jtc 		break;
    885       1.1       jtc 	case ISPIPE:
    886       1.1       jtc 	default:
    887       1.1       jtc 		/*
    888       1.1       jtc 		 * we cannot fix errors to these devices
    889       1.1       jtc 		 */
    890       1.1       jtc 		break;
    891       1.1       jtc 	}
    892       1.1       jtc 
    893       1.1       jtc 	/*
    894       1.1       jtc 	 * Better tell the user the bad news...
    895       1.1       jtc 	 * if this is a block aligned archive format, we may have a bad archive
    896      1.17     itohy 	 * if the format wants the header to start at a BLKMULT boundary. While
    897       1.1       jtc 	 * we can deal with the mis-aligned data, it violates spec and other
    898       1.1       jtc 	 * archive readers will likely fail. if the format is not block
    899       1.1       jtc 	 * aligned, the user may be lucky (and the archive is ok).
    900       1.1       jtc 	 */
    901       1.1       jtc 	if (res >= 0) {
    902       1.1       jtc 		if (res > 0)
    903       1.1       jtc 			wr_trail = 1;
    904       1.1       jtc 		io_ok = 1;
    905       1.1       jtc 	}
    906       1.1       jtc 
    907       1.1       jtc 	/*
    908       1.1       jtc 	 * If we were trying to rewrite the trailer and it didn't work, we
    909       1.1       jtc 	 * must quit right away.
    910       1.1       jtc 	 */
    911       1.1       jtc 	if (!wr_trail && (res <= 0)) {
    912       1.7  christos 		tty_warn(1,
    913       1.7  christos 		    "Unable to append, trailer re-write failed. Quitting.");
    914       1.1       jtc 		return(res);
    915       1.1       jtc 	}
    916      1.17     itohy 
    917      1.17     itohy 	if (res == 0)
    918       1.7  christos 		tty_warn(0, "End of archive volume %d reached", arvol);
    919       1.1       jtc 	else if (res < 0)
    920       1.1       jtc 		syswarn(1, errno, "Failed write to archive volume: %d", arvol);
    921       1.1       jtc 	else if (!frmt->blkalgn || ((res % frmt->blkalgn) == 0))
    922       1.7  christos 		tty_warn(0,
    923       1.7  christos 		    "WARNING: partial archive write. Archive MAY BE FLAWED");
    924       1.1       jtc 	else
    925       1.7  christos 		tty_warn(1,"WARNING: partial archive write. Archive IS FLAWED");
    926       1.1       jtc 	return(res);
    927       1.1       jtc }
    928       1.1       jtc 
    929       1.1       jtc /*
    930       1.1       jtc  * ar_rdsync()
    931       1.1       jtc  *	Try to move past a bad spot on a flawed archive as needed to continue
    932       1.1       jtc  *	I/O. Clears error flags to allow I/O to continue.
    933       1.1       jtc  * Return:
    934       1.1       jtc  *	0 when ok to try i/o again, -1 otherwise.
    935       1.1       jtc  */
    936       1.1       jtc 
    937       1.1       jtc int
    938       1.1       jtc ar_rdsync(void)
    939       1.1       jtc {
    940       1.1       jtc 	long fsbz;
    941       1.1       jtc 	off_t cpos;
    942       1.1       jtc 	off_t mpos;
    943      1.17     itohy 	struct mtop mb;
    944       1.1       jtc 
    945       1.1       jtc 	/*
    946      1.31       wiz 	 * Fail resync attempts at user request (done) or if this is going to be
    947       1.1       jtc 	 * an update/append to a existing archive. if last i/o hit media end,
    948       1.1       jtc 	 * we need to go to the next volume not try a resync
    949       1.1       jtc 	 */
    950       1.1       jtc 	if ((done > 0) || (lstrval == 0))
    951       1.1       jtc 		return(-1);
    952       1.1       jtc 
    953       1.1       jtc 	if ((act == APPND) || (act == ARCHIVE)) {
    954       1.7  christos 		tty_warn(1, "Cannot allow updates to an archive with flaws.");
    955       1.1       jtc 		return(-1);
    956       1.1       jtc 	}
    957       1.1       jtc 	if (io_ok)
    958       1.1       jtc 		did_io = 1;
    959       1.1       jtc 
    960       1.1       jtc 	switch(artyp) {
    961      1.24   thorpej #ifdef SUPPORT_RMT
    962      1.23  christos 	case ISRMT:
    963      1.24   thorpej #endif /* SUPPORT_RMT */
    964       1.1       jtc 	case ISTAPE:
    965       1.1       jtc 		/*
    966       1.1       jtc 		 * if the last i/o was a successful data transfer, we assume
    967       1.1       jtc 		 * the fault is just a bad record on the tape that we are now
    968       1.1       jtc 		 * past. If we did not get any data since the last resync try
    969      1.17     itohy 		 * to move the tape forward one PHYSICAL record past any
    970       1.1       jtc 		 * damaged tape section. Some tape drives are stubborn and need
    971       1.1       jtc 		 * to be pushed.
    972       1.1       jtc 		 */
    973       1.1       jtc 		if (io_ok) {
    974       1.1       jtc 			io_ok = 0;
    975       1.1       jtc 			lstrval = 1;
    976       1.1       jtc 			break;
    977       1.1       jtc 		}
    978       1.1       jtc 		mb.mt_op = MTFSR;
    979       1.1       jtc 		mb.mt_count = 1;
    980      1.24   thorpej #ifdef SUPPORT_RMT
    981      1.23  christos 		if (artyp == ISRMT) {
    982      1.23  christos 			if (rmtioctl(arfd, MTIOCTOP, &mb) < 0)
    983      1.23  christos 				break;
    984      1.23  christos 		} else {
    985      1.24   thorpej #endif /* SUPPORT_RMT */
    986      1.23  christos 			if (ioctl(arfd, MTIOCTOP, &mb) < 0)
    987      1.23  christos 				break;
    988      1.24   thorpej #ifdef SUPPORT_RMT
    989      1.23  christos 		}
    990      1.24   thorpej #endif /* SUPPORT_RMT */
    991       1.1       jtc 		lstrval = 1;
    992       1.1       jtc 		break;
    993       1.1       jtc 	case ISREG:
    994       1.1       jtc 	case ISCHR:
    995       1.1       jtc 	case ISBLK:
    996       1.1       jtc 		/*
    997       1.1       jtc 		 * try to step over the bad part of the device.
    998       1.1       jtc 		 */
    999       1.1       jtc 		io_ok = 0;
   1000       1.1       jtc 		if (((fsbz = arsb.st_blksize) <= 0) || (artyp != ISREG))
   1001       1.1       jtc 			fsbz = BLKMULT;
   1002       1.1       jtc 		if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0)
   1003       1.1       jtc 			break;
   1004       1.1       jtc 		mpos = fsbz - (cpos % (off_t)fsbz);
   1005      1.17     itohy 		if (lseek(arfd, mpos, SEEK_CUR) < 0)
   1006       1.1       jtc 			break;
   1007       1.1       jtc 		lstrval = 1;
   1008       1.1       jtc 		break;
   1009       1.1       jtc 	case ISPIPE:
   1010       1.1       jtc 	default:
   1011       1.1       jtc 		/*
   1012       1.1       jtc 		 * cannot recover on these archive device types
   1013       1.1       jtc 		 */
   1014       1.1       jtc 		io_ok = 0;
   1015       1.1       jtc 		break;
   1016       1.1       jtc 	}
   1017       1.1       jtc 	if (lstrval <= 0) {
   1018       1.7  christos 		tty_warn(1, "Unable to recover from an archive read failure.");
   1019       1.1       jtc 		return(-1);
   1020       1.1       jtc 	}
   1021       1.7  christos 	tty_warn(0, "Attempting to recover from an archive read failure.");
   1022       1.1       jtc 	return(0);
   1023       1.1       jtc }
   1024       1.1       jtc 
   1025       1.1       jtc /*
   1026       1.1       jtc  * ar_fow()
   1027      1.17     itohy  *	Move the I/O position within the archive forward the specified number of
   1028       1.1       jtc  *	bytes as supported by the device. If we cannot move the requested
   1029       1.1       jtc  *	number of bytes, return the actual number of bytes moved in skipped.
   1030       1.1       jtc  * Return:
   1031       1.1       jtc  *	0 if moved the requested distance, -1 on complete failure, 1 on
   1032       1.1       jtc  *	partial move (the amount moved is in skipped)
   1033       1.1       jtc  */
   1034       1.1       jtc 
   1035       1.1       jtc int
   1036       1.1       jtc ar_fow(off_t sksz, off_t *skipped)
   1037       1.1       jtc {
   1038       1.1       jtc 	off_t cpos;
   1039       1.1       jtc 	off_t mpos;
   1040       1.1       jtc 
   1041       1.1       jtc 	*skipped = 0;
   1042       1.1       jtc 	if (sksz <= 0)
   1043       1.1       jtc 		return(0);
   1044       1.1       jtc 
   1045       1.1       jtc 	/*
   1046      1.17     itohy 	 * we cannot move forward at EOF or error
   1047       1.1       jtc 	 */
   1048       1.1       jtc 	if (lstrval <= 0)
   1049       1.1       jtc 		return(lstrval);
   1050       1.1       jtc 
   1051       1.1       jtc 	/*
   1052       1.1       jtc 	 * Safer to read forward on devices where it is hard to find the end of
   1053       1.1       jtc 	 * the media without reading to it. With tapes we cannot be sure of the
   1054       1.1       jtc 	 * number of physical blocks to skip (we do not know physical block
   1055      1.17     itohy 	 * size at this point), so we must only read forward on tapes!
   1056       1.1       jtc 	 */
   1057      1.24   thorpej 	if (artyp == ISTAPE || artyp == ISPIPE
   1058      1.24   thorpej #ifdef SUPPORT_RMT
   1059      1.24   thorpej 	    || artyp == ISRMT
   1060      1.24   thorpej #endif /* SUPPORT_RMT */
   1061      1.24   thorpej 	    )
   1062       1.1       jtc 		return(0);
   1063       1.1       jtc 
   1064       1.1       jtc 	/*
   1065       1.1       jtc 	 * figure out where we are in the archive
   1066       1.1       jtc 	 */
   1067       1.1       jtc 	if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) >= 0) {
   1068      1.17     itohy 		/*
   1069      1.17     itohy 		 * we can be asked to move farther than there are bytes in this
   1070       1.1       jtc 		 * volume, if so, just go to file end and let normal buf_fill()
   1071       1.1       jtc 		 * deal with the end of file (it will go to next volume by
   1072       1.1       jtc 		 * itself)
   1073      1.17     itohy 		 */
   1074      1.16     itohy 		mpos = cpos + sksz;
   1075      1.16     itohy 		if (artyp == ISREG && mpos > arsb.st_size)
   1076       1.1       jtc 			mpos = arsb.st_size;
   1077      1.16     itohy 		if ((mpos = lseek(arfd, mpos, SEEK_SET)) >= 0) {
   1078      1.16     itohy 			*skipped = mpos - cpos;
   1079       1.1       jtc 			return(0);
   1080      1.16     itohy 		}
   1081      1.16     itohy 	} else {
   1082      1.16     itohy 		if (artyp != ISREG)
   1083      1.16     itohy 			return(0);		/* non-seekable device */
   1084       1.1       jtc 	}
   1085      1.17     itohy 	syswarn(1, errno, "Forward positioning operation on archive failed");
   1086       1.1       jtc 	lstrval = -1;
   1087       1.1       jtc 	return(-1);
   1088       1.1       jtc }
   1089       1.1       jtc 
   1090       1.1       jtc /*
   1091       1.1       jtc  * ar_rev()
   1092       1.1       jtc  *	move the i/o position within the archive backwards the specified byte
   1093       1.1       jtc  *	count as supported by the device. With tapes drives we RESET rdblksz to
   1094       1.1       jtc  *	the PHYSICAL blocksize.
   1095       1.1       jtc  *	NOTE: We should only be called to move backwards so we can rewrite the
   1096       1.1       jtc  *	last records (the trailer) of an archive (APPEND).
   1097       1.1       jtc  * Return:
   1098       1.1       jtc  *	0 if moved the requested distance, -1 on complete failure
   1099       1.1       jtc  */
   1100       1.1       jtc 
   1101       1.1       jtc int
   1102       1.1       jtc ar_rev(off_t sksz)
   1103       1.1       jtc {
   1104       1.1       jtc 	off_t cpos;
   1105      1.17     itohy 	struct mtop mb;
   1106      1.17     itohy 	int phyblk;
   1107       1.1       jtc 
   1108       1.1       jtc 	/*
   1109       1.1       jtc 	 * make sure we do not have try to reverse on a flawed archive
   1110       1.1       jtc 	 */
   1111       1.1       jtc 	if (lstrval < 0)
   1112       1.1       jtc 		return(lstrval);
   1113       1.1       jtc 
   1114       1.1       jtc 	switch(artyp) {
   1115       1.1       jtc 	case ISPIPE:
   1116      1.17     itohy 		if (sksz <= 0)
   1117       1.1       jtc 			break;
   1118       1.1       jtc 		/*
   1119       1.1       jtc 		 * cannot go backwards on these critters
   1120       1.1       jtc 		 */
   1121       1.7  christos 		tty_warn(1, "Reverse positioning on pipes is not supported.");
   1122       1.1       jtc 		lstrval = -1;
   1123       1.1       jtc 		return(-1);
   1124       1.1       jtc 	case ISREG:
   1125       1.1       jtc 	case ISBLK:
   1126       1.1       jtc 	case ISCHR:
   1127       1.1       jtc 	default:
   1128       1.1       jtc 		if (sksz <= 0)
   1129       1.1       jtc 			break;
   1130       1.1       jtc 
   1131       1.1       jtc 		/*
   1132       1.1       jtc 		 * For things other than files, backwards movement has a very
   1133       1.1       jtc 		 * high probability of failure as we really do not know the
   1134       1.1       jtc 		 * true attributes of the device we are talking to (the device
   1135       1.1       jtc 		 * may not even have the ability to lseek() in any direction).
   1136       1.1       jtc 		 * First we figure out where we are in the archive.
   1137       1.1       jtc 		 */
   1138       1.1       jtc 		if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0) {
   1139       1.1       jtc 			syswarn(1, errno,
   1140       1.1       jtc 			   "Unable to obtain current archive byte offset");
   1141       1.1       jtc 			lstrval = -1;
   1142       1.1       jtc 			return(-1);
   1143       1.1       jtc 		}
   1144       1.1       jtc 
   1145       1.1       jtc 		/*
   1146       1.1       jtc 		 * we may try to go backwards past the start when the archive
   1147      1.31       wiz 		 * is only a single record. If this happens and we are on a
   1148      1.31       wiz 		 * multi-volume archive, we need to go to the end of the
   1149       1.1       jtc 		 * previous volume and continue our movement backwards from
   1150       1.1       jtc 		 * there.
   1151       1.1       jtc 		 */
   1152       1.1       jtc 		if ((cpos -= sksz) < (off_t)0L) {
   1153       1.1       jtc 			if (arvol > 1) {
   1154       1.1       jtc 				/*
   1155       1.1       jtc 				 * this should never happen
   1156       1.1       jtc 				 */
   1157       1.7  christos 				tty_warn(1,
   1158       1.7  christos 				    "Reverse position on previous volume.");
   1159       1.1       jtc 				lstrval = -1;
   1160       1.1       jtc 				return(-1);
   1161       1.1       jtc 			}
   1162       1.1       jtc 			cpos = (off_t)0L;
   1163       1.1       jtc 		}
   1164       1.1       jtc 		if (lseek(arfd, cpos, SEEK_SET) < 0) {
   1165       1.1       jtc 			syswarn(1, errno, "Unable to seek archive backwards");
   1166       1.1       jtc 			lstrval = -1;
   1167       1.1       jtc 			return(-1);
   1168       1.1       jtc 		}
   1169       1.1       jtc 		break;
   1170       1.1       jtc 	case ISTAPE:
   1171      1.24   thorpej #ifdef SUPPORT_RMT
   1172      1.23  christos 	case ISRMT:
   1173      1.24   thorpej #endif /* SUPPORT_RMT */
   1174       1.1       jtc 		/*
   1175      1.17     itohy 		 * Calculate and move the proper number of PHYSICAL tape
   1176       1.1       jtc 		 * blocks. If the sksz is not an even multiple of the physical
   1177       1.1       jtc 		 * tape size, we cannot do the move (this should never happen).
   1178      1.31       wiz 		 * (We also cannot handle trailers spread over two vols).
   1179       1.1       jtc 		 * get_phys() also makes sure we are in front of the filemark.
   1180      1.17     itohy 		 */
   1181       1.1       jtc 		if ((phyblk = get_phys()) <= 0) {
   1182       1.1       jtc 			lstrval = -1;
   1183       1.1       jtc 			return(-1);
   1184       1.1       jtc 		}
   1185       1.1       jtc 
   1186       1.1       jtc 		/*
   1187       1.1       jtc 		 * make sure future tape reads only go by physical tape block
   1188       1.1       jtc 		 * size (set rdblksz to the real size).
   1189       1.1       jtc 		 */
   1190       1.1       jtc 		rdblksz = phyblk;
   1191       1.1       jtc 
   1192       1.1       jtc 		/*
   1193       1.1       jtc 		 * if no movement is required, just return (we must be after
   1194       1.1       jtc 		 * get_phys() so the physical blocksize is properly set)
   1195       1.1       jtc 		 */
   1196       1.1       jtc 		if (sksz <= 0)
   1197       1.1       jtc 			break;
   1198       1.1       jtc 
   1199       1.1       jtc 		/*
   1200       1.1       jtc 		 * ok we have to move. Make sure the tape drive can do it.
   1201       1.1       jtc 		 */
   1202       1.1       jtc 		if (sksz % phyblk) {
   1203       1.7  christos 			tty_warn(1,
   1204       1.1       jtc 			    "Tape drive unable to backspace requested amount");
   1205       1.1       jtc 			lstrval = -1;
   1206       1.1       jtc 			return(-1);
   1207       1.1       jtc 		}
   1208       1.1       jtc 
   1209       1.1       jtc 		/*
   1210       1.1       jtc 		 * move backwards the requested number of bytes
   1211       1.1       jtc 		 */
   1212       1.1       jtc 		mb.mt_op = MTBSR;
   1213       1.1       jtc 		mb.mt_count = sksz/phyblk;
   1214      1.24   thorpej 		if (
   1215      1.24   thorpej #ifdef SUPPORT_RMT
   1216      1.24   thorpej 		    rmtioctl(arfd, MTIOCTOP, &mb)
   1217      1.24   thorpej #else
   1218      1.24   thorpej 		    ioctl(arfd, MTIOCTOP, &mb)
   1219      1.24   thorpej #endif /* SUPPORT_RMT */
   1220      1.24   thorpej 		    < 0) {
   1221      1.32     grant 			syswarn(1, errno, "Unable to backspace tape %ld blocks.",
   1222      1.11  christos 			    (long) mb.mt_count);
   1223       1.1       jtc 			lstrval = -1;
   1224       1.1       jtc 			return(-1);
   1225       1.1       jtc 		}
   1226       1.1       jtc 		break;
   1227       1.1       jtc 	}
   1228       1.1       jtc 	lstrval = 1;
   1229       1.1       jtc 	return(0);
   1230       1.1       jtc }
   1231       1.1       jtc 
   1232       1.1       jtc /*
   1233       1.1       jtc  * get_phys()
   1234       1.1       jtc  *	Determine the physical block size on a tape drive. We need the physical
   1235      1.17     itohy  *	block size so we know how many bytes we skip over when we move with
   1236       1.1       jtc  *	mtio commands. We also make sure we are BEFORE THE TAPE FILEMARK when
   1237       1.1       jtc  *	return.
   1238       1.1       jtc  *	This is one really SLOW routine...
   1239       1.1       jtc  * Return:
   1240       1.1       jtc  *	physical block size if ok (ok > 0), -1 otherwise
   1241       1.1       jtc  */
   1242       1.1       jtc 
   1243       1.1       jtc static int
   1244       1.1       jtc get_phys(void)
   1245       1.1       jtc {
   1246       1.6       tls 	int padsz = 0;
   1247       1.6       tls 	int res;
   1248       1.6       tls 	int phyblk;
   1249       1.1       jtc 	struct mtop mb;
   1250       1.1       jtc 	char scbuf[MAXBLK];
   1251       1.1       jtc 
   1252       1.1       jtc 	/*
   1253       1.1       jtc 	 * move to the file mark, and then back up one record and read it.
   1254       1.1       jtc 	 * this should tell us the physical record size the tape is using.
   1255       1.1       jtc 	 */
   1256       1.1       jtc 	if (lstrval == 1) {
   1257       1.1       jtc 		/*
   1258       1.1       jtc 		 * we know we are at file mark when we get back a 0 from
   1259       1.1       jtc 		 * read()
   1260       1.1       jtc 		 */
   1261      1.24   thorpej #ifdef SUPPORT_RMT
   1262      1.24   thorpej 		while ((res = rmtread_with_restart(arfd,
   1263      1.24   thorpej 						   scbuf, sizeof(scbuf))) > 0)
   1264      1.24   thorpej #else
   1265      1.24   thorpej 		while ((res = read_with_restart(arfd,
   1266      1.24   thorpej 						scbuf, sizeof(scbuf))) > 0)
   1267      1.24   thorpej #endif /* SUPPORT_RMT */
   1268       1.1       jtc 			padsz += res;
   1269       1.1       jtc 		if (res < 0) {
   1270       1.1       jtc 			syswarn(1, errno, "Unable to locate tape filemark.");
   1271       1.1       jtc 			return(-1);
   1272       1.1       jtc 		}
   1273       1.1       jtc 	}
   1274       1.1       jtc 
   1275       1.1       jtc 	/*
   1276       1.1       jtc 	 * move backwards over the file mark so we are at the end of the
   1277       1.1       jtc 	 * last record.
   1278       1.1       jtc 	 */
   1279       1.1       jtc 	mb.mt_op = MTBSF;
   1280       1.1       jtc 	mb.mt_count = 1;
   1281      1.24   thorpej 	if (
   1282      1.24   thorpej #ifdef SUPPORT_RMT
   1283      1.24   thorpej 	    rmtioctl(arfd, MTIOCTOP, &mb)
   1284      1.24   thorpej #else
   1285      1.24   thorpej 	    ioctl(arfd, MTIOCTOP, &mb)
   1286      1.24   thorpej #endif /* SUPPORT_RMT */
   1287      1.24   thorpej 	    < 0) {
   1288       1.1       jtc 		syswarn(1, errno, "Unable to backspace over tape filemark.");
   1289       1.1       jtc 		return(-1);
   1290       1.1       jtc 	}
   1291       1.1       jtc 
   1292       1.1       jtc 	/*
   1293       1.1       jtc 	 * move backwards so we are in front of the last record and read it to
   1294       1.1       jtc 	 * get physical tape blocksize.
   1295       1.1       jtc 	 */
   1296       1.1       jtc 	mb.mt_op = MTBSR;
   1297       1.1       jtc 	mb.mt_count = 1;
   1298      1.24   thorpej 	if (
   1299      1.24   thorpej #ifdef SUPPORT_RMT
   1300      1.24   thorpej 	    rmtioctl(arfd, MTIOCTOP, &mb)
   1301      1.24   thorpej #else
   1302      1.24   thorpej 	    ioctl(arfd, MTIOCTOP, &mb)
   1303      1.24   thorpej #endif /* SUPPORT_RMT */
   1304      1.24   thorpej 	    < 0) {
   1305       1.1       jtc 		syswarn(1, errno, "Unable to backspace over last tape block.");
   1306       1.1       jtc 		return(-1);
   1307       1.1       jtc 	}
   1308      1.24   thorpej 	if ((phyblk =
   1309      1.24   thorpej #ifdef SUPPORT_RMT
   1310      1.24   thorpej 	     rmtread_with_restart(arfd, scbuf, sizeof(scbuf))
   1311      1.24   thorpej #else
   1312      1.24   thorpej 	     read_with_restart(arfd, scbuf, sizeof(scbuf))
   1313      1.24   thorpej #endif /* SUPPORT_RMT */
   1314      1.24   thorpej 	    ) <= 0) {
   1315       1.1       jtc 		syswarn(1, errno, "Cannot determine archive tape blocksize.");
   1316       1.1       jtc 		return(-1);
   1317       1.1       jtc 	}
   1318       1.1       jtc 
   1319       1.1       jtc 	/*
   1320      1.17     itohy 	 * read forward to the file mark, then back up in front of the filemark
   1321       1.1       jtc 	 * (this is a bit paranoid, but should be safe to do).
   1322       1.1       jtc 	 */
   1323      1.24   thorpej 	while ((res =
   1324      1.24   thorpej #ifdef SUPPORT_RMT
   1325      1.24   thorpej 		rmtread_with_restart(arfd, scbuf, sizeof(scbuf))
   1326      1.24   thorpej #else
   1327      1.24   thorpej 		read_with_restart(arfd, scbuf, sizeof(scbuf))
   1328      1.24   thorpej #endif /* SUPPORT_RMT */
   1329      1.24   thorpej 	       ) > 0)
   1330       1.1       jtc 		;
   1331       1.1       jtc 	if (res < 0) {
   1332       1.1       jtc 		syswarn(1, errno, "Unable to locate tape filemark.");
   1333       1.1       jtc 		return(-1);
   1334       1.1       jtc 	}
   1335       1.1       jtc 	mb.mt_op = MTBSF;
   1336       1.1       jtc 	mb.mt_count = 1;
   1337      1.24   thorpej 	if (
   1338      1.24   thorpej #ifdef SUPPORT_RMT
   1339      1.24   thorpej 	    rmtioctl(arfd, MTIOCTOP, &mb)
   1340      1.24   thorpej #else
   1341      1.24   thorpej 	    ioctl(arfd, MTIOCTOP, &mb)
   1342      1.24   thorpej #endif /* SUPPORT_RMT */
   1343      1.24   thorpej 	    < 0) {
   1344       1.1       jtc 		syswarn(1, errno, "Unable to backspace over tape filemark.");
   1345       1.1       jtc 		return(-1);
   1346       1.1       jtc 	}
   1347       1.1       jtc 
   1348       1.1       jtc 	/*
   1349       1.1       jtc 	 * set lstrval so we know that the filemark has not been seen
   1350       1.1       jtc 	 */
   1351       1.1       jtc 	lstrval = 1;
   1352       1.1       jtc 
   1353       1.1       jtc 	/*
   1354       1.1       jtc 	 * return if there was no padding
   1355       1.1       jtc 	 */
   1356       1.1       jtc 	if (padsz == 0)
   1357       1.1       jtc 		return(phyblk);
   1358       1.1       jtc 
   1359       1.1       jtc 	/*
   1360       1.1       jtc 	 * make sure we can move backwards over the padding. (this should
   1361       1.1       jtc 	 * never fail).
   1362       1.1       jtc 	 */
   1363       1.1       jtc 	if (padsz % phyblk) {
   1364       1.7  christos 		tty_warn(1, "Tape drive unable to backspace requested amount");
   1365       1.1       jtc 		return(-1);
   1366       1.1       jtc 	}
   1367       1.1       jtc 
   1368       1.1       jtc 	/*
   1369       1.1       jtc 	 * move backwards over the padding so the head is where it was when
   1370       1.1       jtc 	 * we were first called (if required).
   1371       1.1       jtc 	 */
   1372       1.1       jtc 	mb.mt_op = MTBSR;
   1373       1.1       jtc 	mb.mt_count = padsz/phyblk;
   1374      1.24   thorpej 	if (
   1375      1.24   thorpej #ifdef SUPPORT_RMT
   1376      1.24   thorpej 	    rmtioctl(arfd, MTIOCTOP, &mb)
   1377      1.24   thorpej #else
   1378      1.24   thorpej 	    ioctl(arfd, MTIOCTOP, &mb)
   1379      1.24   thorpej #endif /* SUPPORT_RMT */
   1380      1.24   thorpej 	    < 0) {
   1381      1.32     grant 		syswarn(1, errno,
   1382      1.32     grant 		    "Unable to backspace tape over %ld pad blocks",
   1383      1.11  christos 		    (long)mb.mt_count);
   1384       1.1       jtc 		return(-1);
   1385       1.1       jtc 	}
   1386       1.1       jtc 	return(phyblk);
   1387       1.1       jtc }
   1388       1.1       jtc 
   1389       1.1       jtc /*
   1390       1.1       jtc  * ar_next()
   1391       1.1       jtc  *	prompts the user for the next volume in this archive. For some devices
   1392       1.1       jtc  *	we may allow the media to be changed. Otherwise a new archive is
   1393       1.1       jtc  *	prompted for. By pax spec, if there is no controlling tty or an eof is
   1394       1.1       jtc  *	read on tty input, we must quit pax.
   1395       1.1       jtc  * Return:
   1396       1.1       jtc  *	0 when ready to continue, -1 when all done
   1397       1.1       jtc  */
   1398       1.1       jtc 
   1399       1.1       jtc int
   1400       1.1       jtc ar_next(void)
   1401       1.1       jtc {
   1402       1.1       jtc 	char buf[PAXPATHLEN+2];
   1403       1.1       jtc 	static int freeit = 0;
   1404       1.1       jtc 	sigset_t o_mask;
   1405       1.1       jtc 
   1406       1.1       jtc 	/*
   1407       1.1       jtc 	 * WE MUST CLOSE THE DEVICE. A lot of devices must see last close, (so
   1408       1.1       jtc 	 * things like writing EOF etc will be done) (Watch out ar_close() can
   1409       1.1       jtc 	 * also be called via a signal handler, so we must prevent a race.
   1410       1.1       jtc 	 */
   1411       1.1       jtc 	if (sigprocmask(SIG_BLOCK, &s_mask, &o_mask) < 0)
   1412       1.1       jtc 		syswarn(0, errno, "Unable to set signal mask");
   1413       1.1       jtc 	ar_close();
   1414       1.1       jtc 	if (sigprocmask(SIG_SETMASK, &o_mask, (sigset_t *)NULL) < 0)
   1415       1.1       jtc 		syswarn(0, errno, "Unable to restore signal mask");
   1416       1.1       jtc 
   1417      1.34  christos 	if (done || !wr_trail || force_one_volume)
   1418       1.1       jtc 		return(-1);
   1419       1.1       jtc 
   1420      1.35  christos 	if (!is_gnutar)
   1421      1.35  christos 		tty_prnt("\nATTENTION! %s archive volume change required.\n",
   1422      1.35  christos 		    argv0);
   1423       1.1       jtc 
   1424       1.1       jtc 	/*
   1425       1.1       jtc 	 * if i/o is on stdin or stdout, we cannot reopen it (we do not know
   1426       1.1       jtc 	 * the name), the user will be forced to type it in.
   1427       1.1       jtc 	 */
   1428       1.1       jtc 	if (strcmp(arcname, STDO) && strcmp(arcname, STDN) && (artyp != ISREG)
   1429       1.1       jtc 	    && (artyp != ISPIPE)) {
   1430      1.24   thorpej 		if (artyp == ISTAPE
   1431      1.24   thorpej #ifdef SUPPORT_RMT
   1432      1.24   thorpej 		    || artyp == ISRMT
   1433      1.24   thorpej #endif /* SUPPORT_RMT */
   1434      1.24   thorpej 		    ) {
   1435       1.1       jtc 			tty_prnt("%s ready for archive tape volume: %d\n",
   1436       1.1       jtc 				arcname, arvol);
   1437       1.1       jtc 			tty_prnt("Load the NEXT TAPE on the tape drive");
   1438       1.1       jtc 		} else {
   1439       1.1       jtc 			tty_prnt("%s ready for archive volume: %d\n",
   1440       1.1       jtc 				arcname, arvol);
   1441       1.1       jtc 			tty_prnt("Load the NEXT STORAGE MEDIA (if required)");
   1442       1.1       jtc 		}
   1443       1.1       jtc 
   1444       1.1       jtc 		if ((act == ARCHIVE) || (act == APPND))
   1445       1.1       jtc 			tty_prnt(" and make sure it is WRITE ENABLED.\n");
   1446       1.1       jtc 		else
   1447       1.1       jtc 			tty_prnt("\n");
   1448       1.1       jtc 
   1449       1.1       jtc 		for(;;) {
   1450       1.1       jtc 			tty_prnt("Type \"y\" to continue, \".\" to quit %s,",
   1451       1.1       jtc 				argv0);
   1452       1.1       jtc 			tty_prnt(" or \"s\" to switch to new device.\nIf you");
   1453       1.1       jtc 			tty_prnt(" cannot change storage media, type \"s\"\n");
   1454       1.1       jtc 			tty_prnt("Is the device ready and online? > ");
   1455       1.1       jtc 
   1456       1.1       jtc 			if ((tty_read(buf,sizeof(buf))<0) || !strcmp(buf,".")){
   1457       1.1       jtc 				done = 1;
   1458       1.1       jtc 				lstrval = -1;
   1459       1.1       jtc 				tty_prnt("Quitting %s!\n", argv0);
   1460       1.1       jtc 				vfpart = 0;
   1461       1.1       jtc 				return(-1);
   1462       1.1       jtc 			}
   1463       1.1       jtc 
   1464       1.1       jtc 			if ((buf[0] == '\0') || (buf[1] != '\0')) {
   1465       1.1       jtc 				tty_prnt("%s unknown command, try again\n",buf);
   1466       1.1       jtc 				continue;
   1467       1.1       jtc 			}
   1468       1.1       jtc 
   1469       1.1       jtc 			switch (buf[0]) {
   1470       1.1       jtc 			case 'y':
   1471       1.1       jtc 			case 'Y':
   1472       1.1       jtc 				/*
   1473       1.1       jtc 				 * we are to continue with the same device
   1474       1.1       jtc 				 */
   1475      1.17     itohy 				if (ar_open(arcname) >= 0)
   1476       1.1       jtc 					return(0);
   1477       1.1       jtc 				tty_prnt("Cannot re-open %s, try again\n",
   1478       1.1       jtc 					arcname);
   1479       1.1       jtc 				continue;
   1480       1.1       jtc 			case 's':
   1481       1.1       jtc 			case 'S':
   1482       1.1       jtc 				/*
   1483       1.1       jtc 				 * user wants to open a different device
   1484       1.1       jtc 				 */
   1485       1.1       jtc 				tty_prnt("Switching to a different archive\n");
   1486       1.1       jtc 				break;
   1487       1.1       jtc 			default:
   1488       1.1       jtc 				tty_prnt("%s unknown command, try again\n",buf);
   1489       1.1       jtc 				continue;
   1490       1.1       jtc 			}
   1491       1.1       jtc 			break;
   1492       1.1       jtc 		}
   1493      1.35  christos 	} else {
   1494      1.35  christos 		if (is_gnutar) {
   1495      1.35  christos 			tty_warn(1, "Unexpected EOF on archive file");
   1496      1.35  christos 			return -1;
   1497      1.35  christos 		}
   1498       1.1       jtc 		tty_prnt("Ready for archive volume: %d\n", arvol);
   1499      1.35  christos 	}
   1500       1.1       jtc 
   1501       1.1       jtc 	/*
   1502       1.1       jtc 	 * have to go to a different archive
   1503       1.1       jtc 	 */
   1504       1.1       jtc 	for (;;) {
   1505       1.1       jtc 		tty_prnt("Input archive name or \".\" to quit %s.\n", argv0);
   1506       1.1       jtc 		tty_prnt("Archive name > ");
   1507       1.1       jtc 
   1508       1.1       jtc 		if ((tty_read(buf, sizeof(buf)) < 0) || !strcmp(buf, ".")) {
   1509       1.1       jtc 			done = 1;
   1510       1.1       jtc 			lstrval = -1;
   1511       1.1       jtc 			tty_prnt("Quitting %s!\n", argv0);
   1512       1.1       jtc 			vfpart = 0;
   1513       1.1       jtc 			return(-1);
   1514       1.1       jtc 		}
   1515       1.1       jtc 		if (buf[0] == '\0') {
   1516       1.1       jtc 			tty_prnt("Empty file name, try again\n");
   1517       1.1       jtc 			continue;
   1518       1.1       jtc 		}
   1519      1.17     itohy 		if (!strcmp(buf, "..")) {
   1520      1.17     itohy 			tty_prnt("Illegal file name: .. try again\n");
   1521      1.17     itohy 			continue;
   1522      1.17     itohy 		}
   1523       1.1       jtc 		if (strlen(buf) > PAXPATHLEN) {
   1524       1.1       jtc 			tty_prnt("File name too long, try again\n");
   1525       1.1       jtc 			continue;
   1526       1.1       jtc 		}
   1527       1.1       jtc 
   1528       1.1       jtc 		/*
   1529       1.1       jtc 		 * try to open new archive
   1530       1.1       jtc 		 */
   1531       1.1       jtc 		if (ar_open(buf) >= 0) {
   1532       1.1       jtc 			if (freeit) {
   1533       1.9   mycroft 				(void)free((char *)arcname);
   1534       1.1       jtc 				freeit = 0;
   1535       1.1       jtc 			}
   1536       1.1       jtc 			if ((arcname = strdup(buf)) == NULL) {
   1537       1.1       jtc 				done = 1;
   1538       1.1       jtc 				lstrval = -1;
   1539       1.7  christos 				tty_warn(0, "Cannot save archive name.");
   1540       1.1       jtc 				return(-1);
   1541       1.1       jtc 			}
   1542       1.1       jtc 			freeit = 1;
   1543       1.1       jtc 			break;
   1544       1.1       jtc 		}
   1545       1.1       jtc 		tty_prnt("Cannot open %s, try again\n", buf);
   1546       1.1       jtc 		continue;
   1547       1.1       jtc 	}
   1548       1.1       jtc 	return(0);
   1549       1.5       mrg }
   1550       1.5       mrg 
   1551       1.5       mrg /*
   1552       1.5       mrg  * ar_start_gzip()
   1553      1.33       wiz  * starts the compression/decompression process as a child, using magic
   1554      1.33       wiz  * to keep the fd the same in the calling function (parent). possible
   1555      1.33       wiz  * programs are GZIP_CMD, BZIP2_CMD, and COMPRESS_CMD.
   1556       1.5       mrg  */
   1557       1.5       mrg void
   1558      1.23  christos ar_start_gzip(int fd, const char *gzp, int wr)
   1559       1.5       mrg {
   1560       1.5       mrg 	int fds[2];
   1561      1.20     lukem 	const char *gzip_flags;
   1562       1.5       mrg 
   1563       1.5       mrg 	if (pipe(fds) < 0)
   1564       1.5       mrg 		err(1, "could not pipe");
   1565      1.23  christos 	zpid = fork();
   1566      1.23  christos 	if (zpid < 0)
   1567       1.5       mrg 		err(1, "could not fork");
   1568       1.5       mrg 
   1569       1.5       mrg 	/* parent */
   1570      1.23  christos 	if (zpid) {
   1571      1.23  christos 		if (wr)
   1572       1.5       mrg 			dup2(fds[1], fd);
   1573      1.23  christos 		else
   1574       1.5       mrg 			dup2(fds[0], fd);
   1575       1.5       mrg 		close(fds[0]);
   1576       1.5       mrg 		close(fds[1]);
   1577       1.5       mrg 	} else {
   1578      1.23  christos 		if (wr) {
   1579       1.5       mrg 			dup2(fds[0], STDIN_FILENO);
   1580       1.5       mrg 			dup2(fd, STDOUT_FILENO);
   1581       1.5       mrg 			gzip_flags = "-c";
   1582      1.23  christos 		} else {
   1583       1.5       mrg 			dup2(fds[1], STDOUT_FILENO);
   1584       1.5       mrg 			dup2(fd, STDIN_FILENO);
   1585       1.5       mrg 			gzip_flags = "-dc";
   1586       1.5       mrg 		}
   1587       1.5       mrg 		close(fds[0]);
   1588       1.5       mrg 		close(fds[1]);
   1589      1.23  christos 		if (execlp(gzp, gzp, gzip_flags, NULL) < 0)
   1590       1.5       mrg 			err(1, "could not exec");
   1591       1.5       mrg 		/* NOTREACHED */
   1592       1.5       mrg 	}
   1593      1.13  christos }
   1594      1.13  christos 
   1595      1.13  christos static const char *
   1596      1.13  christos timefmt(buf, size, sz, tm)
   1597      1.13  christos 	char *buf;
   1598      1.13  christos 	size_t size;
   1599      1.13  christos 	off_t sz;
   1600      1.13  christos 	time_t tm;
   1601      1.13  christos {
   1602      1.20     lukem 	(void)snprintf(buf, size, "%lu secs (" OFFT_F " bytes/sec)",
   1603      1.20     lukem 	    (unsigned long)tm, (OFFT_T)(sz / tm));
   1604      1.13  christos 	return buf;
   1605      1.13  christos }
   1606      1.13  christos 
   1607      1.13  christos static const char *
   1608      1.13  christos sizefmt(buf, size, sz)
   1609      1.13  christos 	char *buf;
   1610      1.13  christos 	size_t size;
   1611      1.13  christos 	off_t sz;
   1612      1.13  christos {
   1613      1.20     lukem 	(void)snprintf(buf, size, OFFT_F " bytes", (OFFT_T)sz);
   1614      1.13  christos 	return buf;
   1615      1.13  christos }
   1616      1.13  christos 
   1617      1.13  christos void
   1618      1.13  christos ar_summary(int n)
   1619      1.13  christos {
   1620      1.13  christos 	time_t secs;
   1621      1.13  christos 	int len;
   1622      1.13  christos 	char buf[MAXPATHLEN];
   1623      1.13  christos 	char tbuf[MAXPATHLEN/4];
   1624      1.13  christos 	char s1buf[MAXPATHLEN/8];
   1625      1.13  christos 	char s2buf[MAXPATHLEN/8];
   1626      1.13  christos 	FILE *outf;
   1627      1.13  christos 
   1628      1.13  christos 	if (act == LIST)
   1629      1.13  christos 		outf = stdout;
   1630      1.13  christos 	else
   1631      1.13  christos 		outf = stderr;
   1632      1.13  christos 
   1633      1.13  christos 	/*
   1634      1.13  christos 	 * If we are called from a signal (n != 0), use snprintf(3) so that we
   1635      1.13  christos 	 * don't reenter stdio(3).
   1636      1.13  christos 	 */
   1637      1.13  christos 	(void)time(&secs);
   1638      1.13  christos 	if ((secs -= starttime) == 0)
   1639      1.13  christos 		secs = 1;
   1640      1.13  christos 
   1641      1.13  christos 	/*
   1642      1.13  christos 	 * If we have not determined the format yet, we just say how many bytes
   1643      1.13  christos 	 * we have skipped over looking for a header to id. there is no way we
   1644      1.13  christos 	 * could have written anything yet.
   1645      1.13  christos 	 */
   1646      1.13  christos 	if (frmt == NULL) {
   1647      1.17     itohy 		len = snprintf(buf, sizeof(buf),
   1648      1.13  christos 		    "unknown format, %s skipped in %s\n",
   1649      1.13  christos 		    sizefmt(s1buf, sizeof(s1buf), rdcnt),
   1650      1.13  christos 		    timefmt(tbuf, sizeof(tbuf), rdcnt, secs));
   1651      1.13  christos 		if (n == 0)
   1652      1.13  christos 			(void)fprintf(outf, "%s: %s", argv0, buf);
   1653      1.17     itohy 		else
   1654      1.13  christos 			(void)write(STDERR_FILENO, buf, len);
   1655      1.13  christos 		return;
   1656      1.13  christos 	}
   1657      1.13  christos 
   1658      1.13  christos 
   1659      1.13  christos 	if (n != 0) {
   1660      1.13  christos 		len = snprintf(buf, sizeof(buf), "Working on `%s' (%s)\n",
   1661      1.13  christos 		    archd.name, sizefmt(s1buf, sizeof(s1buf), archd.sb.st_size));
   1662      1.13  christos 		(void)write(STDERR_FILENO, buf, len);
   1663      1.13  christos 	}
   1664      1.13  christos 
   1665      1.13  christos 
   1666      1.13  christos 	len = snprintf(buf, sizeof(buf),
   1667      1.13  christos 	    "%s vol %d, %lu files, %s read, %s written in %s\n",
   1668      1.13  christos 	    frmt->name, arvol-1, (unsigned long)flcnt,
   1669      1.13  christos 	    sizefmt(s1buf, sizeof(s1buf), rdcnt),
   1670      1.13  christos 	    sizefmt(s2buf, sizeof(s2buf), wrcnt),
   1671      1.13  christos 	    timefmt(tbuf, sizeof(tbuf), rdcnt + wrcnt, secs));
   1672      1.13  christos 	if (n == 0)
   1673      1.13  christos 		(void)fprintf(outf, "%s: %s", argv0, buf);
   1674      1.13  christos 	else
   1675      1.13  christos 		(void)write(STDERR_FILENO, buf, strlen(buf));
   1676      1.14        is }
   1677      1.14        is 
   1678      1.14        is /*
   1679      1.14        is  * ar_dochdir(name)
   1680      1.14        is  *	change directory to name, and remember where we came from and
   1681      1.14        is  *	where we change to (for ar_open).
   1682      1.14        is  *
   1683      1.14        is  *	Maybe we could try to be smart and only do the actual chdir
   1684      1.14        is  *	when necessary to write a file read from the archive, but this
   1685      1.14        is  *	is not easy to get right given the pax code structure.
   1686      1.14        is  *
   1687      1.14        is  *	Be sure to not leak descriptors!
   1688      1.14        is  *
   1689      1.14        is  *	We are called N * M times when extracting, and N times when
   1690      1.14        is  *	writing archives, where
   1691      1.14        is  *	N:	number of -C options
   1692      1.14        is  *	M:	number of files in archive
   1693      1.17     itohy  *
   1694      1.14        is  * Returns 0 if all went well, else -1.
   1695      1.14        is  */
   1696      1.14        is 
   1697      1.14        is int
   1698      1.14        is ar_dochdir(char *name)
   1699      1.14        is {
   1700      1.23  christos 	/* First fchdir() back... */
   1701      1.23  christos 	if (fchdir(cwdfd) < 0) {
   1702      1.23  christos 		syswarn(1, errno, "Can't fchdir to starting directory");
   1703      1.23  christos 		return(-1);
   1704      1.14        is 	}
   1705      1.23  christos 	if (chdir(name) < 0) {
   1706      1.23  christos 		syswarn(1, errno, "Can't chdir to %s", name);
   1707      1.23  christos 		return(-1);
   1708      1.14        is 	}
   1709      1.14        is 	return (0);
   1710       1.1       jtc }
   1711