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