GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: bin/pax/ar_io.c Lines: 140 451 31.0 %
Date: 2016-12-06 Branches: 104 369 28.2 %

Line Branch Exec Source
1
/*	$OpenBSD: ar_io.c,v 1.56 2016/06/03 23:22:20 tedu Exp $	*/
2
/*	$NetBSD: ar_io.c,v 1.5 1996/03/26 23:54:13 mrg Exp $	*/
3
4
/*-
5
 * Copyright (c) 1992 Keith Muller.
6
 * Copyright (c) 1992, 1993
7
 *	The Regents of the University of California.  All rights reserved.
8
 *
9
 * This code is derived from software contributed to Berkeley by
10
 * Keith Muller of the University of California, San Diego.
11
 *
12
 * Redistribution and use in source and binary forms, with or without
13
 * modification, are permitted provided that the following conditions
14
 * are met:
15
 * 1. Redistributions of source code must retain the above copyright
16
 *    notice, this list of conditions and the following disclaimer.
17
 * 2. Redistributions in binary form must reproduce the above copyright
18
 *    notice, this list of conditions and the following disclaimer in the
19
 *    documentation and/or other materials provided with the distribution.
20
 * 3. Neither the name of the University nor the names of its contributors
21
 *    may be used to endorse or promote products derived from this software
22
 *    without specific prior written permission.
23
 *
24
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34
 * SUCH DAMAGE.
35
 */
36
37
#include <sys/types.h>
38
#include <sys/time.h>
39
#include <sys/stat.h>
40
#include <sys/ioctl.h>
41
#include <sys/mtio.h>
42
#include <sys/wait.h>
43
#include <signal.h>
44
#include <string.h>
45
#include <fcntl.h>
46
#include <unistd.h>
47
#include <stdio.h>
48
#include <errno.h>
49
#include <stdlib.h>
50
#include <err.h>
51
#include "pax.h"
52
#include "options.h"
53
#include "extern.h"
54
55
/*
56
 * Routines which deal directly with the archive I/O device/file.
57
 */
58
59
#define DMOD		0666		/* default mode of created archives */
60
#define EXT_MODE	O_RDONLY	/* open mode for list/extract */
61
#define AR_MODE		(O_WRONLY | O_CREAT | O_TRUNC)	/* mode for archive */
62
#define APP_MODE	O_RDWR		/* mode for append */
63
#define STDO		"<STDOUT>"	/* pseudo name for stdout */
64
#define STDN		"<STDIN>"	/* pseudo name for stdin */
65
static int arfd = -1;			/* archive file descriptor */
66
static int artyp = ISREG;		/* archive type: file/FIFO/tape */
67
static int arvol = 1;			/* archive volume number */
68
static int lstrval = -1;		/* return value from last i/o */
69
static int io_ok;			/* i/o worked on volume after resync */
70
static int did_io;			/* did i/o ever occur on volume? */
71
static int done;			/* set via tty termination */
72
static struct stat arsb;		/* stat of archive device at open */
73
static int invld_rec;			/* tape has out of spec record size */
74
static int wr_trail = 1;		/* trailer was rewritten in append */
75
static int can_unlnk = 0;		/* do we unlink null archives?  */
76
const char *arcname;			/* printable name of archive */
77
const char *gzip_program;		/* name of gzip program */
78
static pid_t zpid = -1;			/* pid of child process */
79
int force_one_volume;			/* 1 if we ignore volume changes */
80
81
static int get_phys(void);
82
extern sigset_t s_mask;
83
static void ar_start_gzip(int, const char *, int);
84
85
/*
86
 * ar_open()
87
 *	Opens the next archive volume. Determines the type of the device and
88
 *	sets up block sizes as required by the archive device and the format.
89
 *	Note: we may be called with name == NULL on the first open only.
90
 * Return:
91
 *	-1 on failure, 0 otherwise
92
 */
93
94
int
95
ar_open(const char *name)
96
32
{
97
	struct mtget mb;
98
99
32
	if (arfd != -1)
100
		(void)close(arfd);
101
32
	arfd = -1;
102
32
	can_unlnk = did_io = io_ok = invld_rec = 0;
103
32
	artyp = ISREG;
104
32
	flcnt = 0;
105
106
	/*
107
	 * open based on overall operation mode
108
	 */
109

32
	switch (act) {
110
	case LIST:
111
	case EXTRACT:
112
20
		if (name == NULL) {
113
8
			arfd = STDIN_FILENO;
114
8
			arcname = STDN;
115
12
		} else if ((arfd = open(name, EXT_MODE, DMOD)) < 0)
116
			syswarn(1, errno, "Failed open to read on %s", name);
117

20
		if (arfd != -1 && gzip_program != NULL)
118
6
			ar_start_gzip(arfd, gzip_program, 0);
119
		break;
120
	case ARCHIVE:
121
6
		if (name == NULL) {
122
4
			arfd = STDOUT_FILENO;
123
4
			arcname = STDO;
124
2
		} else if ((arfd = open(name, AR_MODE, DMOD)) < 0)
125
			syswarn(1, errno, "Failed open to write on %s", name);
126
		else
127
2
			can_unlnk = 1;
128

6
		if (arfd != -1 && gzip_program != NULL)
129
			ar_start_gzip(arfd, gzip_program, 1);
130
		break;
131
	case APPND:
132
6
		if (name == NULL) {
133
			arfd = STDOUT_FILENO;
134
			arcname = STDO;
135
6
		} else if ((arfd = open(name, APP_MODE, DMOD)) < 0)
136
			syswarn(1, errno, "Failed open to read/write on %s",
137
				name);
138
		break;
139
	case COPY:
140
		/*
141
		 * arfd not used in COPY mode
142
		 */
143
		arcname = "<NONE>";
144
		lstrval = 1;
145
		return(0);
146
	}
147
32
	if (arfd < 0)
148
		return(-1);
149
150
32
	if (chdname != NULL)
151
		if (chdir(chdname) != 0) {
152
			syswarn(1, errno, "Failed chdir to %s", chdname);
153
			return(-1);
154
		}
155
	/*
156
	 * set up is based on device type
157
	 */
158
32
	if (fstat(arfd, &arsb) < 0) {
159
		syswarn(1, errno, "Failed stat on %s", arcname);
160
		(void)close(arfd);
161
		arfd = -1;
162
		can_unlnk = 0;
163
		return(-1);
164
	}
165
32
	if (S_ISDIR(arsb.st_mode)) {
166
		paxwarn(0, "Cannot write an archive on top of a directory %s",
167
		    arcname);
168
		(void)close(arfd);
169
		arfd = -1;
170
		can_unlnk = 0;
171
		return(-1);
172
	}
173
174
32
	if (S_ISCHR(arsb.st_mode))
175
2
		artyp = ioctl(arfd, MTIOCGET, &mb) ? ISCHR : ISTAPE;
176
30
	else if (S_ISBLK(arsb.st_mode))
177
		artyp = ISBLK;
178

40
	else if ((lseek(arfd, (off_t)0L, SEEK_CUR) == -1) && (errno == ESPIPE))
179
10
		artyp = ISPIPE;
180
	else
181
20
		artyp = ISREG;
182
183
	/*
184
	 * make sure beyond any doubt that we can unlink only regular files
185
	 * we created
186
	 */
187
32
	if (artyp != ISREG)
188
12
		can_unlnk = 0;
189
	/*
190
	 * if we are writing, we are done
191
	 */
192
32
	if (act == ARCHIVE) {
193
6
		blksz = rdblksz = wrblksz;
194
6
		lstrval = 1;
195
6
		return(0);
196
	}
197
198
	/*
199
	 * set default blksz on read. APPNDs writes rdblksz on the last volume
200
	 * On all new archive volumes, we shift to wrblksz (if the user
201
	 * specified one, otherwise we will continue to use rdblksz). We
202
	 * must set blocksize based on what kind of device the archive is
203
	 * stored.
204
	 */
205

26
	switch (artyp) {
206
	case ISTAPE:
207
		/*
208
		 * Tape drives come in at least two flavors. Those that support
209
		 * variable sized records and those that have fixed sized
210
		 * records. They must be treated differently. For tape drives
211
		 * that support variable sized records, we must make large
212
		 * reads to make sure we get the entire record, otherwise we
213
		 * will just get the first part of the record (up to size we
214
		 * asked). Tapes with fixed sized records may or may not return
215
		 * multiple records in a single read. We really do not care
216
		 * what the physical record size is UNLESS we are going to
217
		 * append. (We will need the physical block size to rewrite
218
		 * the trailer). Only when we are appending do we go to the
219
		 * effort to figure out the true PHYSICAL record size.
220
		 */
221
		blksz = rdblksz = MAXBLK;
222
		break;
223
	case ISPIPE:
224
	case ISBLK:
225
	case ISCHR:
226
		/*
227
		 * Blocksize is not a major issue with these devices (but must
228
		 * be kept a multiple of 512). If the user specified a write
229
		 * block size, we use that to read. Under append, we must
230
		 * always keep blksz == rdblksz. Otherwise we go ahead and use
231
		 * the device optimal blocksize as (and if) returned by stat
232
		 * and if it is within pax specs.
233
		 */
234

8
		if ((act == APPND) && wrblksz) {
235
			blksz = rdblksz = wrblksz;
236
			break;
237
		}
238
239

16
		if ((arsb.st_blksize > 0) && (arsb.st_blksize < MAXBLK) &&
240
		    ((arsb.st_blksize % BLKMULT) == 0))
241
8
			rdblksz = arsb.st_blksize;
242
		else
243
			rdblksz = DEVBLK;
244
		/*
245
		 * For performance go for large reads when we can without harm
246
		 */
247

8
		if ((act == APPND) || (artyp == ISCHR))
248
			blksz = rdblksz;
249
		else
250
8
			blksz = MAXBLK;
251
		break;
252
	case ISREG:
253
		/*
254
		 * if the user specified wrblksz works, use it. Under appends
255
		 * we must always keep blksz == rdblksz
256
		 */
257

18
		if ((act == APPND) && wrblksz && ((arsb.st_size%wrblksz)==0)){
258
			blksz = rdblksz = wrblksz;
259
			break;
260
		}
261
		/*
262
		 * See if we can find the blocking factor from the file size
263
		 */
264
1962
		for (rdblksz = MAXBLK; rdblksz > 0; rdblksz -= BLKMULT)
265
1962
			if ((arsb.st_size % rdblksz) == 0)
266
18
				break;
267
		/*
268
		 * When we cannot find a match, we may have a flawed archive.
269
		 */
270
18
		if (rdblksz <= 0)
271
			rdblksz = FILEBLK;
272
		/*
273
		 * for performance go for large reads when we can
274
		 */
275
18
		if (act == APPND)
276
6
			blksz = rdblksz;
277
		else
278
12
			blksz = MAXBLK;
279
		break;
280
	default:
281
		/*
282
		 * should never happen, worst case, slow...
283
		 */
284
		blksz = rdblksz = BLKMULT;
285
		break;
286
	}
287
26
	lstrval = 1;
288
26
	return(0);
289
}
290
291
/*
292
 * ar_close(int int_sig)
293
 *	closes archive device, increments volume number, and prints i/o summary
294
 *	If in_sig is set we're in a signal handler and can't flush stdio.
295
 */
296
void
297
ar_close(int in_sig)
298
32
{
299
	int status;
300
301
32
	if (arfd < 0) {
302
2
		did_io = io_ok = flcnt = 0;
303
2
		return;
304
	}
305
30
	if (!in_sig)
306
30
		fflush(listf);
307
308
	/*
309
	 * Close archive file. This may take a LONG while on tapes (we may be
310
	 * forced to wait for the rewind to complete) so tell the user what is
311
	 * going on (this avoids the user hitting control-c thinking pax is
312
	 * broken).
313
	 */
314

30
	if (vflag && (artyp == ISTAPE)) {
315
		(void)dprintf(listfd,
316
		    "%s%s: Waiting for tape drive close to complete...",
317
		    vfpart ? "\n" : "", argv0);
318
	}
319
320
	/*
321
	 * if nothing was written to the archive (and we created it), we remove
322
	 * it
323
	 */
324


30
	if (can_unlnk && (fstat(arfd, &arsb) == 0) && (S_ISREG(arsb.st_mode)) &&
325
	    (arsb.st_size == 0)) {
326
		(void)unlink(arcname);
327
		can_unlnk = 0;
328
	}
329
330
	/*
331
	 * for a quick extract/list, pax frequently exits before the child
332
	 * process is done
333
	 */
334

30
	if ((act == LIST || act == EXTRACT) && nflag && zpid > 0) {
335
		kill(zpid, SIGINT);
336
		zpid = -1;
337
	}
338
339
30
	(void)close(arfd);
340
341
	/* Do not exit before child to ensure data integrity */
342
30
	if (zpid > 0) {
343
6
		waitpid(zpid, &status, 0);
344

6
		if (!WIFEXITED(status) || WEXITSTATUS(status))
345
			exit_val = 1;
346
	}
347
348
349

30
	if (vflag && (artyp == ISTAPE)) {
350
		(void)write(listfd, "done.\n", sizeof("done.\n")-1);
351
		vfpart = 0;
352
	}
353
30
	arfd = -1;
354
355

30
	if (!io_ok && !did_io) {
356
		flcnt = 0;
357
		return;
358
	}
359
30
	did_io = io_ok = 0;
360
361
	/*
362
	 * The volume number is only increased when the last device has data
363
	 * and we have already determined the archive format.
364
	 */
365
30
	if (frmt != NULL)
366
30
		++arvol;
367
368
30
	if (!vflag) {
369
30
		flcnt = 0;
370
30
		return;
371
	}
372
373
	/*
374
	 * Print out a summary of I/O for this archive volume.
375
	 */
376
	if (vfpart) {
377
		(void)write(listfd, "\n", 1);
378
		vfpart = 0;
379
	}
380
381
	/*
382
	 * If we have not determined the format yet, we just say how many bytes
383
	 * we have skipped over looking for a header to id. there is no way we
384
	 * could have written anything yet.
385
	 */
386
	if (frmt == NULL) {
387
		(void)dprintf(listfd,
388
		    "%s: unknown format, %llu bytes skipped.\n", argv0, rdcnt);
389
		flcnt = 0;
390
		return;
391
	}
392
393
	if (strcmp(NM_PAX, argv0) == 0)
394
		(void)dprintf(listfd, "%s: %s vol %d, %lu files,"
395
		    " %llu bytes read, %llu bytes written.\n",
396
		    argv0, frmt->name, arvol-1, flcnt, rdcnt, wrcnt);
397
#ifndef NOCPIO
398
	else if (strcmp(NM_CPIO, argv0) == 0)
399
		(void)dprintf(listfd, "%llu blocks\n",
400
		    (rdcnt ? rdcnt : wrcnt) / 5120);
401
#endif /* !NOCPIO */
402
	flcnt = 0;
403
}
404
405
/*
406
 * ar_drain()
407
 *	drain any archive format independent padding from an archive read
408
 *	from a socket or a pipe. This is to prevent the process on the
409
 *	other side of the pipe from getting a SIGPIPE (pax will stop
410
 *	reading an archive once a format dependent trailer is detected).
411
 */
412
void
413
ar_drain(void)
414
24
{
415
	int res;
416
	char drbuf[MAXBLK];
417
418
	/*
419
	 * we only drain from a pipe/socket. Other devices can be closed
420
	 * without reading up to end of file. We sure hope that pipe is closed
421
	 * on the other side so we will get an EOF.
422
	 */
423

24
	if ((artyp != ISPIPE) || (lstrval <= 0))
424
		return;
425
426
	/*
427
	 * keep reading until pipe is drained
428
	 */
429
8
	while ((res = read(arfd, drbuf, sizeof(drbuf))) > 0)
430
		continue;
431
8
	lstrval = res;
432
}
433
434
/*
435
 * ar_set_wr()
436
 *	Set up device right before switching from read to write in an append.
437
 *	device dependent code (if required) to do this should be added here.
438
 *	For all archive devices we are already positioned at the place we want
439
 *	to start writing when this routine is called.
440
 * Return:
441
 *	0 if all ready to write, -1 otherwise
442
 */
443
444
int
445
ar_set_wr(void)
446
6
{
447
	off_t cpos;
448
449
	/*
450
	 * we must make sure the trailer is rewritten on append, ar_next()
451
	 * will stop us if the archive containing the trailer was not written
452
	 */
453
6
	wr_trail = 0;
454
455
	/*
456
	 * Add any device dependent code as required here
457
	 */
458
6
	if (artyp != ISREG)
459
		return(0);
460
	/*
461
	 * Ok we have an archive in a regular file. If we were rewriting a
462
	 * file, we must get rid of all the stuff after the current offset
463
	 * (it was not written by pax).
464
	 */
465

6
	if (((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0) ||
466
	    (ftruncate(arfd, cpos) < 0)) {
467
		syswarn(1, errno, "Unable to truncate archive file");
468
		return(-1);
469
	}
470
6
	return(0);
471
}
472
473
/*
474
 * ar_app_ok()
475
 *	check if the last volume in the archive allows appends. We cannot check
476
 *	this until we are ready to write since there is no spec that says all
477
 *	volumes in a single archive have to be of the same type...
478
 * Return:
479
 *	0 if we can append, -1 otherwise.
480
 */
481
482
int
483
ar_app_ok(void)
484
6
{
485
6
	if (artyp == ISPIPE) {
486
		paxwarn(1, "Cannot append to an archive obtained from a pipe.");
487
		return(-1);
488
	}
489
490
6
	if (!invld_rec)
491
6
		return(0);
492
	paxwarn(1,"Cannot append, device record size %d does not support %s spec",
493
		rdblksz, argv0);
494
	return(-1);
495
}
496
497
/*
498
 * ar_read()
499
 *	read up to a specified number of bytes from the archive into the
500
 *	supplied buffer. When dealing with tapes we may not always be able to
501
 *	read what we want.
502
 * Return:
503
 *	Number of bytes in buffer. 0 for end of file, -1 for a read error.
504
 */
505
506
int
507
ar_read(char *buf, int cnt)
508
36
{
509
36
	int res = 0;
510
511
	/*
512
	 * if last i/o was in error, no more reads until reset or new volume
513
	 */
514
36
	if (lstrval <= 0)
515
		return(lstrval);
516
517
	/*
518
	 * how we read must be based on device type
519
	 */
520
36
	switch (artyp) {
521
	case ISTAPE:
522
		if ((res = read(arfd, buf, cnt)) > 0) {
523
			/*
524
			 * CAUTION: tape systems may not always return the same
525
			 * sized records so we leave blksz == MAXBLK. The
526
			 * physical record size that a tape drive supports is
527
			 * very hard to determine in a uniform and portable
528
			 * manner.
529
			 */
530
			io_ok = 1;
531
			if (res != rdblksz) {
532
				/*
533
				 * Record size changed. If this happens on
534
				 * any record after the first, we probably have
535
				 * a tape drive which has a fixed record size
536
				 * (we are getting multiple records in a single
537
				 * read). Watch out for record blocking that
538
				 * violates pax spec (must be a multiple of
539
				 * BLKMULT).
540
				 */
541
				rdblksz = res;
542
				if (rdblksz % BLKMULT)
543
					invld_rec = 1;
544
			}
545
			return(res);
546
		}
547
		break;
548
	case ISREG:
549
	case ISBLK:
550
	case ISCHR:
551
	case ISPIPE:
552
	default:
553
		/*
554
		 * Files are so easy to deal with. These other things cannot
555
		 * be trusted at all. So when we are dealing with character
556
		 * devices and pipes we just take what they have ready for us
557
		 * and return. Trying to do anything else with them runs the
558
		 * risk of failure.
559
		 */
560
36
		if ((res = read(arfd, buf, cnt)) > 0) {
561
34
			io_ok = 1;
562
34
			return(res);
563
		}
564
		break;
565
	}
566
567
	/*
568
	 * We are in trouble at this point, something is broken...
569
	 */
570
2
	lstrval = res;
571
2
	if (res < 0)
572
		syswarn(1, errno, "Failed read on archive volume %d", arvol);
573
	else
574
2
		paxwarn(0, "End of archive volume %d reached", arvol);
575
2
	return(res);
576
}
577
578
/*
579
 * ar_write()
580
 *	Write a specified number of bytes in supplied buffer to the archive
581
 *	device so it appears as a single "block". Deals with errors and tries
582
 *	to recover when faced with short writes.
583
 * Return:
584
 *	Number of bytes written. 0 indicates end of volume reached and with no
585
 *	flaws (as best that can be detected). A -1 indicates an unrecoverable
586
 *	error in the archive occurred.
587
 */
588
589
int
590
ar_write(char *buf, int bsz)
591
10
{
592
	int res;
593
	off_t cpos;
594
595
	/*
596
	 * do not allow pax to create a "bad" archive. Once a write fails on
597
	 * an archive volume prevent further writes to it.
598
	 */
599
10
	if (lstrval <= 0)
600
		return(lstrval);
601
602
10
	if ((res = write(arfd, buf, bsz)) == bsz) {
603
10
		wr_trail = 1;
604
10
		io_ok = 1;
605
10
		return(bsz);
606
	}
607
	/*
608
	 * write broke, see what we can do with it. We try to send any partial
609
	 * writes that may violate pax spec to the next archive volume.
610
	 */
611
	if (res < 0)
612
		lstrval = res;
613
	else
614
		lstrval = 0;
615
616
	switch (artyp) {
617
	case ISREG:
618
		if ((res > 0) && (res % BLKMULT)) {
619
			/*
620
			 * try to fix up partial writes which are not BLKMULT
621
			 * in size by forcing the runt record to next archive
622
			 * volume
623
			 */
624
			if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0)
625
				break;
626
			cpos -= (off_t)res;
627
			if (ftruncate(arfd, cpos) < 0)
628
				break;
629
			res = lstrval = 0;
630
			break;
631
		}
632
		if (res >= 0)
633
			break;
634
		/*
635
		 * if file is out of space, handle it like a return of 0
636
		 */
637
		if ((errno == ENOSPC) || (errno == EFBIG) || (errno == EDQUOT))
638
			res = lstrval = 0;
639
		break;
640
	case ISTAPE:
641
	case ISCHR:
642
	case ISBLK:
643
		if (res >= 0)
644
			break;
645
		if (errno == EACCES) {
646
			paxwarn(0, "Write failed, archive is write protected.");
647
			res = lstrval = 0;
648
			return(0);
649
		}
650
		/*
651
		 * see if we reached the end of media, if so force a change to
652
		 * the next volume
653
		 */
654
		if ((errno == ENOSPC) || (errno == EIO) || (errno == ENXIO))
655
			res = lstrval = 0;
656
		break;
657
	case ISPIPE:
658
	default:
659
		/*
660
		 * we cannot fix errors to these devices
661
		 */
662
		break;
663
	}
664
665
	/*
666
	 * Better tell the user the bad news...
667
	 * if this is a block aligned archive format, we may have a bad archive
668
	 * if the format wants the header to start at a BLKMULT boundary. While
669
	 * we can deal with the mis-aligned data, it violates spec and other
670
	 * archive readers will likely fail. if the format is not block
671
	 * aligned, the user may be lucky (and the archive is ok).
672
	 */
673
	if (res >= 0) {
674
		if (res > 0)
675
			wr_trail = 1;
676
		io_ok = 1;
677
	}
678
679
	/*
680
	 * If we were trying to rewrite the trailer and it didn't work, we
681
	 * must quit right away.
682
	 */
683
	if (!wr_trail && (res <= 0)) {
684
		paxwarn(1,"Unable to append, trailer re-write failed. Quitting.");
685
		return(res);
686
	}
687
688
	if (res == 0)
689
		paxwarn(0, "End of archive volume %d reached", arvol);
690
	else if (res < 0)
691
		syswarn(1, errno, "Failed write to archive volume: %d", arvol);
692
	else if (!frmt->blkalgn || ((res % frmt->blkalgn) == 0))
693
		paxwarn(0,"WARNING: partial archive write. Archive MAY BE FLAWED");
694
	else
695
		paxwarn(1,"WARNING: partial archive write. Archive IS FLAWED");
696
	return(res);
697
}
698
699
/*
700
 * ar_rdsync()
701
 *	Try to move past a bad spot on a flawed archive as needed to continue
702
 *	I/O. Clears error flags to allow I/O to continue.
703
 * Return:
704
 *	0 when ok to try i/o again, -1 otherwise.
705
 */
706
707
int
708
ar_rdsync(void)
709
{
710
	long fsbz;
711
	off_t cpos;
712
	off_t mpos;
713
	struct mtop mb;
714
715
	/*
716
	 * Fail resync attempts at user request (done) or if this is going to be
717
	 * an update/append to a existing archive. if last i/o hit media end,
718
	 * we need to go to the next volume not try a resync
719
	 */
720
	if ((done > 0) || (lstrval == 0))
721
		return(-1);
722
723
	if ((act == APPND) || (act == ARCHIVE)) {
724
		paxwarn(1, "Cannot allow updates to an archive with flaws.");
725
		return(-1);
726
	}
727
	if (io_ok)
728
		did_io = 1;
729
730
	switch (artyp) {
731
	case ISTAPE:
732
		/*
733
		 * if the last i/o was a successful data transfer, we assume
734
		 * the fault is just a bad record on the tape that we are now
735
		 * past. If we did not get any data since the last resync try
736
		 * to move the tape forward one PHYSICAL record past any
737
		 * damaged tape section. Some tape drives are stubborn and need
738
		 * to be pushed.
739
		 */
740
		if (io_ok) {
741
			io_ok = 0;
742
			lstrval = 1;
743
			break;
744
		}
745
		mb.mt_op = MTFSR;
746
		mb.mt_count = 1;
747
		if (ioctl(arfd, MTIOCTOP, &mb) < 0)
748
			break;
749
		lstrval = 1;
750
		break;
751
	case ISREG:
752
	case ISCHR:
753
	case ISBLK:
754
		/*
755
		 * try to step over the bad part of the device.
756
		 */
757
		io_ok = 0;
758
		if (((fsbz = arsb.st_blksize) <= 0) || (artyp != ISREG))
759
			fsbz = BLKMULT;
760
		if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0)
761
			break;
762
		mpos = fsbz - (cpos % (off_t)fsbz);
763
		if (lseek(arfd, mpos, SEEK_CUR) < 0)
764
			break;
765
		lstrval = 1;
766
		break;
767
	case ISPIPE:
768
	default:
769
		/*
770
		 * cannot recover on these archive device types
771
		 */
772
		io_ok = 0;
773
		break;
774
	}
775
	if (lstrval <= 0) {
776
		paxwarn(1, "Unable to recover from an archive read failure.");
777
		return(-1);
778
	}
779
	paxwarn(0, "Attempting to recover from an archive read failure.");
780
	return(0);
781
}
782
783
/*
784
 * ar_fow()
785
 *	Move the I/O position within the archive forward the specified number of
786
 *	bytes as supported by the device. If we cannot move the requested
787
 *	number of bytes, return the actual number of bytes moved in skipped.
788
 * Return:
789
 *	0 if moved the requested distance, -1 on complete failure, 1 on
790
 *	partial move (the amount moved is in skipped)
791
 */
792
793
int
794
ar_fow(off_t sksz, off_t *skipped)
795
{
796
	off_t cpos;
797
	off_t mpos;
798
799
	*skipped = 0;
800
	if (sksz <= 0)
801
		return(0);
802
803
	/*
804
	 * we cannot move forward at EOF or error
805
	 */
806
	if (lstrval <= 0)
807
		return(lstrval);
808
809
	/*
810
	 * Safer to read forward on devices where it is hard to find the end of
811
	 * the media without reading to it. With tapes we cannot be sure of the
812
	 * number of physical blocks to skip (we do not know physical block
813
	 * size at this point), so we must only read forward on tapes!
814
	 */
815
	if (artyp != ISREG)
816
		return(0);
817
818
	/*
819
	 * figure out where we are in the archive
820
	 */
821
	if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) >= 0) {
822
		/*
823
		 * we can be asked to move farther than there are bytes in this
824
		 * volume, if so, just go to file end and let normal buf_fill()
825
		 * deal with the end of file (it will go to next volume by
826
		 * itself)
827
		 */
828
		if ((mpos = cpos + sksz) > arsb.st_size) {
829
			*skipped = arsb.st_size - cpos;
830
			mpos = arsb.st_size;
831
		} else
832
			*skipped = sksz;
833
		if (lseek(arfd, mpos, SEEK_SET) >= 0)
834
			return(0);
835
	}
836
	syswarn(1, errno, "Forward positioning operation on archive failed");
837
	lstrval = -1;
838
	return(-1);
839
}
840
841
/*
842
 * ar_rev()
843
 *	move the i/o position within the archive backwards the specified byte
844
 *	count as supported by the device. With tapes drives we RESET rdblksz to
845
 *	the PHYSICAL blocksize.
846
 *	NOTE: We should only be called to move backwards so we can rewrite the
847
 *	last records (the trailer) of an archive (APPEND).
848
 * Return:
849
 *	0 if moved the requested distance, -1 on complete failure
850
 */
851
852
int
853
ar_rev(off_t sksz)
854
12
{
855
	off_t cpos;
856
	struct mtop mb;
857
	int phyblk;
858
859
	/*
860
	 * make sure we do not have try to reverse on a flawed archive
861
	 */
862
12
	if (lstrval < 0)
863
		return(lstrval);
864
865
12
	switch (artyp) {
866
	case ISPIPE:
867
		if (sksz <= 0)
868
			break;
869
		/*
870
		 * cannot go backwards on these critters
871
		 */
872
		paxwarn(1, "Reverse positioning on pipes is not supported.");
873
		lstrval = -1;
874
		return(-1);
875
	case ISREG:
876
	case ISBLK:
877
	case ISCHR:
878
	default:
879
12
		if (sksz <= 0)
880
			break;
881
882
		/*
883
		 * For things other than files, backwards movement has a very
884
		 * high probability of failure as we really do not know the
885
		 * true attributes of the device we are talking to (the device
886
		 * may not even have the ability to lseek() in any direction).
887
		 * First we figure out where we are in the archive.
888
		 */
889
12
		if ((cpos = lseek(arfd, (off_t)0L, SEEK_CUR)) < 0) {
890
			syswarn(1, errno,
891
			   "Unable to obtain current archive byte offset");
892
			lstrval = -1;
893
			return(-1);
894
		}
895
896
		/*
897
		 * we may try to go backwards past the start when the archive
898
		 * is only a single record. If this happens and we are on a
899
		 * multi-volume archive, we need to go to the end of the
900
		 * previous volume and continue our movement backwards from
901
		 * there.
902
		 */
903
12
		if ((cpos -= sksz) < (off_t)0L) {
904
			if (arvol > 1) {
905
				/*
906
				 * this should never happen
907
				 */
908
				paxwarn(1,"Reverse position on previous volume.");
909
				lstrval = -1;
910
				return(-1);
911
			}
912
			cpos = (off_t)0L;
913
		}
914
12
		if (lseek(arfd, cpos, SEEK_SET) < 0) {
915
			syswarn(1, errno, "Unable to seek archive backwards");
916
			lstrval = -1;
917
			return(-1);
918
		}
919
		break;
920
	case ISTAPE:
921
		/*
922
		 * Calculate and move the proper number of PHYSICAL tape
923
		 * blocks. If the sksz is not an even multiple of the physical
924
		 * tape size, we cannot do the move (this should never happen).
925
		 * (We also cannot handle trailers spread over two vols.)
926
		 * get_phys() also makes sure we are in front of the filemark.
927
		 */
928
		if ((phyblk = get_phys()) <= 0) {
929
			lstrval = -1;
930
			return(-1);
931
		}
932
933
		/*
934
		 * make sure future tape reads only go by physical tape block
935
		 * size (set rdblksz to the real size).
936
		 */
937
		rdblksz = phyblk;
938
939
		/*
940
		 * if no movement is required, just return (we must be after
941
		 * get_phys() so the physical blocksize is properly set)
942
		 */
943
		if (sksz <= 0)
944
			break;
945
946
		/*
947
		 * ok we have to move. Make sure the tape drive can do it.
948
		 */
949
		if (sksz % phyblk) {
950
			paxwarn(1,
951
			    "Tape drive unable to backspace requested amount");
952
			lstrval = -1;
953
			return(-1);
954
		}
955
956
		/*
957
		 * move backwards the requested number of bytes
958
		 */
959
		mb.mt_op = MTBSR;
960
		mb.mt_count = sksz/phyblk;
961
		if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
962
			syswarn(1,errno, "Unable to backspace tape %d blocks.",
963
			    mb.mt_count);
964
			lstrval = -1;
965
			return(-1);
966
		}
967
		break;
968
	}
969
12
	lstrval = 1;
970
12
	return(0);
971
}
972
973
/*
974
 * get_phys()
975
 *	Determine the physical block size on a tape drive. We need the physical
976
 *	block size so we know how many bytes we skip over when we move with
977
 *	mtio commands. We also make sure we are BEFORE THE TAPE FILEMARK when
978
 *	return.
979
 *	This is one really SLOW routine...
980
 * Return:
981
 *	physical block size if ok (ok > 0), -1 otherwise
982
 */
983
984
static int
985
get_phys(void)
986
{
987
	int padsz = 0;
988
	int res;
989
	int phyblk;
990
	struct mtop mb;
991
	char scbuf[MAXBLK];
992
993
	/*
994
	 * move to the file mark, and then back up one record and read it.
995
	 * this should tell us the physical record size the tape is using.
996
	 */
997
	if (lstrval == 1) {
998
		/*
999
		 * we know we are at file mark when we get back a 0 from
1000
		 * read()
1001
		 */
1002
		while ((res = read(arfd, scbuf, sizeof(scbuf))) > 0)
1003
			padsz += res;
1004
		if (res < 0) {
1005
			syswarn(1, errno, "Unable to locate tape filemark.");
1006
			return(-1);
1007
		}
1008
	}
1009
1010
	/*
1011
	 * move backwards over the file mark so we are at the end of the
1012
	 * last record.
1013
	 */
1014
	mb.mt_op = MTBSF;
1015
	mb.mt_count = 1;
1016
	if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
1017
		syswarn(1, errno, "Unable to backspace over tape filemark.");
1018
		return(-1);
1019
	}
1020
1021
	/*
1022
	 * move backwards so we are in front of the last record and read it to
1023
	 * get physical tape blocksize.
1024
	 */
1025
	mb.mt_op = MTBSR;
1026
	mb.mt_count = 1;
1027
	if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
1028
		syswarn(1, errno, "Unable to backspace over last tape block.");
1029
		return(-1);
1030
	}
1031
	if ((phyblk = read(arfd, scbuf, sizeof(scbuf))) <= 0) {
1032
		syswarn(1, errno, "Cannot determine archive tape blocksize.");
1033
		return(-1);
1034
	}
1035
1036
	/*
1037
	 * read forward to the file mark, then back up in front of the filemark
1038
	 * (this is a bit paranoid, but should be safe to do).
1039
	 */
1040
	while ((res = read(arfd, scbuf, sizeof(scbuf))) > 0)
1041
		continue;
1042
	if (res < 0) {
1043
		syswarn(1, errno, "Unable to locate tape filemark.");
1044
		return(-1);
1045
	}
1046
	mb.mt_op = MTBSF;
1047
	mb.mt_count = 1;
1048
	if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
1049
		syswarn(1, errno, "Unable to backspace over tape filemark.");
1050
		return(-1);
1051
	}
1052
1053
	/*
1054
	 * set lstrval so we know that the filemark has not been seen
1055
	 */
1056
	lstrval = 1;
1057
1058
	/*
1059
	 * return if there was no padding
1060
	 */
1061
	if (padsz == 0)
1062
		return(phyblk);
1063
1064
	/*
1065
	 * make sure we can move backwards over the padding. (this should
1066
	 * never fail).
1067
	 */
1068
	if (padsz % phyblk) {
1069
		paxwarn(1, "Tape drive unable to backspace requested amount");
1070
		return(-1);
1071
	}
1072
1073
	/*
1074
	 * move backwards over the padding so the head is where it was when
1075
	 * we were first called (if required).
1076
	 */
1077
	mb.mt_op = MTBSR;
1078
	mb.mt_count = padsz/phyblk;
1079
	if (ioctl(arfd, MTIOCTOP, &mb) < 0) {
1080
		syswarn(1,errno,"Unable to backspace tape over %d pad blocks",
1081
		    mb.mt_count);
1082
		return(-1);
1083
	}
1084
	return(phyblk);
1085
}
1086
1087
/*
1088
 * ar_next()
1089
 *	prompts the user for the next volume in this archive. For some devices
1090
 *	we may allow the media to be changed. Otherwise a new archive is
1091
 *	prompted for. By pax spec, if there is no controlling tty or an eof is
1092
 *	read on tty input, we must quit pax.
1093
 * Return:
1094
 *	0 when ready to continue, -1 when all done
1095
 */
1096
1097
int
1098
ar_next(void)
1099
2
{
1100
	char buf[PAXPATHLEN+2];
1101
	static int freeit = 0;
1102
	sigset_t o_mask;
1103
1104
	/*
1105
	 * WE MUST CLOSE THE DEVICE. A lot of devices must see last close, (so
1106
	 * things like writing EOF etc will be done) (Watch out ar_close() can
1107
	 * also be called via a signal handler, so we must prevent a race.
1108
	 */
1109
2
	if (sigprocmask(SIG_BLOCK, &s_mask, &o_mask) < 0)
1110
		syswarn(0, errno, "Unable to set signal mask");
1111
2
	ar_close(0);
1112
2
	if (sigprocmask(SIG_SETMASK, &o_mask, NULL) < 0)
1113
		syswarn(0, errno, "Unable to restore signal mask");
1114
1115


2
	if (done || !wr_trail || force_one_volume || strcmp(NM_TAR, argv0) == 0)
1116
2
		return(-1);
1117
1118
	tty_prnt("\nATTENTION! %s archive volume change required.\n", argv0);
1119
1120
	/*
1121
	 * if i/o is on stdin or stdout, we cannot reopen it (we do not know
1122
	 * the name), the user will be forced to type it in.
1123
	 */
1124
	if (strcmp(arcname, STDO) && strcmp(arcname, STDN) && (artyp != ISREG)
1125
	    && (artyp != ISPIPE)) {
1126
		if (artyp == ISTAPE) {
1127
			tty_prnt("%s ready for archive tape volume: %d\n",
1128
				arcname, arvol);
1129
			tty_prnt("Load the NEXT TAPE on the tape drive");
1130
		} else {
1131
			tty_prnt("%s ready for archive volume: %d\n",
1132
				arcname, arvol);
1133
			tty_prnt("Load the NEXT STORAGE MEDIA (if required)");
1134
		}
1135
1136
		if ((act == ARCHIVE) || (act == APPND))
1137
			tty_prnt(" and make sure it is WRITE ENABLED.\n");
1138
		else
1139
			tty_prnt("\n");
1140
1141
		for (;;) {
1142
			tty_prnt("Type \"y\" to continue, \".\" to quit %s,",
1143
				argv0);
1144
			tty_prnt(" or \"s\" to switch to new device.\nIf you");
1145
			tty_prnt(" cannot change storage media, type \"s\"\n");
1146
			tty_prnt("Is the device ready and online? > ");
1147
1148
			if ((tty_read(buf,sizeof(buf))<0) || !strcmp(buf,".")){
1149
				done = 1;
1150
				lstrval = -1;
1151
				tty_prnt("Quitting %s!\n", argv0);
1152
				vfpart = 0;
1153
				return(-1);
1154
			}
1155
1156
			if ((buf[0] == '\0') || (buf[1] != '\0')) {
1157
				tty_prnt("%s unknown command, try again\n",buf);
1158
				continue;
1159
			}
1160
1161
			switch (buf[0]) {
1162
			case 'y':
1163
			case 'Y':
1164
				/*
1165
				 * we are to continue with the same device
1166
				 */
1167
				if (ar_open(arcname) >= 0)
1168
					return(0);
1169
				tty_prnt("Cannot re-open %s, try again\n",
1170
					arcname);
1171
				continue;
1172
			case 's':
1173
			case 'S':
1174
				/*
1175
				 * user wants to open a different device
1176
				 */
1177
				tty_prnt("Switching to a different archive\n");
1178
				break;
1179
			default:
1180
				tty_prnt("%s unknown command, try again\n",buf);
1181
				continue;
1182
			}
1183
			break;
1184
		}
1185
	} else
1186
		tty_prnt("Ready for archive volume: %d\n", arvol);
1187
1188
	/*
1189
	 * have to go to a different archive
1190
	 */
1191
	for (;;) {
1192
		tty_prnt("Input archive name or \".\" to quit %s.\n", argv0);
1193
		tty_prnt("Archive name > ");
1194
1195
		if ((tty_read(buf, sizeof(buf)) < 0) || !strcmp(buf, ".")) {
1196
			done = 1;
1197
			lstrval = -1;
1198
			tty_prnt("Quitting %s!\n", argv0);
1199
			vfpart = 0;
1200
			return(-1);
1201
		}
1202
		if (buf[0] == '\0') {
1203
			tty_prnt("Empty file name, try again\n");
1204
			continue;
1205
		}
1206
		if (!strcmp(buf, "..")) {
1207
			tty_prnt("Illegal file name: .. try again\n");
1208
			continue;
1209
		}
1210
		if (strlen(buf) > PAXPATHLEN) {
1211
			tty_prnt("File name too long, try again\n");
1212
			continue;
1213
		}
1214
1215
		/*
1216
		 * try to open new archive
1217
		 */
1218
		if (ar_open(buf) >= 0) {
1219
			if (freeit) {
1220
				free((char *)arcname);
1221
				freeit = 0;
1222
			}
1223
			if ((arcname = strdup(buf)) == NULL) {
1224
				done = 1;
1225
				lstrval = -1;
1226
				paxwarn(0, "Cannot save archive name.");
1227
				return(-1);
1228
			}
1229
			freeit = 1;
1230
			break;
1231
		}
1232
		tty_prnt("Cannot open %s, try again\n", buf);
1233
		continue;
1234
	}
1235
	return(0);
1236
}
1237
1238
/*
1239
 * ar_start_gzip()
1240
 * starts the gzip compression/decompression process as a child, using magic
1241
 * to keep the fd the same in the calling function (parent).
1242
 */
1243
void
1244
ar_start_gzip(int fd, const char *path, int wr)
1245
6
{
1246
	int fds[2];
1247
	const char *gzip_flags;
1248
1249
6
	if (pipe(fds) < 0)
1250
		err(1, "could not pipe");
1251
6
	zpid = fork();
1252
12
	if (zpid < 0)
1253
		err(1, "could not fork");
1254
1255
	/* parent */
1256
12
	if (zpid) {
1257
6
		if (wr)
1258
			dup2(fds[1], fd);
1259
		else
1260
6
			dup2(fds[0], fd);
1261
6
		close(fds[0]);
1262
6
		close(fds[1]);
1263
1264

6
		if (pmode == 0 || (act != EXTRACT && act != COPY)) {
1265
6
		    if (pledge("stdio rpath wpath cpath fattr dpath getpw ioctl proc",
1266
			NULL) == -1)
1267
				err(1, "pledge");
1268
		}
1269
	} else {
1270
6
		if (wr) {
1271
			dup2(fds[0], STDIN_FILENO);
1272
			dup2(fd, STDOUT_FILENO);
1273
			gzip_flags = "-c";
1274
		} else {
1275
6
			dup2(fds[1], STDOUT_FILENO);
1276
6
			dup2(fd, STDIN_FILENO);
1277
6
			gzip_flags = "-dc";
1278
		}
1279
6
		close(fds[0]);
1280
6
		close(fds[1]);
1281
1282
		/* System compressors are more likely to use pledge(2) */
1283
6
		putenv("PATH=/usr/bin:/usr/local/bin");
1284
1285
6
		if (execlp(path, path, gzip_flags, (char *)NULL) < 0)
1286
			err(1, "could not exec %s", path);
1287
		/* NOTREACHED */
1288
	}
1289
6
}