cpio: support some long options; document GNU options
This commit is contained in:
parent
abe49fa54f
commit
2b407b12be
105
archival/cpio.c
105
archival/cpio.c
@ -14,18 +14,6 @@
|
|||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
#include "unarchive.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
|
#if ENABLE_FEATURE_CPIO_O
|
||||||
static off_t cpio_pad4(off_t size)
|
static off_t cpio_pad4(off_t size)
|
||||||
{
|
{
|
||||||
@ -190,15 +178,102 @@ static int cpio_o(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#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, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int cpio_main(int argc UNUSED_PARAM, char **argv)
|
int cpio_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
archive_handle_t *archive_handle;
|
archive_handle_t *archive_handle;
|
||||||
char *cpio_filename;
|
char *cpio_filename;
|
||||||
#if ENABLE_FEATURE_CPIO_O
|
USE_FEATURE_CPIO_O(const char *cpio_fmt = "";)
|
||||||
const char *cpio_fmt = "";
|
|
||||||
#endif
|
|
||||||
unsigned opt;
|
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
|
||||||
|
"create\0" No_argument "o"
|
||||||
|
"format\0" Required_argument "H"
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize */
|
/* Initialize */
|
||||||
archive_handle = init_handle();
|
archive_handle = init_handle();
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
#include "unarchive.h"
|
#include "unarchive.h"
|
||||||
|
|
||||||
typedef struct hardlinks_s {
|
typedef struct hardlinks_t {
|
||||||
struct hardlinks_s *next;
|
struct hardlinks_t *next;
|
||||||
int inode; /* TODO: must match maj/min too! */
|
int inode; /* TODO: must match maj/min too! */
|
||||||
int mode ;
|
int mode ;
|
||||||
int mtime; /* These three are useful only in corner case */
|
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);
|
free(make_me);
|
||||||
goto next_link;
|
goto next_link;
|
||||||
}
|
}
|
||||||
|
cur = cur->next;
|
||||||
}
|
}
|
||||||
/* Oops... no file with such inode was created... do it now
|
/* Oops... no file with such inode was created... do it now
|
||||||
* (happens when hardlinked files are empty (zero length)) */
|
* (happens when hardlinked files are empty (zero length)) */
|
||||||
|
Loading…
Reference in New Issue
Block a user