[git commit master 1/1] cpio: allow cpio -i to take params - names of files to extract

Denys Vlasenko vda.linux at googlemail.com
Sun Dec 26 01:22:51 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=1f937d64686d9a71c9325f2e9b23eba235a9255e
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Also, improve help text

function                                             old     new   delta
packed_usage                                       28028   28035      +7
cpio_main                                            542     532     -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 7/-10)              Total: -3 bytes

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 archival/cpio.c     |  105 ++++++++++++++++++++++++++++++++-------------------
 include/usage.src.h |   29 --------------
 2 files changed, 66 insertions(+), 68 deletions(-)

diff --git a/archival/cpio.c b/archival/cpio.c
index 6ab2688..c746a71 100644
--- a/archival/cpio.c
+++ b/archival/cpio.c
@@ -14,13 +14,43 @@
 #include "libbb.h"
 #include "archive.h"
 
+//usage:#define cpio_trivial_usage
+//usage:       "[-dmvu] [-F FILE]" IF_FEATURE_CPIO_O(" [-H newc]")
+//usage:       " [-ti"IF_FEATURE_CPIO_O("o")"]" IF_FEATURE_CPIO_P(" [-p DIR]")
+//usage:       " [EXTR_FILE]..."
+//usage:#define cpio_full_usage "\n\n"
+//usage:       "Extract or list files from a cpio archive"
+//usage:	IF_FEATURE_CPIO_O(", or"
+//usage:     "\ncreate an archive" IF_FEATURE_CPIO_P(" (-o) or copy files (-p)")
+//usage:		" using file list on stdin"
+//usage:	)
+//usage:     "\n"
+//usage:     "\nMain operation mode:"
+//usage:     "\n	-t	List"
+//usage:     "\n	-i	Extract EXTR_FILEs (or all)"
+//usage:	IF_FEATURE_CPIO_O(
+//usage:     "\n	-o	Create (requires -H newc)"
+//usage:	)
+//usage:	IF_FEATURE_CPIO_P(
+//usage:     "\n	-p DIR	Copy files to DIR"
+//usage:	)
+//usage:     "\nOptions:"
+//usage:     "\n	-d	Make leading directories"
+//usage:     "\n	-m	Preserve mtime"
+//usage:     "\n	-v	Verbose"
+//usage:     "\n	-u	Overwrite"
+//usage:     "\n	-F FILE	Input (-t,-i,-p) or output (-o) file"
+//usage:	IF_FEATURE_CPIO_O(
+//usage:     "\n	-H newc	Archive format"
+//usage:	)
+
 /* GNU cpio 2.9 --help (abridged):
 
  Modes:
   -t, --list                 List the archive
   -i, --extract              Extract files from an archive
   -o, --create               Create the archive
-  -p, --pass-through         Copy-pass mode [was ist das?!]
+  -p, --pass-through         Copy-pass mode
 
  Options valid in any mode:
       --block-size=SIZE      I/O block size = SIZE * 512 bytes
@@ -78,27 +108,28 @@
       --sparse               Write files with blocks of zeros as sparse files
   -u, --unconditional        Replace all files unconditionally
  */
+
 enum {
-	CPIO_OPT_EXTRACT            = (1 << 0),
-	CPIO_OPT_TEST               = (1 << 1),
-	CPIO_OPT_NUL_TERMINATED     = (1 << 2),
-	CPIO_OPT_UNCONDITIONAL      = (1 << 3),
-	CPIO_OPT_VERBOSE            = (1 << 4),
-	CPIO_OPT_CREATE_LEADING_DIR = (1 << 5),
-	CPIO_OPT_PRESERVE_MTIME     = (1 << 6),
-	CPIO_OPT_DEREF              = (1 << 7),
-	CPIO_OPT_FILE               = (1 << 8),
+	OPT_EXTRACT            = (1 << 0),
+	OPT_TEST               = (1 << 1),
+	OPT_NUL_TERMINATED     = (1 << 2),
+	OPT_UNCONDITIONAL      = (1 << 3),
+	OPT_VERBOSE            = (1 << 4),
+	OPT_CREATE_LEADING_DIR = (1 << 5),
+	OPT_PRESERVE_MTIME     = (1 << 6),
+	OPT_DEREF              = (1 << 7),
+	OPT_FILE               = (1 << 8),
 	OPTBIT_FILE = 8,
 	IF_FEATURE_CPIO_O(OPTBIT_CREATE     ,)
 	IF_FEATURE_CPIO_O(OPTBIT_FORMAT     ,)
 	IF_FEATURE_CPIO_P(OPTBIT_PASSTHROUGH,)
 	IF_LONG_OPTS(     OPTBIT_QUIET      ,)
 	IF_LONG_OPTS(     OPTBIT_2STDOUT    ,)
-	CPIO_OPT_CREATE             = IF_FEATURE_CPIO_O((1 << OPTBIT_CREATE     )) + 0,
-	CPIO_OPT_FORMAT             = IF_FEATURE_CPIO_O((1 << OPTBIT_FORMAT     )) + 0,
-	CPIO_OPT_PASSTHROUGH        = IF_FEATURE_CPIO_P((1 << OPTBIT_PASSTHROUGH)) + 0,
-	CPIO_OPT_QUIET              = IF_LONG_OPTS(     (1 << OPTBIT_QUIET      )) + 0,
-	CPIO_OPT_2STDOUT            = IF_LONG_OPTS(     (1 << OPTBIT_2STDOUT    )) + 0,
+	OPT_CREATE             = IF_FEATURE_CPIO_O((1 << OPTBIT_CREATE     )) + 0,
+	OPT_FORMAT             = IF_FEATURE_CPIO_O((1 << OPTBIT_FORMAT     )) + 0,
+	OPT_PASSTHROUGH        = IF_FEATURE_CPIO_P((1 << OPTBIT_PASSTHROUGH)) + 0,
+	OPT_QUIET              = IF_LONG_OPTS(     (1 << OPTBIT_QUIET      )) + 0,
+	OPT_2STDOUT            = IF_LONG_OPTS(     (1 << OPTBIT_2STDOUT    )) + 0,
 };
 
 #define OPTION_STR "it0uvdmLF:"
@@ -138,7 +169,7 @@ static NOINLINE int cpio_o(void)
 		char *line;
 		struct stat st;
 
-		line = (option_mask32 & CPIO_OPT_NUL_TERMINATED)
+		line = (option_mask32 & OPT_NUL_TERMINATED)
 				? bb_get_chunk_from_file(stdin, NULL)
 				: xmalloc_fgetline(stdin);
 
@@ -153,7 +184,7 @@ static NOINLINE int cpio_o(void)
 				free(line);
 				continue;
 			}
-			if ((option_mask32 & CPIO_OPT_DEREF)
+			if ((option_mask32 & OPT_DEREF)
 					? stat(name, &st)
 					: lstat(name, &st)
 			) {
@@ -308,28 +339,24 @@ int cpio_main(int argc UNUSED_PARAM, char **argv)
 	/* -L makes sense only with -o or -p */
 
 #if !ENABLE_FEATURE_CPIO_O
-	/* no parameters */
-	opt_complementary = "=0";
 	opt = getopt32(argv, OPTION_STR, &cpio_filename);
 	argv += optind;
-	if (opt & CPIO_OPT_FILE) { /* -F */
+	if (opt & OPT_FILE) { /* -F */
 		xmove_fd(xopen(cpio_filename, O_RDONLY), STDIN_FILENO);
 	}
 #else
-	/* _exactly_ one parameter for -p, thus <= 1 param if -p is allowed */
-	opt_complementary = ENABLE_FEATURE_CPIO_P ? "?1" : "=0";
 	opt = getopt32(argv, OPTION_STR "oH:" IF_FEATURE_CPIO_P("p"), &cpio_filename, &cpio_fmt);
 	argv += optind;
-	if ((opt & (CPIO_OPT_FILE|CPIO_OPT_CREATE)) == CPIO_OPT_FILE) { /* -F without -o */
+	if ((opt & (OPT_FILE|OPT_CREATE)) == OPT_FILE) { /* -F without -o */
 		xmove_fd(xopen(cpio_filename, O_RDONLY), STDIN_FILENO);
 	}
-	if (opt & CPIO_OPT_PASSTHROUGH) {
+	if (opt & OPT_PASSTHROUGH) {
 		pid_t pid;
 		struct fd_pair pp;
 
 		if (argv[0] == NULL)
 			bb_show_usage();
-		if (opt & CPIO_OPT_CREATE_LEADING_DIR)
+		if (opt & OPT_CREATE_LEADING_DIR)
 			mkdir(argv[0], 0777);
 		/* Crude existence check:
 		 * close(xopen(argv[0], O_RDONLY | O_DIRECTORY));
@@ -361,15 +388,15 @@ int cpio_main(int argc UNUSED_PARAM, char **argv)
 		xchdir(*argv++);
 		close(pp.wr);
 		xmove_fd(pp.rd, STDIN_FILENO);
-		//opt &= ~CPIO_OPT_PASSTHROUGH;
-		opt |= CPIO_OPT_EXTRACT;
+		//opt &= ~OPT_PASSTHROUGH;
+		opt |= OPT_EXTRACT;
 		goto skip;
 	}
 	/* -o */
-	if (opt & CPIO_OPT_CREATE) {
+	if (opt & OPT_CREATE) {
 		if (cpio_fmt[0] != 'n') /* we _require_ "-H newc" */
 			bb_show_usage();
-		if (opt & CPIO_OPT_FILE) {
+		if (opt & OPT_FILE) {
 			xmove_fd(xopen(cpio_filename, O_WRONLY | O_CREAT | O_TRUNC), STDOUT_FILENO);
 		}
  dump:
@@ -379,35 +406,35 @@ int cpio_main(int argc UNUSED_PARAM, char **argv)
 #endif
 
 	/* One of either extract or test options must be given */
-	if ((opt & (CPIO_OPT_TEST | CPIO_OPT_EXTRACT)) == 0) {
+	if ((opt & (OPT_TEST | OPT_EXTRACT)) == 0) {
 		bb_show_usage();
 	}
 
-	if (opt & CPIO_OPT_TEST) {
+	if (opt & OPT_TEST) {
 		/* if both extract and test options are given, ignore extract option */
-		opt &= ~CPIO_OPT_EXTRACT;
+		opt &= ~OPT_EXTRACT;
 		archive_handle->action_header = header_list;
 	}
-	if (opt & CPIO_OPT_EXTRACT) {
+	if (opt & OPT_EXTRACT) {
 		archive_handle->action_data = data_extract_all;
-		if (opt & CPIO_OPT_2STDOUT)
+		if (opt & OPT_2STDOUT)
 			archive_handle->action_data = data_extract_to_stdout;
 	}
-	if (opt & CPIO_OPT_UNCONDITIONAL) {
+	if (opt & OPT_UNCONDITIONAL) {
 		archive_handle->ah_flags |= ARCHIVE_UNLINK_OLD;
 		archive_handle->ah_flags &= ~ARCHIVE_EXTRACT_NEWER;
 	}
-	if (opt & CPIO_OPT_VERBOSE) {
+	if (opt & OPT_VERBOSE) {
 		if (archive_handle->action_header == header_list) {
 			archive_handle->action_header = header_verbose_list;
 		} else {
 			archive_handle->action_header = header_list;
 		}
 	}
-	if (opt & CPIO_OPT_CREATE_LEADING_DIR) {
+	if (opt & OPT_CREATE_LEADING_DIR) {
 		archive_handle->ah_flags |= ARCHIVE_CREATE_LEADING_DIRS;
 	}
-	if (opt & CPIO_OPT_PRESERVE_MTIME) {
+	if (opt & OPT_PRESERVE_MTIME) {
 		archive_handle->ah_flags |= ARCHIVE_RESTORE_DATE;
 	}
 
@@ -423,7 +450,7 @@ int cpio_main(int argc UNUSED_PARAM, char **argv)
 		continue;
 
 	if (archive_handle->cpio__blocks != (off_t)-1
-	 && !(opt & CPIO_OPT_QUIET)
+	 && !(opt & OPT_QUIET)
 	) {
 		fprintf(stderr, "%"OFF_FMT"u blocks\n", archive_handle->cpio__blocks);
 	}
diff --git a/include/usage.src.h b/include/usage.src.h
index 4640338..69a9fa1 100644
--- a/include/usage.src.h
+++ b/include/usage.src.h
@@ -592,35 +592,6 @@ INSERT
      "\n	-i	Prompt before overwrite" \
      "\n	-l,-s	Create (sym)links" \
 
-#define cpio_trivial_usage \
-       "[-dmvu] [-F FILE]" IF_FEATURE_CPIO_O(" [-H newc]") \
-       " [-ti"IF_FEATURE_CPIO_O("o")"]" IF_FEATURE_CPIO_P(" [-p DIR]")
-#define cpio_full_usage "\n\n" \
-       "Extract or list files from a cpio archive" \
-	IF_FEATURE_CPIO_O(", or" \
-     "\ncreate an archive" IF_FEATURE_CPIO_P(" (-o) or copy files (-p)") \
-		" using file list on stdin" \
-	) \
-     "\n" \
-     "\nMain operation mode:" \
-     "\n	-t	List" \
-     "\n	-i	Extract" \
-	IF_FEATURE_CPIO_O( \
-     "\n	-o	Create (requires -H newc)" \
-	) \
-	IF_FEATURE_CPIO_P( \
-     "\n	-p DIR	Copy files to DIR" \
-	) \
-     "\nOptions:" \
-     "\n	-d	Make leading directories" \
-     "\n	-m	Preserve mtime" \
-     "\n	-v	Verbose" \
-     "\n	-u	Overwrite" \
-     "\n	-F FILE	Input (-t,-i,-p) or output (-o) file" \
-	IF_FEATURE_CPIO_O( \
-     "\n	-H newc	Archive format" \
-	) \
-
 #define crond_trivial_usage \
        "-fbS -l N " IF_FEATURE_CROND_D("-d N ") "-L LOGFILE -c DIR"
 #define crond_full_usage "\n\n" \
-- 
1.7.2.2



More information about the busybox-cvs mailing list