cpio: support some long options; document GNU options
No binary (build failed)
—
(log yok)
| @@ -14,18 +14,6 @@ | |
| #include "libbb.h" | |
| #include "unarchive.h" | |
| - | enum { |
| - | CPIO_OPT_EXTRACT = (1 << 0), |
| - | CPIO_OPT_TEST = (1 << 1), |
| - | CPIO_OPT_UNCONDITIONAL = (1 << 2), |
| - | CPIO_OPT_VERBOSE = (1 << 3), |
| - | CPIO_OPT_FILE = (1 << 4), |
| - | CPIO_OPT_CREATE_LEADING_DIR = (1 << 5), |
| - | CPIO_OPT_PRESERVE_MTIME = (1 << 6), |
| - | CPIO_OPT_CREATE = (1 << 7), |
| - | CPIO_OPT_FORMAT = (1 << 8), |
| - | }; |
| - | |
| #if ENABLE_FEATURE_CPIO_O | |
| static off_t cpio_pad4(off_t size) | |
| { | |
| @@ -190,15 +178,102 @@ static int cpio_o(void) | |
| } | |
| #endif | |
| + | /* GNU cpio (GNU cpio) 2.9 help (abridged): |
| + | |
| + | Main operation mode: |
| + | -i, --extract Extract files from an archive |
| + | -o, --create Create the archive |
| + | -p, --pass-through Copy-pass mode (was ist das?!) |
| + | -t, --list List the archive |
| + | |
| + | Operation modifiers valid in any mode: |
| + | --block-size=SIZE I/O block size = SIZE * 512 bytes |
| + | -B I/O block size = 5120 bytes |
| + | -c Use the old portable (ASCII) archive format |
| + | -C, --io-size=NUMBER I/O block size to the given NUMBER bytes |
| + | -f, --nonmatching Only copy files that do not match given pattern |
| + | -F, --file=FILE Use FILE instead of standard input or output |
| + | -H, --format=FORMAT Use given archive FORMAT |
| + | -M, --message=STRING Print STRING when the end of a volume of the |
| + | backup media is reached |
| + | -n, --numeric-uid-gid If -v, show numeric UID and GID |
| + | --quiet Do not print the number of blocks copied |
| + | --rsh-command=COMMAND Use remote COMMAND instead of rsh |
| + | -v, --verbose Verbosely list the files processed |
| + | -V, --dot Print a "." for each file processed |
| + | -W, --warning=FLAG Control warning display: 'none','truncate','all'; |
| + | multiple options accumulate |
| + | |
| + | Operation modifiers valid only in --extract mode: |
| + | -b, --swap Swap both halfwords of words and bytes of |
| + | halfwords in the data (equivalent to -sS) |
| + | -r, --rename Interactively rename files |
| + | -s, --swap-bytes Swap the bytes of each halfword in the files |
| + | -S, --swap-halfwords Swap the halfwords of each word (4 bytes) |
| + | --to-stdout Extract files to standard output |
| + | -E, --pattern-file=FILE Read additional patterns specifying filenames to |
| + | extract or list from FILE |
| + | --only-verify-crc Verify CRC's, don't actually extract the files |
| + | |
| + | Operation modifiers valid only in --create mode: |
| + | -A, --append Append to an existing archive |
| + | -O FILE File to use instead of standard output |
| + | |
| + | Operation modifiers valid only in --pass-through mode: |
| + | -l, --link Link files instead of copying them, when possible |
| + | |
| + | Operation modifiers valid in --extract and --create modes: |
| + | --absolute-filenames Do not strip file system prefix components from |
| + | the file names |
| + | --no-absolute-filenames Create all files relative to the current dir |
| + | |
| + | Operation modifiers valid in --create and --pass-through modes: |
| + | -0, --null A list of filenames is terminated by a NUL |
| + | -a, --reset-access-time Reset the access times of files after reading them |
| + | -I FILE File to use instead of standard input |
| + | -L, --dereference Dereference symbolic links (copy the files |
| + | that they point to instead of copying the links) |
| + | -R, --owner=[USER][:.][GROUP] Set owner of created files |
| + | |
| + | Operation modifiers valid in --extract and --pass-through modes: |
| + | -d, --make-directories Create leading directories where needed |
| + | -m, --preserve-modification-time |
| + | Retain previous file modification times when |
| + | creating files |
| + | --no-preserve-owner Do not change the ownership of the files |
| + | --sparse Write files with blocks of zeros as sparse files |
| + | -u, --unconditional Replace all files unconditionally |
| + | */ |
| + | |
| int cpio_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| int cpio_main(int argc UNUSED_PARAM, char **argv) | |
| { | |
| archive_handle_t *archive_handle; | |
| char *cpio_filename; | |
| + | USE_FEATURE_CPIO_O(const char *cpio_fmt = "";) |
| + | unsigned opt; |
| + | enum { |
| + | CPIO_OPT_EXTRACT = (1 << 0), |
| + | CPIO_OPT_TEST = (1 << 1), |
| + | CPIO_OPT_UNCONDITIONAL = (1 << 2), |
| + | CPIO_OPT_VERBOSE = (1 << 3), |
| + | CPIO_OPT_FILE = (1 << 4), |
| + | CPIO_OPT_CREATE_LEADING_DIR = (1 << 5), |
| + | CPIO_OPT_PRESERVE_MTIME = (1 << 6), |
| + | CPIO_OPT_CREATE = (1 << 7), |
| + | CPIO_OPT_FORMAT = (1 << 8), |
| + | }; |
| + | |
| + | #if ENABLE_GETOPT_LONG && ENABLE_DESKTOP |
| + | applet_long_options = |
| + | "extract\0" No_argument "i" |
| + | "list\0" No_argument "t" |
| #if ENABLE_FEATURE_CPIO_O | |
| - | const char *cpio_fmt = ""; |
| + | "create\0" No_argument "o" |
| + | "format\0" Required_argument "H" |
| + | #endif |
| + | ; |
| #endif | |
| - | unsigned opt; |
| /* Initialize */ | |
| archive_handle = init_handle(); | |
| @@ -7,8 +7,8 @@ | |
| #include "libbb.h" | |
| #include "unarchive.h" | |
| - | typedef struct hardlinks_s { |
| - | struct hardlinks_s *next; |
| + | typedef struct hardlinks_t { |
| + | struct hardlinks_t *next; |
| int inode; /* TODO: must match maj/min too! */ | |
| int mode ; | |
| int mtime; /* These three are useful only in corner case */ | |
| @@ -149,6 +149,7 @@ char FAST_FUNC get_header_cpio(archive_handle_t *archive_handle) | |
| free(make_me); | |
| goto next_link; | |
| } | |
| + | cur = cur->next; |
| } | |
| /* Oops... no file with such inode was created... do it now | |
| * (happens when hardlinked files are empty (zero length)) */ | |