xref: /plan9-contrib/sys/src/ape/cmd/pax/pax.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier /* $Source: /u/mark/src/pax/RCS/pax.h,v $
2*9a747e4fSDavid du Colombier  *
3*9a747e4fSDavid du Colombier  * $Revision: 1.2 $
4*9a747e4fSDavid du Colombier  *
5*9a747e4fSDavid du Colombier  * pax.h - defnitions for entire program
6*9a747e4fSDavid du Colombier  *
7*9a747e4fSDavid du Colombier  * DESCRIPTION
8*9a747e4fSDavid du Colombier  *
9*9a747e4fSDavid du Colombier  *	This file contains most all of the definitions required by the PAX
10*9a747e4fSDavid du Colombier  *	software.  This header is included in every source file.
11*9a747e4fSDavid du Colombier  *
12*9a747e4fSDavid du Colombier  * AUTHOR
13*9a747e4fSDavid du Colombier  *
14*9a747e4fSDavid du Colombier  *     Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
15*9a747e4fSDavid du Colombier  *
16*9a747e4fSDavid du Colombier  * Sponsored by The USENIX Association for public distribution.
17*9a747e4fSDavid du Colombier  *
18*9a747e4fSDavid du Colombier  * Copyright (c) 1989 Mark H. Colburn.
19*9a747e4fSDavid du Colombier  * All rights reserved.
20*9a747e4fSDavid du Colombier  *
21*9a747e4fSDavid du Colombier  * Redistribution and use in source and binary forms are permitted
22*9a747e4fSDavid du Colombier  * provided that the above copyright notice and this paragraph are
23*9a747e4fSDavid du Colombier  * duplicated in all such forms and that any documentation,
24*9a747e4fSDavid du Colombier  * advertising materials, and other materials related to such
25*9a747e4fSDavid du Colombier  * distribution and use acknowledge that the software was developed
26*9a747e4fSDavid du Colombier  * by Mark H. Colburn and sponsored by The USENIX Association.
27*9a747e4fSDavid du Colombier  *
28*9a747e4fSDavid du Colombier  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
29*9a747e4fSDavid du Colombier  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
30*9a747e4fSDavid du Colombier  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
31*9a747e4fSDavid du Colombier  */
32*9a747e4fSDavid du Colombier 
33*9a747e4fSDavid du Colombier #ifndef _PAX_H
34*9a747e4fSDavid du Colombier #define _PAX_H
35*9a747e4fSDavid du Colombier 
36*9a747e4fSDavid du Colombier /* Headers */
37*9a747e4fSDavid du Colombier 
38*9a747e4fSDavid du Colombier #include "config.h"
39*9a747e4fSDavid du Colombier #include "limits.h"
40*9a747e4fSDavid du Colombier #include <stdio.h>
41*9a747e4fSDavid du Colombier #include <errno.h>
42*9a747e4fSDavid du Colombier #include <signal.h>
43*9a747e4fSDavid du Colombier #include <ctype.h>
44*9a747e4fSDavid du Colombier #include <sys/types.h>
45*9a747e4fSDavid du Colombier #ifndef _POSIX_SOURCE
46*9a747e4fSDavid du Colombier #include <sys/ioctl.h>
47*9a747e4fSDavid du Colombier #endif
48*9a747e4fSDavid du Colombier #include <sys/stat.h>
49*9a747e4fSDavid du Colombier #include "regexp.h"
50*9a747e4fSDavid du Colombier 
51*9a747e4fSDavid du Colombier #if defined(DIRENT) || defined(_POSIX_SOURCE)
52*9a747e4fSDavid du Colombier # ifdef PAXDIR
53*9a747e4fSDavid du Colombier #  include "paxdir.h"
54*9a747e4fSDavid du Colombier # else
55*9a747e4fSDavid du Colombier #  include <dirent.h>
56*9a747e4fSDavid du Colombier # endif
57*9a747e4fSDavid du Colombier #else
58*9a747e4fSDavid du Colombier # ifdef hpux
59*9a747e4fSDavid du Colombier #  include <ndir.h>
60*9a747e4fSDavid du Colombier # else
61*9a747e4fSDavid du Colombier #  ifdef XENIX_286
62*9a747e4fSDavid du Colombier #   include <sys/ndir.h>
63*9a747e4fSDavid du Colombier #  else XENIX_286
64*9a747e4fSDavid du Colombier #   include <sys/dir.h>
65*9a747e4fSDavid du Colombier #  endif XENIX_286
66*9a747e4fSDavid du Colombier # endif /* hpux */
67*9a747e4fSDavid du Colombier # define dirent direct
68*9a747e4fSDavid du Colombier #endif
69*9a747e4fSDavid du Colombier 
70*9a747e4fSDavid du Colombier #ifdef _POSIX_SOURCE
71*9a747e4fSDavid du Colombier #define major(x)	0
72*9a747e4fSDavid du Colombier #define minor(x)	0
73*9a747e4fSDavid du Colombier #else
74*9a747e4fSDavid du Colombier #ifndef	major
75*9a747e4fSDavid du Colombier #   include <sys/sysmacros.h>
76*9a747e4fSDavid du Colombier #endif				/* major */
77*9a747e4fSDavid du Colombier #endif
78*9a747e4fSDavid du Colombier 
79*9a747e4fSDavid du Colombier #ifdef	SYSTIME
80*9a747e4fSDavid du Colombier #   include <sys/time.h>
81*9a747e4fSDavid du Colombier #else				/* SYSTIME */
82*9a747e4fSDavid du Colombier #   include <time.h>
83*9a747e4fSDavid du Colombier #endif				/* SYSTIME */
84*9a747e4fSDavid du Colombier 
85*9a747e4fSDavid du Colombier #ifndef V7
86*9a747e4fSDavid du Colombier #   include <fcntl.h>
87*9a747e4fSDavid du Colombier #endif
88*9a747e4fSDavid du Colombier 
89*9a747e4fSDavid du Colombier #ifdef XENIX
90*9a747e4fSDavid du Colombier #   include <sys/inode.h>
91*9a747e4fSDavid du Colombier #endif
92*9a747e4fSDavid du Colombier #ifdef XENIX_286
93*9a747e4fSDavid du Colombier #include <sys/param.h>
94*9a747e4fSDavid du Colombier #endif XENIX_286
95*9a747e4fSDavid du Colombier 
96*9a747e4fSDavid du Colombier #include <pwd.h>
97*9a747e4fSDavid du Colombier #include <grp.h>
98*9a747e4fSDavid du Colombier #ifndef XENIX_286
99*9a747e4fSDavid du Colombier #ifndef _POSIX_SOURCE
100*9a747e4fSDavid du Colombier #include <sys/file.h>
101*9a747e4fSDavid du Colombier #endif
102*9a747e4fSDavid du Colombier #endif /* XENIX_286 */
103*9a747e4fSDavid du Colombier 
104*9a747e4fSDavid du Colombier #ifdef _POSIX_SOURCE
105*9a747e4fSDavid du Colombier #include <unistd.h>
106*9a747e4fSDavid du Colombier #include <stdlib.h>
107*9a747e4fSDavid du Colombier #endif
108*9a747e4fSDavid du Colombier 
109*9a747e4fSDavid du Colombier /* Defines */
110*9a747e4fSDavid du Colombier 
111*9a747e4fSDavid du Colombier #define	STDIN	0		/* Standard input  file descriptor */
112*9a747e4fSDavid du Colombier #define	STDOUT	1		/* Standard output file descriptor */
113*9a747e4fSDavid du Colombier 
114*9a747e4fSDavid du Colombier /*
115*9a747e4fSDavid du Colombier  * Open modes; there is no <fcntl.h> with v7 UNIX and other versions of
116*9a747e4fSDavid du Colombier  * UNIX may not have all of these defined...
117*9a747e4fSDavid du Colombier  */
118*9a747e4fSDavid du Colombier 
119*9a747e4fSDavid du Colombier #ifndef O_RDONLY
120*9a747e4fSDavid du Colombier #   define	O_RDONLY	0
121*9a747e4fSDavid du Colombier #endif
122*9a747e4fSDavid du Colombier 
123*9a747e4fSDavid du Colombier #ifndef O_WRONLY
124*9a747e4fSDavid du Colombier #   define	O_WRONLY	1
125*9a747e4fSDavid du Colombier #endif
126*9a747e4fSDavid du Colombier 
127*9a747e4fSDavid du Colombier #ifndef O_RDWR
128*9a747e4fSDavid du Colombier #   define	O_WRONLY	2
129*9a747e4fSDavid du Colombier #endif
130*9a747e4fSDavid du Colombier 
131*9a747e4fSDavid du Colombier #ifndef	O_BINARY
132*9a747e4fSDavid du Colombier #   define	O_BINARY	0
133*9a747e4fSDavid du Colombier #endif
134*9a747e4fSDavid du Colombier 
135*9a747e4fSDavid du Colombier #ifndef NULL
136*9a747e4fSDavid du Colombier #   define 	NULL 		0
137*9a747e4fSDavid du Colombier #endif
138*9a747e4fSDavid du Colombier 
139*9a747e4fSDavid du Colombier #define TMAGIC		"ustar"		/* ustar and a null */
140*9a747e4fSDavid du Colombier #define TMAGLEN		6
141*9a747e4fSDavid du Colombier #define TVERSION	"00"		/* 00 and no null */
142*9a747e4fSDavid du Colombier #define TVERSLEN	2
143*9a747e4fSDavid du Colombier 
144*9a747e4fSDavid du Colombier /* Values used in typeflag field */
145*9a747e4fSDavid du Colombier #define REGTYPE		'0'		/* Regular File */
146*9a747e4fSDavid du Colombier #define AREGTYPE	'\0'		/* Regular File */
147*9a747e4fSDavid du Colombier #define LNKTYPE		'1'		/* Link */
148*9a747e4fSDavid du Colombier #define SYMTYPE		'2'		/* Reserved */
149*9a747e4fSDavid du Colombier #define CHRTYPE		'3'		/* Character Special File */
150*9a747e4fSDavid du Colombier #define BLKTYPE		'4'		/* Block Special File */
151*9a747e4fSDavid du Colombier #define DIRTYPE		'5'		/* Directory */
152*9a747e4fSDavid du Colombier #define FIFOTYPE	'6'		/* FIFO */
153*9a747e4fSDavid du Colombier #define CONTTYPE	'7'		/* Reserved */
154*9a747e4fSDavid du Colombier 
155*9a747e4fSDavid du Colombier #define BLOCKSIZE	512	/* all output is padded to 512 bytes */
156*9a747e4fSDavid du Colombier #define	uint	unsigned int	/* Not always in types.h */
157*9a747e4fSDavid du Colombier #define	ushort	unsigned short	/* Not always in types.h */
158*9a747e4fSDavid du Colombier #define	BLOCK	5120		/* Default archive block size */
159*9a747e4fSDavid du Colombier #define	H_COUNT	10		/* Number of items in ASCII header */
160*9a747e4fSDavid du Colombier #define	H_PRINT	"%06o%06o%06o%06o%06o%06o%06o%011lo%06o%011lo"
161*9a747e4fSDavid du Colombier #define	H_SCAN	"%6ho%6ho%6ho%6ho%6ho%6ho%6ho%11lo%6o%11lo"
162*9a747e4fSDavid du Colombier #define	H_STRLEN 70		/* ASCII header string length */
163*9a747e4fSDavid du Colombier #define	M_ASCII "070707"	/* ASCII magic number */
164*9a747e4fSDavid du Colombier #define	M_BINARY 070707		/* Binary magic number */
165*9a747e4fSDavid du Colombier #define	M_STRLEN 6		/* ASCII magic number length */
166*9a747e4fSDavid du Colombier #define	PATHELEM 256		/* Pathname element count limit */
167*9a747e4fSDavid du Colombier #define	S_IFSHF	12		/* File type shift (shb in stat.h) */
168*9a747e4fSDavid du Colombier #define	S_IPERM	07777		/* File permission bits (shb in stat.h) */
169*9a747e4fSDavid du Colombier #define	S_IPEXE	07000		/* Special execution bits (shb in stat.h) */
170*9a747e4fSDavid du Colombier #define	S_IPOPN	0777		/* Open access bits (shb in stat.h) */
171*9a747e4fSDavid du Colombier 
172*9a747e4fSDavid du Colombier #ifdef _POSIX_SOURCE
173*9a747e4fSDavid du Colombier /* hack: depend on knowing bits out of stat.h for S_ISREG, etc. */
174*9a747e4fSDavid du Colombier #define S_IFMT	0170000
175*9a747e4fSDavid du Colombier #define S_IFREG	0100000
176*9a747e4fSDavid du Colombier #define S_IFDIR	0040000
177*9a747e4fSDavid du Colombier #define S_IFCHR	0020000
178*9a747e4fSDavid du Colombier #define S_IFBLK 0060000
179*9a747e4fSDavid du Colombier #define S_IFIFO 0010000
180*9a747e4fSDavid du Colombier #endif
181*9a747e4fSDavid du Colombier 
182*9a747e4fSDavid du Colombier /*
183*9a747e4fSDavid du Colombier  * Trailer pathnames. All must be of the same length.
184*9a747e4fSDavid du Colombier  */
185*9a747e4fSDavid du Colombier #define	TRAILER	"TRAILER!!!"	/* Archive trailer (cpio compatible) */
186*9a747e4fSDavid du Colombier #define	TRAILZ	11		/* Trailer pathname length (including null) */
187*9a747e4fSDavid du Colombier 
188*9a747e4fSDavid du Colombier #include "port.h"
189*9a747e4fSDavid du Colombier 
190*9a747e4fSDavid du Colombier 
191*9a747e4fSDavid du Colombier #define	TAR		1
192*9a747e4fSDavid du Colombier #define	CPIO		2
193*9a747e4fSDavid du Colombier #define	PAX		3
194*9a747e4fSDavid du Colombier 
195*9a747e4fSDavid du Colombier #define AR_READ 	0
196*9a747e4fSDavid du Colombier #define AR_WRITE 	1
197*9a747e4fSDavid du Colombier #define AR_EXTRACT	2
198*9a747e4fSDavid du Colombier #define AR_APPEND 	4
199*9a747e4fSDavid du Colombier 
200*9a747e4fSDavid du Colombier /*
201*9a747e4fSDavid du Colombier  * Header block on tape.
202*9a747e4fSDavid du Colombier  */
203*9a747e4fSDavid du Colombier #define	NAMSIZ		100
204*9a747e4fSDavid du Colombier #define	PFIXSIZ		155
205*9a747e4fSDavid du Colombier #define	TUNMLEN		32
206*9a747e4fSDavid du Colombier #define	TGNMLEN		32
207*9a747e4fSDavid du Colombier 
208*9a747e4fSDavid du Colombier /* The checksum field is filled with this while the checksum is computed. */
209*9a747e4fSDavid du Colombier #define	CHKBLANKS	"        "	/* 8 blanks, no null */
210*9a747e4fSDavid du Colombier 
211*9a747e4fSDavid du Colombier /*
212*9a747e4fSDavid du Colombier  * Exit codes from the "tar" program
213*9a747e4fSDavid du Colombier  */
214*9a747e4fSDavid du Colombier #define	EX_SUCCESS	0	/* success! */
215*9a747e4fSDavid du Colombier #define	EX_ARGSBAD	1	/* invalid args */
216*9a747e4fSDavid du Colombier #define	EX_BADFILE	2	/* invalid filename */
217*9a747e4fSDavid du Colombier #define	EX_BADARCH	3	/* bad archive */
218*9a747e4fSDavid du Colombier #define	EX_SYSTEM	4	/* system gave unexpected error */
219*9a747e4fSDavid du Colombier 
220*9a747e4fSDavid du Colombier #define	ROUNDUP(a,b) 	(((a) % (b)) == 0 ? (a) : ((a) + ((b) - ((a) % (b)))))
221*9a747e4fSDavid du Colombier 
222*9a747e4fSDavid du Colombier /*
223*9a747e4fSDavid du Colombier  * Mininum value.
224*9a747e4fSDavid du Colombier  */
225*9a747e4fSDavid du Colombier #define	MIN(a, b)	(((a) < (b)) ? (a) : (b))
226*9a747e4fSDavid du Colombier 
227*9a747e4fSDavid du Colombier /*
228*9a747e4fSDavid du Colombier  * Remove a file or directory.
229*9a747e4fSDavid du Colombier  */
230*9a747e4fSDavid du Colombier #ifdef _POSIX_SOURCE
231*9a747e4fSDavid du Colombier #define	REMOVE(name, asb) \
232*9a747e4fSDavid du Colombier 	(S_ISDIR((asb)->sb_mode)? rmdir(name) : unlink(name))
233*9a747e4fSDavid du Colombier #else
234*9a747e4fSDavid du Colombier #define	REMOVE(name, asb) \
235*9a747e4fSDavid du Colombier 	(((asb)->sb_mode & S_IFMT) == S_IFDIR ? rmdir(name) : unlink(name))
236*9a747e4fSDavid du Colombier #endif
237*9a747e4fSDavid du Colombier 
238*9a747e4fSDavid du Colombier /*
239*9a747e4fSDavid du Colombier  * Cast and reduce to unsigned short.
240*9a747e4fSDavid du Colombier  */
241*9a747e4fSDavid du Colombier #define	USH(n)		(((ushort) (n)) & 0177777)
242*9a747e4fSDavid du Colombier 
243*9a747e4fSDavid du Colombier 
244*9a747e4fSDavid du Colombier /* Type Definitions */
245*9a747e4fSDavid du Colombier 
246*9a747e4fSDavid du Colombier /*
247*9a747e4fSDavid du Colombier  * Binary archive header (obsolete).
248*9a747e4fSDavid du Colombier  */
249*9a747e4fSDavid du Colombier typedef struct {
250*9a747e4fSDavid du Colombier     short           b_dev;	/* Device code */
251*9a747e4fSDavid du Colombier     ushort          b_ino;	/* Inode number */
252*9a747e4fSDavid du Colombier     ushort          b_mode;	/* Type and permissions */
253*9a747e4fSDavid du Colombier     ushort          b_uid;	/* Owner */
254*9a747e4fSDavid du Colombier     ushort          b_gid;	/* Group */
255*9a747e4fSDavid du Colombier     short           b_nlink;	/* Number of links */
256*9a747e4fSDavid du Colombier     short           b_rdev;	/* Real device */
257*9a747e4fSDavid du Colombier     ushort          b_mtime[2];	/* Modification time (hi/lo) */
258*9a747e4fSDavid du Colombier     ushort          b_name;	/* Length of pathname (with null) */
259*9a747e4fSDavid du Colombier     ushort          b_size[2];	/* Length of data */
260*9a747e4fSDavid du Colombier } Binary;
261*9a747e4fSDavid du Colombier 
262*9a747e4fSDavid du Colombier /*
263*9a747e4fSDavid du Colombier  * File status with symbolic links. Kludged to hold symbolic link pathname
264*9a747e4fSDavid du Colombier  * within structure.
265*9a747e4fSDavid du Colombier  */
266*9a747e4fSDavid du Colombier typedef struct {
267*9a747e4fSDavid du Colombier     struct stat     sb_stat;
268*9a747e4fSDavid du Colombier     char            sb_link[PATH_MAX + 1];
269*9a747e4fSDavid du Colombier } Stat;
270*9a747e4fSDavid du Colombier 
271*9a747e4fSDavid du Colombier #define	STAT(name, asb)		stat(name, &(asb)->sb_stat)
272*9a747e4fSDavid du Colombier #define	FSTAT(fd, asb)		fstat(fd, &(asb)->sb_stat)
273*9a747e4fSDavid du Colombier 
274*9a747e4fSDavid du Colombier #define	sb_dev		sb_stat.st_dev
275*9a747e4fSDavid du Colombier #define	sb_ino		sb_stat.st_ino
276*9a747e4fSDavid du Colombier #define	sb_mode		sb_stat.st_mode
277*9a747e4fSDavid du Colombier #define	sb_nlink	sb_stat.st_nlink
278*9a747e4fSDavid du Colombier #define	sb_uid		sb_stat.st_uid
279*9a747e4fSDavid du Colombier #define	sb_gid		sb_stat.st_gid
280*9a747e4fSDavid du Colombier #define	sb_rdev		sb_stat.st_rdev
281*9a747e4fSDavid du Colombier #define	sb_size		sb_stat.st_size
282*9a747e4fSDavid du Colombier #define	sb_atime	sb_stat.st_atime
283*9a747e4fSDavid du Colombier #define	sb_mtime	sb_stat.st_mtime
284*9a747e4fSDavid du Colombier #define	sb_ctime	sb_stat.st_ctime
285*9a747e4fSDavid du Colombier 
286*9a747e4fSDavid du Colombier #ifdef	S_IFLNK
287*9a747e4fSDavid du Colombier #	define	LSTAT(name, asb)	lstat(name, &(asb)->sb_stat)
288*9a747e4fSDavid du Colombier #	define	sb_blksize	sb_stat.st_blksize
289*9a747e4fSDavid du Colombier #	define	sb_blocks	sb_stat.st_blocks
290*9a747e4fSDavid du Colombier #else				/* S_IFLNK */
291*9a747e4fSDavid du Colombier /*
292*9a747e4fSDavid du Colombier  * File status without symbolic links.
293*9a747e4fSDavid du Colombier  */
294*9a747e4fSDavid du Colombier #	define	LSTAT(name, asb)	stat(name, &(asb)->sb_stat)
295*9a747e4fSDavid du Colombier #endif				/* S_IFLNK */
296*9a747e4fSDavid du Colombier 
297*9a747e4fSDavid du Colombier /*
298*9a747e4fSDavid du Colombier  * Hard link sources. One or more are chained from each link structure.
299*9a747e4fSDavid du Colombier  */
300*9a747e4fSDavid du Colombier typedef struct name {
301*9a747e4fSDavid du Colombier     struct name    *p_forw;	/* Forward chain (terminated) */
302*9a747e4fSDavid du Colombier     struct name    *p_back;	/* Backward chain (circular) */
303*9a747e4fSDavid du Colombier     char           *p_name;	/* Pathname to link from */
304*9a747e4fSDavid du Colombier } Path;
305*9a747e4fSDavid du Colombier 
306*9a747e4fSDavid du Colombier /*
307*9a747e4fSDavid du Colombier  * File linking information. One entry exists for each unique file with with
308*9a747e4fSDavid du Colombier  * outstanding hard links.
309*9a747e4fSDavid du Colombier  */
310*9a747e4fSDavid du Colombier typedef struct link {
311*9a747e4fSDavid du Colombier     struct link    *l_forw;	/* Forward chain (terminated) */
312*9a747e4fSDavid du Colombier     struct link    *l_back;	/* Backward chain (terminated) */
313*9a747e4fSDavid du Colombier     dev_t           l_dev;	/* Device */
314*9a747e4fSDavid du Colombier     ino_t           l_ino;	/* Inode */
315*9a747e4fSDavid du Colombier     ushort          l_nlink;	/* Unresolved link count */
316*9a747e4fSDavid du Colombier     OFFSET          l_size;	/* Length */
317*9a747e4fSDavid du Colombier     char	   *l_name;	/* pathname to link from */
318*9a747e4fSDavid du Colombier     Path           *l_path;	/* Pathname which link to l_name */
319*9a747e4fSDavid du Colombier } Link;
320*9a747e4fSDavid du Colombier 
321*9a747e4fSDavid du Colombier /*
322*9a747e4fSDavid du Colombier  * Structure for ed-style replacement strings (-s option).
323*9a747e4fSDavid du Colombier */
324*9a747e4fSDavid du Colombier typedef struct replstr {
325*9a747e4fSDavid du Colombier     regexp	   *comp;	/* compiled regular expression */
326*9a747e4fSDavid du Colombier     char	   *replace;	/* replacement string */
327*9a747e4fSDavid du Colombier     char	    print;	/* >0 if we are to print replacement */
328*9a747e4fSDavid du Colombier     char	    global;	/* >0 if we are to replace globally */
329*9a747e4fSDavid du Colombier     struct replstr *next;	/* pointer to next record */
330*9a747e4fSDavid du Colombier } Replstr;
331*9a747e4fSDavid du Colombier 
332*9a747e4fSDavid du Colombier 
333*9a747e4fSDavid du Colombier /*
334*9a747e4fSDavid du Colombier  * This has to be included here to insure that all of the type
335*9a747e4fSDavid du Colombier  * delcarations are declared for the prototypes.
336*9a747e4fSDavid du Colombier  */
337*9a747e4fSDavid du Colombier #ifndef STRERROR
338*9a747e4fSDavid du Colombier /* boofheads have a different interface than standard, so rename */
339*9a747e4fSDavid du Colombier #define strerror xstrerror
340*9a747e4fSDavid du Colombier #endif
341*9a747e4fSDavid du Colombier #include "func.h"
342*9a747e4fSDavid du Colombier 
343*9a747e4fSDavid du Colombier 
344*9a747e4fSDavid du Colombier #ifndef NO_EXTERN
345*9a747e4fSDavid du Colombier /* Globally Available Identifiers */
346*9a747e4fSDavid du Colombier 
347*9a747e4fSDavid du Colombier extern char    *ar_file;
348*9a747e4fSDavid du Colombier extern char    *bufend;
349*9a747e4fSDavid du Colombier extern char    *bufstart;
350*9a747e4fSDavid du Colombier extern char    *bufidx;
351*9a747e4fSDavid du Colombier extern char    *myname;
352*9a747e4fSDavid du Colombier extern int      archivefd;
353*9a747e4fSDavid du Colombier extern int      blocking;
354*9a747e4fSDavid du Colombier extern uint     blocksize;
355*9a747e4fSDavid du Colombier extern int      gid;
356*9a747e4fSDavid du Colombier extern int      head_standard;
357*9a747e4fSDavid du Colombier extern int      ar_interface;
358*9a747e4fSDavid du Colombier extern int      ar_format;
359*9a747e4fSDavid du Colombier extern int      mask;
360*9a747e4fSDavid du Colombier extern int      ttyf;
361*9a747e4fSDavid du Colombier extern int      uid;
362*9a747e4fSDavid du Colombier extern OFFSET    total;
363*9a747e4fSDavid du Colombier extern short    areof;
364*9a747e4fSDavid du Colombier extern short    f_append;
365*9a747e4fSDavid du Colombier extern short    f_create;
366*9a747e4fSDavid du Colombier extern short    f_extract;
367*9a747e4fSDavid du Colombier extern short    f_follow_links;
368*9a747e4fSDavid du Colombier extern short    f_interactive;
369*9a747e4fSDavid du Colombier extern short    f_linksleft;
370*9a747e4fSDavid du Colombier extern short    f_list;
371*9a747e4fSDavid du Colombier extern short    f_modified;
372*9a747e4fSDavid du Colombier extern short    f_verbose;
373*9a747e4fSDavid du Colombier extern short	f_link;
374*9a747e4fSDavid du Colombier extern short	f_owner;
375*9a747e4fSDavid du Colombier extern short	f_access_time;
376*9a747e4fSDavid du Colombier extern short	f_pass;
377*9a747e4fSDavid du Colombier extern short	f_pass;
378*9a747e4fSDavid du Colombier extern short	f_disposition;
379*9a747e4fSDavid du Colombier extern short    f_reverse_match;
380*9a747e4fSDavid du Colombier extern short    f_mtime;
381*9a747e4fSDavid du Colombier extern short    f_dir_create;
382*9a747e4fSDavid du Colombier extern short    f_unconditional;
383*9a747e4fSDavid du Colombier extern short    f_newer;
384*9a747e4fSDavid du Colombier extern time_t   now;
385*9a747e4fSDavid du Colombier extern uint     arvolume;
386*9a747e4fSDavid du Colombier extern int	names_from_stdin;
387*9a747e4fSDavid du Colombier extern Replstr *rplhead;
388*9a747e4fSDavid du Colombier extern Replstr *rpltail;
389*9a747e4fSDavid du Colombier extern char   **n_argv;
390*9a747e4fSDavid du Colombier extern int      n_argc;
391*9a747e4fSDavid du Colombier extern FILE    *msgfile;
392*9a747e4fSDavid du Colombier #endif /* NO_EXTERN */
393*9a747e4fSDavid du Colombier 
394*9a747e4fSDavid du Colombier extern char    *optarg;
395*9a747e4fSDavid du Colombier extern int      optind;
396*9a747e4fSDavid du Colombier #ifndef _POSIX_SOURCE
397*9a747e4fSDavid du Colombier extern int      sys_nerr;
398*9a747e4fSDavid du Colombier extern char    *sys_errlist[];
399*9a747e4fSDavid du Colombier #endif
400*9a747e4fSDavid du Colombier extern int      errno;
401*9a747e4fSDavid du Colombier 
402*9a747e4fSDavid du Colombier #endif /* _PAX_H */
403