Changeset 3232 in MondoRescue for branches/3.2/mindi-busybox/archival/cpio.c
- Timestamp:
- Jan 1, 2014, 12:47:38 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3.2/mindi-busybox/archival/cpio.c
r2725 r3232 13 13 */ 14 14 #include "libbb.h" 15 #include "archive.h" 15 #include "bb_archive.h" 16 17 //usage:#define cpio_trivial_usage 18 //usage: "[-dmvu] [-F FILE]" IF_FEATURE_CPIO_O(" [-H newc]") 19 //usage: " [-ti"IF_FEATURE_CPIO_O("o")"]" IF_FEATURE_CPIO_P(" [-p DIR]") 20 //usage: " [EXTR_FILE]..." 21 //usage:#define cpio_full_usage "\n\n" 22 //usage: "Extract or list files from a cpio archive" 23 //usage: IF_FEATURE_CPIO_O(", or" 24 //usage: "\ncreate an archive" IF_FEATURE_CPIO_P(" (-o) or copy files (-p)") 25 //usage: " using file list on stdin" 26 //usage: ) 27 //usage: "\n" 28 //usage: "\nMain operation mode:" 29 //usage: "\n -t List" 30 //usage: "\n -i Extract EXTR_FILEs (or all)" 31 //usage: IF_FEATURE_CPIO_O( 32 //usage: "\n -o Create (requires -H newc)" 33 //usage: ) 34 //usage: IF_FEATURE_CPIO_P( 35 //usage: "\n -p DIR Copy files to DIR" 36 //usage: ) 37 //usage: "\n -d Make leading directories" 38 //usage: "\n -m Preserve mtime" 39 //usage: "\n -v Verbose" 40 //usage: "\n -u Overwrite" 41 //usage: "\n -F FILE Input (-t,-i,-p) or output (-o) file" 42 //usage: IF_FEATURE_CPIO_O( 43 //usage: "\n -H newc Archive format" 44 //usage: ) 16 45 17 46 /* GNU cpio 2.9 --help (abridged): … … 21 50 -i, --extract Extract files from an archive 22 51 -o, --create Create the archive 23 -p, --pass-through Copy-pass mode [was ist das?!]52 -p, --pass-through Copy-pass mode 24 53 25 54 Options valid in any mode: … … 79 108 -u, --unconditional Replace all files unconditionally 80 109 */ 110 81 111 enum { 82 CPIO_OPT_EXTRACT = (1 << 0),83 CPIO_OPT_TEST = (1 << 1),84 CPIO_OPT_NUL_TERMINATED = (1 << 2),85 CPIO_OPT_UNCONDITIONAL = (1 << 3),86 CPIO_OPT_VERBOSE = (1 << 4),87 CPIO_OPT_CREATE_LEADING_DIR = (1 << 5),88 CPIO_OPT_PRESERVE_MTIME = (1 << 6),89 CPIO_OPT_DEREF = (1 << 7),90 CPIO_OPT_FILE = (1 << 8),112 OPT_EXTRACT = (1 << 0), 113 OPT_TEST = (1 << 1), 114 OPT_NUL_TERMINATED = (1 << 2), 115 OPT_UNCONDITIONAL = (1 << 3), 116 OPT_VERBOSE = (1 << 4), 117 OPT_CREATE_LEADING_DIR = (1 << 5), 118 OPT_PRESERVE_MTIME = (1 << 6), 119 OPT_DEREF = (1 << 7), 120 OPT_FILE = (1 << 8), 91 121 OPTBIT_FILE = 8, 92 122 IF_FEATURE_CPIO_O(OPTBIT_CREATE ,) … … 95 125 IF_LONG_OPTS( OPTBIT_QUIET ,) 96 126 IF_LONG_OPTS( OPTBIT_2STDOUT ,) 97 CPIO_OPT_CREATE = IF_FEATURE_CPIO_O((1 << OPTBIT_CREATE )) + 0,98 CPIO_OPT_FORMAT = IF_FEATURE_CPIO_O((1 << OPTBIT_FORMAT )) + 0,99 CPIO_OPT_PASSTHROUGH = IF_FEATURE_CPIO_P((1 << OPTBIT_PASSTHROUGH)) + 0,100 CPIO_OPT_QUIET = IF_LONG_OPTS( (1 << OPTBIT_QUIET )) + 0,101 CPIO_OPT_2STDOUT = IF_LONG_OPTS( (1 << OPTBIT_2STDOUT )) + 0,127 OPT_CREATE = IF_FEATURE_CPIO_O((1 << OPTBIT_CREATE )) + 0, 128 OPT_FORMAT = IF_FEATURE_CPIO_O((1 << OPTBIT_FORMAT )) + 0, 129 OPT_PASSTHROUGH = IF_FEATURE_CPIO_P((1 << OPTBIT_PASSTHROUGH)) + 0, 130 OPT_QUIET = IF_LONG_OPTS( (1 << OPTBIT_QUIET )) + 0, 131 OPT_2STDOUT = IF_LONG_OPTS( (1 << OPTBIT_2STDOUT )) + 0, 102 132 }; 103 133 … … 139 169 struct stat st; 140 170 141 line = (option_mask32 & CPIO_OPT_NUL_TERMINATED)171 line = (option_mask32 & OPT_NUL_TERMINATED) 142 172 ? bb_get_chunk_from_file(stdin, NULL) 143 173 : xmalloc_fgetline(stdin); … … 154 184 continue; 155 185 } 156 if ((option_mask32 & CPIO_OPT_DEREF)186 if ((option_mask32 & OPT_DEREF) 157 187 ? stat(name, &st) 158 188 : lstat(name, &st) … … 224 254 225 255 bytes += printf("070701" 226 227 256 "%08X%08X%08X%08X%08X%08X%08X" 257 "%08X%08X%08X%08X" /* GNU cpio uses uppercase hex */ 228 258 /* strlen+1: */ "%08X" 229 259 /* chksum: */ "00000000" /* (only for "070702" files) */ 230 260 /* name,NUL: */ "%s%c", 231 232 233 234 235 236 237 238 239 240 241 242 243 261 (unsigned)(uint32_t) st.st_ino, 262 (unsigned)(uint32_t) st.st_mode, 263 (unsigned)(uint32_t) st.st_uid, 264 (unsigned)(uint32_t) st.st_gid, 265 (unsigned)(uint32_t) st.st_nlink, 266 (unsigned)(uint32_t) st.st_mtime, 267 (unsigned)(uint32_t) st.st_size, 268 (unsigned)(uint32_t) major(st.st_dev), 269 (unsigned)(uint32_t) minor(st.st_dev), 270 (unsigned)(uint32_t) major(st.st_rdev), 271 (unsigned)(uint32_t) minor(st.st_rdev), 272 (unsigned)(strlen(name) + 1), 273 name, '\0'); 244 274 bytes = cpio_pad4(bytes); 245 275 … … 311 341 opt = getopt32(argv, OPTION_STR, &cpio_filename); 312 342 argv += optind; 313 if (opt & CPIO_OPT_FILE) { /* -F */343 if (opt & OPT_FILE) { /* -F */ 314 344 xmove_fd(xopen(cpio_filename, O_RDONLY), STDIN_FILENO); 315 345 } … … 317 347 opt = getopt32(argv, OPTION_STR "oH:" IF_FEATURE_CPIO_P("p"), &cpio_filename, &cpio_fmt); 318 348 argv += optind; 319 if ((opt & ( CPIO_OPT_FILE|CPIO_OPT_CREATE)) == CPIO_OPT_FILE) { /* -F without -o */349 if ((opt & (OPT_FILE|OPT_CREATE)) == OPT_FILE) { /* -F without -o */ 320 350 xmove_fd(xopen(cpio_filename, O_RDONLY), STDIN_FILENO); 321 351 } 322 if (opt & CPIO_OPT_PASSTHROUGH) {352 if (opt & OPT_PASSTHROUGH) { 323 353 pid_t pid; 324 354 struct fd_pair pp; … … 326 356 if (argv[0] == NULL) 327 357 bb_show_usage(); 328 if (opt & CPIO_OPT_CREATE_LEADING_DIR)358 if (opt & OPT_CREATE_LEADING_DIR) 329 359 mkdir(argv[0], 0777); 330 360 /* Crude existence check: … … 355 385 } 356 386 /* parent */ 387 USE_FOR_NOMMU(argv[-optind][0] &= 0x7f); /* undo fork_or_rexec() damage */ 357 388 xchdir(*argv++); 358 389 close(pp.wr); 359 390 xmove_fd(pp.rd, STDIN_FILENO); 360 //opt &= ~ CPIO_OPT_PASSTHROUGH;361 opt |= CPIO_OPT_EXTRACT;391 //opt &= ~OPT_PASSTHROUGH; 392 opt |= OPT_EXTRACT; 362 393 goto skip; 363 394 } 364 395 /* -o */ 365 if (opt & CPIO_OPT_CREATE) {396 if (opt & OPT_CREATE) { 366 397 if (cpio_fmt[0] != 'n') /* we _require_ "-H newc" */ 367 398 bb_show_usage(); 368 if (opt & CPIO_OPT_FILE) {399 if (opt & OPT_FILE) { 369 400 xmove_fd(xopen(cpio_filename, O_WRONLY | O_CREAT | O_TRUNC), STDOUT_FILENO); 370 401 } … … 376 407 377 408 /* One of either extract or test options must be given */ 378 if ((opt & ( CPIO_OPT_TEST | CPIO_OPT_EXTRACT)) == 0) {409 if ((opt & (OPT_TEST | OPT_EXTRACT)) == 0) { 379 410 bb_show_usage(); 380 411 } 381 412 382 if (opt & CPIO_OPT_TEST) {413 if (opt & OPT_TEST) { 383 414 /* if both extract and test options are given, ignore extract option */ 384 opt &= ~ CPIO_OPT_EXTRACT;415 opt &= ~OPT_EXTRACT; 385 416 archive_handle->action_header = header_list; 386 417 } 387 if (opt & CPIO_OPT_EXTRACT) {418 if (opt & OPT_EXTRACT) { 388 419 archive_handle->action_data = data_extract_all; 389 if (opt & CPIO_OPT_2STDOUT)420 if (opt & OPT_2STDOUT) 390 421 archive_handle->action_data = data_extract_to_stdout; 391 422 } 392 if (opt & CPIO_OPT_UNCONDITIONAL) {423 if (opt & OPT_UNCONDITIONAL) { 393 424 archive_handle->ah_flags |= ARCHIVE_UNLINK_OLD; 394 425 archive_handle->ah_flags &= ~ARCHIVE_EXTRACT_NEWER; 395 426 } 396 if (opt & CPIO_OPT_VERBOSE) {427 if (opt & OPT_VERBOSE) { 397 428 if (archive_handle->action_header == header_list) { 398 429 archive_handle->action_header = header_verbose_list; … … 401 432 } 402 433 } 403 if (opt & CPIO_OPT_CREATE_LEADING_DIR) {434 if (opt & OPT_CREATE_LEADING_DIR) { 404 435 archive_handle->ah_flags |= ARCHIVE_CREATE_LEADING_DIRS; 405 436 } 406 if (opt & CPIO_OPT_PRESERVE_MTIME) {437 if (opt & OPT_PRESERVE_MTIME) { 407 438 archive_handle->ah_flags |= ARCHIVE_RESTORE_DATE; 408 439 } … … 420 451 421 452 if (archive_handle->cpio__blocks != (off_t)-1 422 && !(opt & CPIO_OPT_QUIET)453 && !(opt & OPT_QUIET) 423 454 ) { 424 455 fprintf(stderr, "%"OFF_FMT"u blocks\n", archive_handle->cpio__blocks);
Note:
See TracChangeset
for help on using the changeset viewer.