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.
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.
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]
22 * Copyright (c) 2012 Gary Mills
24 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
28 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
29 /* All Rights Reserved */
41 /* Option Character keys (OC#), where '#' is the option character specified. */
71 #define OC6 0x10000000
72 #define BSM 0x20000000
73 #define OCP 0x40000000
74 #define OCq 0x80000000
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)
83 /* Invalid option masks for each action option (-i, -o or -p). */
85 #define INV_MSK4i (OCo | OCp | OCA | OCL | OCO)
87 #define INV_MSK4o (OCi | OCp | OCE | OCI | OCR)
89 #define INV_MSK4p (OCf | OCi | OCo | OCr | OCt | OCA \
90 | OCE | OCH | OCI | OCO)
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 */
102 /* Differentiate between TAR and USTAR */
104 #define TAR 7 /* Regular tar */
105 #define USTAR 8 /* IEEE data interchange standard */
107 #define ULL_MAX_SIZE 20
108 #define UL_MAX_SIZE 10
110 /* constants for bar, used for extracting bar archives */
112 #define BAR_VOLUME_MAGIC 'V'
115 #define BAR_TAPE_SIZE (126*BARSZ)
116 #define BAR_FLOPPY_SIZE (18*BARSZ)
118 /* the pathname lengths for the USTAR header */
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 */
124 /* HDRSZ: header size minus filename field length */
126 #define HDRSZ (Hdr.h_name - (char *)&Hdr)
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).
134 #define IDENT(a, b) ((a.st_ino == b.st_ino && a.st_dev == b.st_dev) ? 1 : 0)
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.
141 #define FLUSH(cnt) if ((Buffr.b_end_p - Buffr.b_in_p) < cnt) bflush()
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.
148 #define FILL(cnt) while (Buffr.b_cnt < cnt) rstbuf()
151 * VERBOSE: If x is non-zero, call verbose().
154 #define VERBOSE(x, name) if (x) verbose(name)
157 * FORMAT: Date time formats
158 * b - abbreviated month name
159 * e - day of month (1 - 31)
161 * M - minute (00 - 59)
165 #define FORMAT "%b %e %H:%M %Y"
167 /* Extended system attributes */
168 #ifndef VIEW_READONLY
169 #define VIEW_READONLY "SUNWattr_ro"
172 #ifndef VIEW_READWRITE
173 #define VIEW_READWRITE "SUNWattr_rw"
176 #define min(a, b) ((a) < (b) ? (a) : (b))
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 */
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 */
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 */
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 */
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.
213 #define ASC_CNT 14 /* ASC and CRC headers */
214 #define CHR_CNT 11 /* CHR header */
216 /* These defines determine the severity of the message sent to the user. */
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 */
225 #define SIXTH 060000 /* UNIX 6th edition files */
227 #define P_SKIP 0 /* File should be skipped */
228 #define P_PROC 1 /* File should be processed */
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) */
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.
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 */
259 * The following fields are specific to the volume
260 * header. They are set to zero in all file headers
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 */
271 /* svr32 stat structure -- for -Hodc headers */
273 typedef struct cpioinfo
{
278 uid_t st_uid
; /* actual uid */
279 gid_t st_gid
; /* actual gid */
285 extern void msg(int severity
, const char *fmt
, ...);
286 extern void stat_to_svr32_stat(cpioinfo_t
*TmpSt
, struct stat
*FromStat
);
289 * Allocation wrappers and their flags
291 #define E_NORMAL 0x0 /* Return NULL if allocation fails */
292 #define E_EXIT 0x1 /* Exit if allocation fails */
294 extern void *e_realloc(int flag
, void *old
, size_t newsize
);
295 extern char *e_strdup(int flag
, const char *arg
);
296 extern void *e_valloc(int flag
, size_t size
);
297 extern void *e_zalloc(int flag
, size_t size
);
300 * If compiling on a system that doesn't
301 * support extended attributes, then
302 * define a couple of things so we can compile.
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'
312 * Sparse file support
314 #define MIN_HOLES_HDRSIZE (UL_MAX_SIZE + 1 + ULL_MAX_SIZE + 1)
316 typedef struct holes_list
{
319 struct holes_list
*hl_next
;
322 typedef 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 */
330 extern holes_info_t
*get_holes_info(int, off_t
, boolean_t
);
331 extern holes_info_t
*read_holes_header(const char *, off_t
);
332 extern int parse_holesdata(holes_info_t
*, const char *);
333 extern void free_holes_info(holes_info_t
*);
335 extern void str_fprintf(FILE *, const char *, ...);