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 35 extern "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 */ 246 union 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 273 typedef 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 285 extern void msg(int severity, const char *fmt, ...); 286 extern 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 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); 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 316 typedef struct holes_list { 317 off_t hl_data; 318 off_t hl_hole; 319 struct holes_list *hl_next; 320 } holes_list_t; 321 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 */ 328 } holes_info_t; 329 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 *); 334 335 extern void str_fprintf(FILE *, const char *, ...); 336 337 #ifdef __cplusplus 338 } 339 #endif 340 341 #endif /* _CPIO_H */