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