1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright (c) 2012 Gary Mills
23 *
24 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25 * Use is subject to license terms.
26 */
27
28/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
29/*	  All Rights Reserved  	*/
30
31#ifndef	_CPIO_H
32#define	_CPIO_H
33
34#ifdef	__cplusplus
35extern "C" {
36#endif
37
38#include <stdio.h>
39#include <archives.h>
40
41/* Option Character keys (OC#), where '#' is the option character specified. */
42
43#define	OCa	0x1
44#define	OCb	0x2
45#define	OCc	0x4
46#define	OCd	0x8
47#define	OCf	0x10
48#define	OCi	0x20
49#define	OCk	0x40
50#define	OCl	0x80
51#define	OCm	0x100
52#define	OCo	0x200
53#define	OCp	0x400
54#define	OCr	0x800
55#define	OCs	0x1000
56#define	OCt	0x2000
57#define	OCu	0x4000
58#define	OCv	0x8000
59#define	OCA	0x10000
60#define	OCB	0x20000
61#define	OCC	0x40000
62#define	OCE	0x80000
63#define	OCH	0x100000
64#define	OCI	0x200000
65#define	OCL	0x400000
66#define	OCM	0x800000
67#define	OCO	0x1000000
68#define	OCR	0x2000000
69#define	OCS	0x4000000
70#define	OCV	0x8000000
71#define	OC6	0x10000000
72#define	BSM	0x20000000
73#define	OCP	0x40000000
74#define	OCq	0x80000000
75
76/* Sparse file support */
77#define	C_ISSPARSE	0200000
78#define	S_IFSPARSE	0x10000
79#define	HIGH_ORD_MASK	0x30000
80#define	S_ISSPARSE(mode) \
81	(S_ISREG(mode) && (mode & HIGH_ORD_MASK) == S_IFSPARSE)
82
83/* Invalid option masks for each action option (-i, -o or -p). */
84
85#define	INV_MSK4i	(OCo | OCp | OCA | OCL | OCO)
86
87#define	INV_MSK4o	(OCi | OCp | OCE | OCI | OCR)
88
89#define	INV_MSK4p	(OCf | OCi | OCo | OCr | OCt | OCA \
90			| OCE | OCH | OCI | OCO)
91
92/* Header types */
93
94#define	NONE	0	/* No header value verified */
95#define	BIN	1	/* Binary */
96#define	CHR	2	/* ASCII character (-c) */
97#define	ASC	3	/* ASCII with expanded maj/min numbers */
98#define	CRC	4	/* CRC with expanded maj/min numbers */
99#define	TARTYP	5	/* Tar or USTAR */
100#define	SECURE	6	/* Secure system */
101
102/* Differentiate between TAR and USTAR */
103
104#define	TAR	7	/* Regular tar */
105#define	USTAR	8	/* IEEE data interchange standard */
106
107#define	ULL_MAX_SIZE	20
108#define	UL_MAX_SIZE	10
109
110/* constants for bar, used for extracting bar archives */
111#define	BAR	9
112#define	BAR_VOLUME_MAGIC	'V'
113#define	BARTYP	7
114#define	BARSZ	512
115#define	BAR_TAPE_SIZE	(126*BARSZ)
116#define	BAR_FLOPPY_SIZE	(18*BARSZ)
117
118/* the pathname lengths for the USTAR header */
119
120#define	MAXNAM	256	/* The maximum pathname length */
121#define	NAMSIZ	100	/* The maximum length of the name field */
122#define	PRESIZ	155	/* The maximum length of the prefix */
123
124/* HDRSZ: header size minus filename field length */
125
126#define	HDRSZ (Hdr.h_name - (char *)&Hdr)
127
128/*
129 * IDENT: Determine if two stat() structures represent identical files.
130 * Assumes that if the device and inode are the same the files are
131 * identical (prevents the archive file from appearing in the archive).
132 */
133
134#define	IDENT(a, b) ((a.st_ino == b.st_ino && a.st_dev == b.st_dev) ? 1 : 0)
135
136/*
137 * FLUSH: Determine if enough space remains in the buffer to hold
138 * cnt bytes, if not, call bflush() to flush the buffer to the archive.
139 */
140
141#define	FLUSH(cnt) if ((Buffr.b_end_p - Buffr.b_in_p) < cnt) bflush()
142
143/*
144 * FILL: Determine if enough bytes remain in the buffer to meet current needs,
145 * if not, call rstbuf() to reset and refill the buffer from the archive.
146 */
147
148#define	FILL(cnt) while (Buffr.b_cnt < cnt) rstbuf()
149
150/*
151 * VERBOSE: If x is non-zero, call verbose().
152 */
153
154#define	VERBOSE(x, name) if (x) verbose(name)
155
156/*
157 * FORMAT: Date time formats
158 * b - abbreviated month name
159 * e - day of month (1 - 31)
160 * H - hour (00 - 23)
161 * M - minute (00 - 59)
162 * Y - year as ccyy
163 */
164
165#define	FORMAT	"%b %e %H:%M %Y"
166
167/* Extended system attributes */
168#ifndef	VIEW_READONLY
169#define	VIEW_READONLY	"SUNWattr_ro"
170#endif
171
172#ifndef	VIEW_READWRITE
173#define	VIEW_READWRITE	"SUNWattr_rw"
174#endif
175
176#define	min(a, b)	((a) < (b) ? (a) : (b))
177
178/* Values used in typeflag field */
179#define	REGTYPE		'0'		/* Regular File */
180#define	LNKTYPE		'1'		/* Link */
181#define	SYMTYPE		'2'		/* Reserved */
182#define	CHRTYPE		'3'		/* Character Special File */
183#define	BLKTYPE		'4'		/* Block Special File */
184#define	DIRTYPE		'5'		/* Directory */
185#define	FIFOTYPE	'6'		/* FIFO */
186#define	CONTTYPE	'7'		/* Reserved */
187#define	XHDRTYPE	'X'		/* Extended header */
188
189#define	INPUT	0	/* -i mode (used for chgreel() */
190#define	OUTPUT	1	/* -o mode (used for chgreel() */
191#define	APATH	1024	/* maximum ASC or CRC header path length */
192#define	CPATH	256	/* maximum -c and binary path length */
193#define	BUFSZ	512	/* default buffer size for archive I/O */
194#define	CPIOBSZ	8192	/* buffer size for file system I/O */
195#define	LNK_INC	500	/* link allocation increment */
196#define	MX_BUFS	10	/* max. number of buffers to allocate */
197
198#define	F_SKIP	0	/* an object did not match the patterns */
199#define	F_LINK	1	/* linked file */
200#define	F_EXTR	2	/* extract non-linked object that matched patterns */
201
202#define	MX_SEEKS	10	/* max. number of lseek attempts after error */
203#define	SEEK_ABS	0	/* lseek absolute */
204#define	SEEK_REL	1	/* lseek relative */
205
206/*
207 * xxx_CNT represents the number of sscanf items that will be matched
208 * if the sscanf to read a header is successful.  If sscanf returns a number
209 * that is not equal to this, an error occured (which indicates that this
210 * is not a valid header of the type assumed.
211 */
212
213#define	ASC_CNT	14	/* ASC and CRC headers */
214#define	CHR_CNT	11	/* CHR header */
215
216/* These defines determine the severity of the message sent to the user. */
217
218#define	ERR	1	/* Error message (warning) - not fatal */
219#define	EXT	2	/* Error message - fatal, causes exit */
220#define	ERRN	3	/* Error message with errno (warning) - not fatal */
221#define	EXTN	4	/* Error message with errno - fatal, causes exit */
222#define	POST	5	/* Information message, not an error */
223#define	EPOST	6	/* Information message to stderr */
224
225#define	SIXTH	060000	/* UNIX 6th edition files */
226
227#define	P_SKIP	0	/* File should be skipped */
228#define	P_PROC	1	/* File should be processed */
229
230#define	U_KEEP	0	/* Keep the existing version of a file (-u) */
231#define	U_OVER	1	/* Overwrite the existing version of a file (-u) */
232
233/*
234 * _20K: Allocate the maximum of (20K or (MX_BUFS * Bufsize)) bytes
235 * for the main I/O buffer.  Therefore if a user specifies a small buffer
236 * size, they still get decent performance due to the buffering strategy.
237 */
238
239#define	_20K	20480
240
241#define	HALFWD	1	/* Pad headers/data to halfword boundaries */
242#define	FULLWD	3	/* Pad headers/data to word boundaries */
243#define	FULLBK	511	/* Pad headers/data to 512 byte boundaries */
244
245/* bar structure */
246union b_block {
247	char dummy[TBLOCK];
248	struct bar_header {
249		char mode[8];
250		char uid[8];
251		char gid[8];
252		char size[12];
253		char mtime[12];
254		char chksum[8];
255		char rdev[8];
256		char linkflag;
257
258		/*
259		 * The following fields are specific to the volume
260		 * header.  They are set to zero in all file headers
261		 * in the archive.
262		 */
263		char bar_magic[2];	/* magic number */
264		char volume_num[4];	/* volume number */
265		char compressed;	/* files compressed = 1 */
266		char date[12];		/* date of archive mmddhhmm */
267		char start_of_name;	/* start of the filename */
268	} dbuf;
269};
270
271/* svr32 stat structure -- for -Hodc headers */
272
273typedef struct cpioinfo {
274	o_dev_t st_dev;
275	o_ino_t st_ino;
276	o_mode_t	st_mode;
277	o_nlink_t	st_nlink;
278	uid_t st_uid;		/* actual uid */
279	gid_t st_gid;		/* actual gid */
280	o_dev_t st_rdev;
281	off_t	st_size;
282	time_t	st_modtime;
283} cpioinfo_t;
284
285extern void msg(int severity, const char *fmt, ...);
286extern void stat_to_svr32_stat(cpioinfo_t *TmpSt, struct stat *FromStat);
287
288/*
289 * Allocation wrappers and their flags
290 */
291#define	E_NORMAL	0x0	/* Return NULL if allocation fails */
292#define	E_EXIT		0x1	/* Exit if allocation fails */
293
294extern void *e_realloc(int flag, void *old, size_t newsize);
295extern char *e_strdup(int flag, const char *arg);
296extern void *e_valloc(int flag, size_t size);
297extern void *e_zalloc(int flag, size_t size);
298
299/*
300 * If compiling on a system that doesn't
301 * support extended attributes, then
302 * define a couple of things so we can compile.
303 */
304#if !defined(O_XATTR)
305#define	AT_SYMLINK_NOFOLLOW	0x1000
306#define	AT_REMOVEDIR		0x0001
307#define	_XATTR_CPIO_MODE	0xB000
308#define	_XATTR_HDRTYPE		'E'
309#endif /* O_XATTR */
310
311/*
312 * Sparse file support
313 */
314#define	MIN_HOLES_HDRSIZE	(UL_MAX_SIZE + 1 + ULL_MAX_SIZE + 1)
315
316typedef struct holes_list {
317	off_t	hl_data;
318	off_t	hl_hole;
319	struct holes_list *hl_next;
320} holes_list_t;
321
322typedef struct holes_info {
323	holes_list_t	*holes_list;	/* linked list of holes_list */
324	off_t		orig_size;	/* original file size */
325	off_t		data_size;	/* compressed file size */
326	char		*holesdata;	/* holesdata string */
327	size_t		holesdata_sz;	/* string size */
328} holes_info_t;
329
330extern	holes_info_t *get_holes_info(int, off_t, boolean_t);
331extern	holes_info_t *read_holes_header(const char *, off_t);
332extern	int	parse_holesdata(holes_info_t *, const char *);
333extern	void	free_holes_info(holes_info_t *);
334
335extern	void	str_fprintf(FILE *, const char *, ...);
336
337#ifdef	__cplusplus
338}
339#endif
340
341#endif /* _CPIO_H */
342