static void cpio_set_action(int op) { if ((act == APPND && op == ARCHIVE) || (act == ARCHIVE && op == APPND)) act = APPND; else if (act == EXTRACT && op == LIST) act = op; else if (act != ERROR && act != op) cpio_usage(); else act = op; }
int bad_opt(void) { OPLIST *opt; if (ophead == NULL) return 0; /* * print all we were given */ tty_warn(1," These format options are not supported for %s", frmt->name); while ((opt = opt_next()) != NULL) (void)fprintf(stderr, "\t%s = %s\n", opt->name, opt->value); if (strcmp(NM_TAR, argv0) == 0) tar_usage(); #ifndef NO_CPIO else if (strcmp(NM_CPIO, argv0) == 0) cpio_usage(); #endif else pax_usage(); return 0; }
static void cpio_options(int argc, char **argv) { int c; size_t i; char *str; FSUB tmp; FILE *fp; kflag = 1; pids = 1; pmode = 1; pmtime = 0; arcname = NULL; dflag = 1; act = -1; nodirs = 1; while ((c=getopt(argc,argv,"abcdfiklmoprstuvzABC:E:F:H:I:LO:SZ6")) != -1) switch (c) { case 'a': /* * preserve access time on files read */ tflag = 1; break; case 'b': /* * swap bytes and half-words when reading data */ break; case 'c': /* * ASCII cpio header */ frmt = &(fsub[F_ACPIO]); break; case 'd': /* * create directories as needed */ nodirs = 0; break; case 'f': /* * invert meaning of pattern list */ cflag = 1; break; case 'i': /* * restore an archive */ act = EXTRACT; break; case 'k': break; case 'l': /* * use links instead of copies when possible */ lflag = 1; break; case 'm': /* * preserve modification time */ pmtime = 1; break; case 'o': /* * create an archive */ act = ARCHIVE; frmt = &(fsub[F_CPIO]); break; case 'p': /* * copy-pass mode */ act = COPY; break; case 'r': /* * interactively rename files */ iflag = 1; break; case 's': /* * swap bytes after reading data */ break; case 't': /* * list contents of archive */ act = LIST; listf = stdout; break; case 'u': /* * replace newer files */ kflag = 0; break; case 'v': /* * verbose operation mode */ vflag = 1; break; case 'z': /* * use gzip. Non standard option. */ gzip_program = GZIP_CMD; break; case 'A': /* * append mode */ act = APPND; break; case 'B': /* * Use 5120 byte block size */ wrblksz = 5120; break; case 'C': /* * set block size in bytes */ wrblksz = atoi(optarg); break; case 'E': /* * file with patterns to extract or list */ if ((fp = fopen(optarg, "r")) == NULL) { paxwarn(1, "Unable to open file '%s' for read", optarg); cpio_usage(); } while ((str = getline(fp)) != NULL) { pat_add(str, NULL); } fclose(fp); if (getline_error) { paxwarn(1, "Problem with file '%s'", optarg); cpio_usage(); } break; case 'F': case 'I': case 'O': /* * filename where the archive is stored */ if ((optarg[0] == '-') && (optarg[1]== '\0')) { /* * treat a - as stdin */ arcname = NULL; break; } arcname = optarg; break; case 'H': /* * specify an archive format on write */ tmp.name = optarg; if ((frmt = (FSUB *)bsearch((void *)&tmp, (void *)fsub, sizeof(fsub)/sizeof(FSUB), sizeof(FSUB), c_frmt)) != NULL) break; paxwarn(1, "Unknown -H format: %s", optarg); (void)fputs("cpio: Known -H formats are:", stderr); for (i = 0; i < (sizeof(fsub)/sizeof(FSUB)); ++i) (void)fprintf(stderr, " %s", fsub[i].name); (void)fputs("\n\n", stderr); cpio_usage(); break; case 'L': /* * follow symbolic links */ Lflag = 1; break; case 'S': /* * swap halfwords after reading data */ break; case 'Z': /* * use compress. Non standard option. */ gzip_program = COMPRESS_CMD; break; case '6': /* * process Version 6 cpio format */ frmt = &(fsub[F_OCPIO]); break; case '?': default: cpio_usage(); break; } argc -= optind; argv += optind; /* * process the args as they are interpreted by the operation mode */ switch (act) { case LIST: case EXTRACT: while (*argv != NULL) if (pat_add(*argv++, NULL) < 0) cpio_usage(); break; case COPY: if (*argv == NULL) { paxwarn(0, "Destination directory was not supplied"); cpio_usage(); } dirptr = *argv; if (mkpath(dirptr) < 0) cpio_usage(); --argc; ++argv; /* FALLTHROUGH */ case ARCHIVE: case APPND: if (*argv != NULL) cpio_usage(); /* * no read errors allowed on updates/append operation! */ maxflt = 0; while ((str = getline(stdin)) != NULL) { ftree_add(str, 0); } if (getline_error) { paxwarn(1, "Problem while reading stdin"); cpio_usage(); } break; default: cpio_usage(); break; } }
static void cpio_options(int argc, char **argv) { FSUB tmp; u_int64_t flg = 0; u_int64_t bflg = 0; int c; size_t i; FILE *fp; char *str; uflag = 1; kflag = 1; pids = 1; pmode = 1; pmtime = 0; arcname = NULL; dflag = 1; nodirs = 1; /* * process option flags */ while ((c = getoldopt(argc, argv, "+abcdfiklmoprstuvzABC:E:F:H:I:LM:O:R:SVZ6", cpio_longopts, NULL)) != -1) { switch(c) { case 'a': /* * preserve access time on filesystem nodes we read */ tflag = 1; flg |= TF; break; #ifdef notyet case 'b': /* * swap bytes and half-words when reading data */ break; #endif case 'c': /* * ASCII cpio header */ frmt = &fsub[F_SV4CPIO]; break; case 'd': /* * create directories as needed * pax does this by default .. */ nodirs = 0; break; case 'f': /* * inverse match on patterns */ cflag = 1; flg |= CF; break; case 'i': /* * read the archive */ cpio_set_action(EXTRACT); flg |= RF; break; #ifdef notyet case 'k': break; #endif case 'l': /* * try to link src to dest with copy (-rw) */ lflag = 1; flg |= LF; break; case 'm': /* * preserve mtime */ flg |= PF; pmtime = 1; break; case 'o': /* * write an archive */ cpio_set_action(ARCHIVE); frmt = &(fsub[F_SV4CRC]); flg |= WF; break; case 'p': /* * cpio -p is like pax -rw */ cpio_set_action(COPY); flg |= RF | WF; break; case 'r': /* * interactive file rename */ iflag = 1; flg |= IF; break; #ifdef notyet case 's': /* * swap bytes after reading data */ break; #endif case 't': /* * list contents of archive */ cpio_set_action(LIST); listf = stdout; flg &= ~RF; break; case 'u': /* * don't ignore those older files */ uflag = 0; kflag = 0; flg |= UF; break; case 'v': /* * verbose operation mode */ vflag = 1; flg |= VF; break; case 'z': /* * use gzip. Non standard option. */ gzip_program = GZIP_CMD; break; case 'A': /* * append to an archive */ cpio_set_action(APPND); flg |= AF; break; case 'B': /* * set blocksize to 5120 */ blksz = 5120; break; case 'C': /* * specify blocksize */ if ((blksz = (int)str_offt(optarg)) <= 0) { tty_warn(1, "Invalid block size %s", optarg); cpio_usage(); } break; case 'E': /* * file with patterns to extract or list */ if ((fp = fopen(optarg, "r")) == NULL) { tty_warn(1, "Unable to open file '%s' for read", optarg); cpio_usage(); } while ((str = get_line(fp)) != NULL) { pat_add(str, NULL, 0); } fclose(fp); if (get_line_error) { tty_warn(1, "Problem with file '%s'", optarg); cpio_usage(); } break; case 'H': /* * specify an archive format on write */ tmp.name = optarg; frmt = (FSUB *)bsearch((void *)&tmp, (void *)fsub, sizeof(fsub)/sizeof(FSUB), sizeof(FSUB), c_frmt); if (frmt != NULL) { flg |= XF; break; } tty_warn(1, "Unknown -H format: %s", optarg); (void)fputs("cpio: Known -H formats are:", stderr); for (i = 0; i < (sizeof(fsub)/sizeof(FSUB)); ++i) (void)fprintf(stderr, " %s", fsub[i].name); (void)fputs("\n\n", stderr); cpio_usage(); break; case 'F': case 'I': case 'O': /* * filename where the archive is stored */ if ((optarg[0] == '-') && (optarg[1]== '\0')) { /* * treat a - as stdin */ arcname = NULL; break; } arcname = optarg; break; case 'L': /* * follow symlinks */ Lflag = 1; flg |= CLF; break; #ifdef notyet case 'M': arg = optarg; break; case 'R': arg = optarg; break; #endif case 'S': /* * swap halfwords after reading data */ cpio_swp_head = 1; break; #ifdef notyet case 'V': /* print a '.' for each file processed */ break; #endif case 'V': /* * semi-verbose operation mode (no listing) */ Vflag = 1; flg |= VF; break; case 'Z': /* * use compress. Non standard option. */ gzip_program = COMPRESS_CMD; break; case '6': /* * process Version 6 cpio format */ frmt = &(fsub[F_BCPIO]); break; case OPT_FORCE_LOCAL: forcelocal = 1; break; case OPT_INSECURE: secure = 0; break; case OPT_SPARSE: /* do nothing; we already generate sparse files */ break; case OPT_XZ: gzip_program = XZ_CMD; break; default: cpio_usage(); break; } } /* * figure out the operation mode of cpio. check that we have not been * given a bogus set of flags for the operation mode. */ if (ISLIST(flg)) { act = LIST; bflg = flg & BDLIST; } else if (ISEXTRACT(flg)) { act = EXTRACT; bflg = flg & BDEXTR; } else if (ISARCHIVE(flg)) { act = ARCHIVE; bflg = flg & BDARCH; } else if (ISAPPND(flg)) { act = APPND; bflg = flg & BDARCH; } else if (ISCOPY(flg)) { act = COPY; bflg = flg & BDCOPY; } else cpio_usage(); if (bflg) { cpio_usage(); } /* * if we are writing (ARCHIVE) we use the default format if the user * did not specify a format. when we write during an APPEND, we will * adopt the format of the existing archive if none was supplied. */ if (!(flg & XF) && (act == ARCHIVE)) frmt = &(fsub[F_BCPIO]); /* * process the args as they are interpreted by the operation mode */ switch (act) { case LIST: case EXTRACT: for (; optind < argc; optind++) if (pat_add(argv[optind], NULL, 0) < 0) cpio_usage(); break; case COPY: if (optind >= argc) { tty_warn(0, "Destination directory was not supplied"); cpio_usage(); } --argc; dirptr = argv[argc]; /* FALLTHROUGH */ case ARCHIVE: case APPND: if (argc != optind) { for (; optind < argc; optind++) if (ftree_add(argv[optind], 0) < 0) cpio_usage(); break; } /* * no read errors allowed on updates/append operation! */ maxflt = 0; while ((str = get_line(stdin)) != NULL) { ftree_add(str, 0); } if (get_line_error) { tty_warn(1, "Problem while reading stdin"); cpio_usage(); } break; default: cpio_usage(); break; } }