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