From 4f731ce30ec2a9f5e9b231b47aa68f32b75feb35 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 15 Jun 2010 15:40:16 +0200 Subject: [PATCH] findutils/*: move usage and applet bits to *.c files Signed-off-by: Denys Vlasenko --- findutils/find.c | 90 ++++++++++++++++++++++++++- findutils/grep.c | 63 +++++++++++++++++-- findutils/xargs.c | 27 +++++++- include/applets.src.h | 5 -- include/usage.src.h | 139 ------------------------------------------ 5 files changed, 172 insertions(+), 152 deletions(-) diff --git a/findutils/find.c b/findutils/find.c index ca630b6c5..297081489 100644 --- a/findutils/find.c +++ b/findutils/find.c @@ -53,8 +53,10 @@ * diff -u /tmp/std_find /tmp/bb_find && echo Identical */ +//applet:IF_FIND(APPLET_NOEXEC(find, find, _BB_DIR_USR_BIN, _BB_SUID_DROP, find)) + //kbuild:lib-$(CONFIG_FIND) += find.o -//config: + //config:config FIND //config: bool "find" //config: default y @@ -1044,6 +1046,92 @@ static action*** parse_params(char **argv) #undef ALLOC_ACTION } +//usage:#define find_trivial_usage +//usage: "[PATH]... [EXPRESSION]" +//usage:#define find_full_usage "\n\n" +//usage: "Search for files. The default PATH is the current directory,\n" +//usage: "default EXPRESSION is '-print'\n" +//usage: "\nEXPRESSION may consist of:" +//usage: "\n -follow Follow symlinks" +//usage: IF_FEATURE_FIND_XDEV( +//usage: "\n -xdev Don't descend directories on other filesystems" +//usage: ) +//usage: IF_FEATURE_FIND_MAXDEPTH( +//usage: "\n -maxdepth N Descend at most N levels. -maxdepth 0 applies" +//usage: "\n tests/actions to command line arguments only" +//usage: ) +//usage: "\n -mindepth N Don't act on first N levels" +//usage: "\n -name PATTERN File name (w/o directory name) matches PATTERN" +//usage: "\n -iname PATTERN Case insensitive -name" +//usage: IF_FEATURE_FIND_PATH( +//usage: "\n -path PATTERN Path matches PATTERN" +//usage: ) +//usage: IF_FEATURE_FIND_REGEX( +//usage: "\n -regex PATTERN Path matches regex PATTERN" +//usage: ) +//usage: IF_FEATURE_FIND_TYPE( +//usage: "\n -type X File type is X (X is one of: f,d,l,b,c,...)" +//usage: ) +//usage: IF_FEATURE_FIND_PERM( +//usage: "\n -perm NNN Permissions match any of (+NNN), all of (-NNN)," +//usage: "\n or exactly NNN" +//usage: ) +//usage: IF_FEATURE_FIND_MTIME( +//usage: "\n -mtime DAYS Modified time is greater than (+N), less than (-N)," +//usage: "\n or exactly N days" +//usage: ) +//usage: IF_FEATURE_FIND_MMIN( +//usage: "\n -mmin MINS Modified time is greater than (+N), less than (-N)," +//usage: "\n or exactly N minutes" +//usage: ) +//usage: IF_FEATURE_FIND_NEWER( +//usage: "\n -newer FILE Modified time is more recent than FILE's" +//usage: ) +//usage: IF_FEATURE_FIND_INUM( +//usage: "\n -inum N File has inode number N" +//usage: ) +//usage: IF_FEATURE_FIND_USER( +//usage: "\n -user NAME File is owned by user NAME (numeric user ID allowed)" +//usage: ) +//usage: IF_FEATURE_FIND_GROUP( +//usage: "\n -group NAME File belongs to group NAME (numeric group ID allowed)" +//usage: ) +//usage: IF_FEATURE_FIND_DEPTH( +//usage: "\n -depth Process directory name after traversing it" +//usage: ) +//usage: IF_FEATURE_FIND_SIZE( +//usage: "\n -size N[bck] File size is N (c:bytes,k:kbytes,b:512 bytes(def.))" +//usage: "\n +/-N: file size is bigger/smaller than N" +//usage: ) +//usage: IF_FEATURE_FIND_LINKS( +//usage: "\n -links N Number of links is greater than (+N), less than (-N)," +//usage: "\n or exactly N" +//usage: ) +//usage: "\n -print Print (default and assumed)" +//usage: IF_FEATURE_FIND_PRINT0( +//usage: "\n -print0 Delimit output with null characters rather than" +//usage: "\n newlines" +//usage: ) +//usage: IF_FEATURE_FIND_CONTEXT( +//usage: "\n -context File has specified security context" +//usage: ) +//usage: IF_FEATURE_FIND_EXEC( +//usage: "\n -exec CMD ARG ; Run CMD with all instances of {} replaced by the" +//usage: "\n matching files" +//usage: ) +//usage: IF_FEATURE_FIND_PRUNE( +//usage: "\n -prune Stop traversing current subtree" +//usage: ) +//usage: IF_FEATURE_FIND_DELETE( +//usage: "\n -delete Delete files, turns on -depth option" +//usage: ) +//usage: IF_FEATURE_FIND_PAREN( +//usage: "\n (EXPR) Group an expression" +//usage: ) +//usage: +//usage:#define find_example_usage +//usage: "$ find / -name passwd\n" +//usage: "/etc/passwd\n" int find_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int find_main(int argc UNUSED_PARAM, char **argv) diff --git a/findutils/grep.c b/findutils/grep.c index dd1a4efc4..ac290a911 100644 --- a/findutils/grep.c +++ b/findutils/grep.c @@ -14,13 +14,16 @@ * 2004,2006 (C) Vladimir Oleynik - * correction "-e pattern1 -e pattern2" logic and more optimizations. * precompiled regex - */ -/* + * * (C) 2006 Jac Goudsmit added -o option */ +//applet:IF_GREP(APPLET(grep, _BB_DIR_BIN, _BB_SUID_DROP)) +//applet:IF_FEATURE_GREP_EGREP_ALIAS(APPLET_ODDNAME(egrep, grep, _BB_DIR_BIN, _BB_SUID_DROP, egrep)) +//applet:IF_FEATURE_GREP_FGREP_ALIAS(APPLET_ODDNAME(fgrep, grep, _BB_DIR_BIN, _BB_SUID_DROP, fgrep)) + //kbuild:lib-$(CONFIG_GREP) += grep.o -//config: + //config:config GREP //config: bool "grep" //config: default y @@ -57,17 +60,67 @@ #include "libbb.h" #include "xregex.h" + /* options */ +//usage:#define grep_trivial_usage +//usage: "[-HhnlLoqvsriw" +//usage: "F" +//usage: IF_FEATURE_GREP_EGREP_ALIAS("E") +//usage: IF_EXTRA_COMPAT("z") +//usage: "] [-m N] " +//usage: IF_FEATURE_GREP_CONTEXT("[-A/B/C N] ") +//usage: "PATTERN/-e PATTERN.../-f FILE [FILE]..." +//usage:#define grep_full_usage "\n\n" +//usage: "Search for PATTERN in FILEs (or stdin)\n" +//usage: "\nOptions:" +//usage: "\n -H Add 'filename:' prefix" +//usage: "\n -h Do not add 'filename:' prefix" +//usage: "\n -n Add 'line_no:' prefix" +//usage: "\n -l Show only names of files that match" +//usage: "\n -L Show only names of files that don't match" +//usage: "\n -c Show only count of matching lines" +//usage: "\n -o Show only the matching part of line" +//usage: "\n -q Quiet. Return 0 if PATTERN is found, 1 otherwise" +//usage: "\n -v Select non-matching lines" +//usage: "\n -s Suppress open and read errors" +//usage: "\n -r Recurse" +//usage: "\n -i Ignore case" +//usage: "\n -w Match whole words only" +//usage: "\n -F PATTERN is a literal (not regexp)" +//usage: IF_FEATURE_GREP_EGREP_ALIAS( +//usage: "\n -E PATTERN is an extended regexp" +//usage: ) +//usage: IF_EXTRA_COMPAT( +//usage: "\n -z Input is NUL terminated" +//usage: ) +//usage: "\n -m N Match up to N times per file" +//usage: IF_FEATURE_GREP_CONTEXT( +//usage: "\n -A N Print N lines of trailing context" +//usage: "\n -B N Print N lines of leading context" +//usage: "\n -C N Same as '-A N -B N'" +//usage: ) +//usage: "\n -e PTRN Pattern to match" +//usage: "\n -f FILE Read pattern from file" +//usage: +//usage:#define grep_example_usage +//usage: "$ grep root /etc/passwd\n" +//usage: "root:x:0:0:root:/root:/bin/bash\n" +//usage: "$ grep ^[rR]oo. /etc/passwd\n" +//usage: "root:x:0:0:root:/root:/bin/bash\n" +//usage: +//usage:#define egrep_trivial_usage NOUSAGE_STR +//usage:#define egrep_full_usage "" +//usage:#define fgrep_trivial_usage NOUSAGE_STR +//usage:#define fgrep_full_usage "" + #define OPTSTR_GREP \ "lnqvscFiHhe:f:Lorm:w" \ IF_FEATURE_GREP_CONTEXT("A:B:C:") \ IF_FEATURE_GREP_EGREP_ALIAS("E") \ IF_EXTRA_COMPAT("z") \ "aI" - /* ignored: -a "assume all files to be text" */ /* ignored: -I "assume binary files have no matches" */ - enum { OPTBIT_l, /* list matched file names only */ OPTBIT_n, /* print line# */ diff --git a/findutils/xargs.c b/findutils/xargs.c index 8caaff91c..46a62cbf1 100644 --- a/findutils/xargs.c +++ b/findutils/xargs.c @@ -1,7 +1,6 @@ /* vi: set sw=4 ts=4: */ /* * Mini xargs implementation for busybox - * Options are supported: "-prtx -n max_arg -s max_chars -e[ouf_str]" * * (C) 2002,2003 by Vladimir Oleynik * @@ -14,9 +13,10 @@ * * xargs is described in the Single Unix Specification v3 at * http://www.opengroup.org/onlinepubs/007904975/utilities/xargs.html - * */ +//applet:IF_XARGS(APPLET_NOEXEC(xargs, xargs, _BB_DIR_USR_BIN, _BB_SUID_DROP, xargs)) + //kbuild:lib-$(CONFIG_XARGS) += xargs.o //config:config XARGS @@ -351,6 +351,29 @@ static int xargs_ask_confirmation(void) # define xargs_ask_confirmation() 1 #endif +//usage:#define xargs_trivial_usage +//usage: "[OPTIONS] [PROG ARGS]" +//usage:#define xargs_full_usage "\n\n" +//usage: "Run PROG on every item given by stdin\n" +//usage: "\nOptions:" +//usage: IF_FEATURE_XARGS_SUPPORT_CONFIRMATION( +//usage: "\n -p Ask user whether to run each command" +//usage: ) +//usage: "\n -r Don't run command if input is empty" +//usage: IF_FEATURE_XARGS_SUPPORT_ZERO_TERM( +//usage: "\n -0 Input is separated by NUL characters" +//usage: ) +//usage: "\n -t Print the command on stderr before execution" +//usage: "\n -e[STR] STR stops input processing" +//usage: "\n -n N Pass no more than N args to PROG" +//usage: "\n -s N Pass command line of no more than N bytes" +//usage: IF_FEATURE_XARGS_SUPPORT_TERMOPT( +//usage: "\n -x Exit if size is exceeded" +//usage: ) +//usage:#define xargs_example_usage +//usage: "$ ls | xargs gzip\n" +//usage: "$ find . -name '*.c' -print | xargs rm\n" + /* Correct regardless of combination of CONFIG_xxx */ enum { OPTBIT_VERBOSE = 0, diff --git a/include/applets.src.h b/include/applets.src.h index 2998a0ea9..9162b66c7 100644 --- a/include/applets.src.h +++ b/include/applets.src.h @@ -136,7 +136,6 @@ IF_DUMPLEASES(APPLET(dumpleases, _BB_DIR_USR_BIN, _BB_SUID_DROP)) //IF_E2LABEL(APPLET_ODDNAME(e2label, tune2fs, _BB_DIR_SBIN, _BB_SUID_DROP, e2label)) IF_ECHO(APPLET_NOFORK(echo, echo, _BB_DIR_BIN, _BB_SUID_DROP, echo)) IF_ED(APPLET(ed, _BB_DIR_BIN, _BB_SUID_DROP)) -IF_FEATURE_GREP_EGREP_ALIAS(APPLET_ODDNAME(egrep, grep, _BB_DIR_BIN, _BB_SUID_DROP, egrep)) IF_EJECT(APPLET(eject, _BB_DIR_USR_BIN, _BB_SUID_DROP)) IF_ENV(APPLET_NOEXEC(env, env, _BB_DIR_USR_BIN, _BB_SUID_DROP, env)) IF_ENVDIR(APPLET_ODDNAME(envdir, chpst, _BB_DIR_USR_BIN, _BB_SUID_DROP, envdir)) @@ -152,8 +151,6 @@ IF_FDFLUSH(APPLET_ODDNAME(fdflush, freeramdisk, _BB_DIR_BIN, _BB_SUID_DROP, fdfl IF_FDFORMAT(APPLET(fdformat, _BB_DIR_USR_BIN, _BB_SUID_DROP)) IF_FDISK(APPLET(fdisk, _BB_DIR_SBIN, _BB_SUID_DROP)) IF_FGCONSOLE(APPLET(fgconsole, _BB_DIR_USR_BIN, _BB_SUID_DROP)) -IF_FEATURE_GREP_FGREP_ALIAS(APPLET_ODDNAME(fgrep, grep, _BB_DIR_BIN, _BB_SUID_DROP, fgrep)) -IF_FIND(APPLET_NOEXEC(find, find, _BB_DIR_USR_BIN, _BB_SUID_DROP, find)) IF_FINDFS(APPLET(findfs, _BB_DIR_SBIN, _BB_SUID_MAYBE)) IF_FLASH_ERASEALL(APPLET(flash_eraseall, _BB_DIR_USR_SBIN, _BB_SUID_DROP)) IF_FLASH_LOCK(APPLET_ODDNAME(flash_lock, flash_lock_unlock, _BB_DIR_USR_SBIN, _BB_SUID_DROP, flash_lock)) @@ -176,7 +173,6 @@ IF_GETENFORCE(APPLET(getenforce, _BB_DIR_USR_SBIN, _BB_SUID_DROP)) IF_GETOPT(APPLET(getopt, _BB_DIR_BIN, _BB_SUID_DROP)) IF_GETSEBOOL(APPLET(getsebool, _BB_DIR_USR_SBIN, _BB_SUID_DROP)) IF_GETTY(APPLET(getty, _BB_DIR_SBIN, _BB_SUID_DROP)) -IF_GREP(APPLET(grep, _BB_DIR_BIN, _BB_SUID_DROP)) IF_GUNZIP(APPLET(gunzip, _BB_DIR_BIN, _BB_SUID_DROP)) IF_GZIP(APPLET(gzip, _BB_DIR_BIN, _BB_SUID_DROP)) IF_HALT(APPLET(halt, _BB_DIR_SBIN, _BB_SUID_DROP)) @@ -433,7 +429,6 @@ IF_WGET(APPLET(wget, _BB_DIR_USR_BIN, _BB_SUID_DROP)) IF_WHICH(APPLET(which, _BB_DIR_USR_BIN, _BB_SUID_DROP)) IF_WHO(APPLET(who, _BB_DIR_USR_BIN, _BB_SUID_DROP)) IF_WHOAMI(APPLET_NOFORK(whoami, whoami, _BB_DIR_USR_BIN, _BB_SUID_DROP, whoami)) -IF_XARGS(APPLET_NOEXEC(xargs, xargs, _BB_DIR_USR_BIN, _BB_SUID_DROP, xargs)) IF_UNXZ(APPLET_ODDNAME(xzcat, unxz, _BB_DIR_USR_BIN, _BB_SUID_DROP, xzcat)) IF_XZ(APPLET_ODDNAME(xz, unxz, _BB_DIR_USR_BIN, _BB_SUID_DROP, xz)) IF_YES(APPLET_NOFORK(yes, yes, _BB_DIR_USR_BIN, _BB_SUID_DROP, yes)) diff --git a/include/usage.src.h b/include/usage.src.h index bd2e56385..f30edbc54 100644 --- a/include/usage.src.h +++ b/include/usage.src.h @@ -1280,72 +1280,6 @@ INSERT #define findfs_example_usage \ "$ findfs LABEL=MyDevice" -#define find_trivial_usage \ - "[PATH]... [EXPRESSION]" -#define find_full_usage "\n\n" \ - "Search for files. The default PATH is the current directory,\n" \ - "default EXPRESSION is '-print'\n" \ - "\nEXPRESSION may consist of:" \ - "\n -follow Follow symlinks" \ - IF_FEATURE_FIND_XDEV( \ - "\n -xdev Don't descend directories on other filesystems") \ - IF_FEATURE_FIND_MAXDEPTH( \ - "\n -maxdepth N Descend at most N levels. -maxdepth 0 applies" \ - "\n tests/actions to command line arguments only") \ - "\n -mindepth N Don't act on first N levels" \ - "\n -name PATTERN File name (w/o directory name) matches PATTERN" \ - "\n -iname PATTERN Case insensitive -name" \ - IF_FEATURE_FIND_PATH( \ - "\n -path PATTERN Path matches PATTERN") \ - IF_FEATURE_FIND_REGEX( \ - "\n -regex PATTERN Path matches regex PATTERN") \ - IF_FEATURE_FIND_TYPE( \ - "\n -type X File type is X (X is one of: f,d,l,b,c,...)") \ - IF_FEATURE_FIND_PERM( \ - "\n -perm NNN Permissions match any of (+NNN), all of (-NNN)," \ - "\n or exactly NNN") \ - IF_FEATURE_FIND_MTIME( \ - "\n -mtime DAYS Modified time is greater than (+N), less than (-N)," \ - "\n or exactly N days") \ - IF_FEATURE_FIND_MMIN( \ - "\n -mmin MINS Modified time is greater than (+N), less than (-N)," \ - "\n or exactly N minutes") \ - IF_FEATURE_FIND_NEWER( \ - "\n -newer FILE Modified time is more recent than FILE's") \ - IF_FEATURE_FIND_INUM( \ - "\n -inum N File has inode number N") \ - IF_FEATURE_FIND_USER( \ - "\n -user NAME File is owned by user NAME (numeric user ID allowed)") \ - IF_FEATURE_FIND_GROUP( \ - "\n -group NAME File belongs to group NAME (numeric group ID allowed)") \ - IF_FEATURE_FIND_DEPTH( \ - "\n -depth Process directory name after traversing it") \ - IF_FEATURE_FIND_SIZE( \ - "\n -size N[bck] File size is N (c:bytes,k:kbytes,b:512 bytes(def.))" \ - "\n +/-N: file size is bigger/smaller than N") \ - IF_FEATURE_FIND_LINKS( \ - "\n -links N Number of links is greater than (+N), less than (-N)," \ - "\n or exactly N") \ - "\n -print Print (default and assumed)" \ - IF_FEATURE_FIND_PRINT0( \ - "\n -print0 Delimit output with null characters rather than" \ - "\n newlines") \ - IF_FEATURE_FIND_CONTEXT ( \ - "\n -context File has specified security context") \ - IF_FEATURE_FIND_EXEC( \ - "\n -exec CMD ARG ; Run CMD with all instances of {} replaced by the" \ - "\n matching files") \ - IF_FEATURE_FIND_PRUNE( \ - "\n -prune Stop traversing current subtree") \ - IF_FEATURE_FIND_DELETE( \ - "\n -delete Delete files, turns on -depth option") \ - IF_FEATURE_FIND_PAREN( \ - "\n (EXPR) Group an expression") \ - -#define find_example_usage \ - "$ find / -name passwd\n" \ - "/etc/passwd\n" - #define flash_lock_trivial_usage \ "MTD_DEVICE OFFSET SECTORS" #define flash_lock_full_usage "\n\n" \ @@ -1575,58 +1509,6 @@ INSERT "\n -I INITSTR Send INITSTR before anything else" \ "\n -H HOST Log HOST into the utmp file as the hostname" \ -#define grep_trivial_usage \ - "[-HhnlLoqvsriw" \ - "F" \ - IF_FEATURE_GREP_EGREP_ALIAS("E") \ - IF_EXTRA_COMPAT("z") \ - "] [-m N] " \ - IF_FEATURE_GREP_CONTEXT("[-A/B/C N] ") \ - "PATTERN/-e PATTERN.../-f FILE [FILE]..." -#define grep_full_usage "\n\n" \ - "Search for PATTERN in FILEs (or stdin)\n" \ - "\nOptions:" \ - "\n -H Add 'filename:' prefix" \ - "\n -h Do not add 'filename:' prefix" \ - "\n -n Add 'line_no:' prefix" \ - "\n -l Show only names of files that match" \ - "\n -L Show only names of files that don't match" \ - "\n -c Show only count of matching lines" \ - "\n -o Show only the matching part of line" \ - "\n -q Quiet. Return 0 if PATTERN is found, 1 otherwise" \ - "\n -v Select non-matching lines" \ - "\n -s Suppress open and read errors" \ - "\n -r Recurse" \ - "\n -i Ignore case" \ - "\n -w Match whole words only" \ - "\n -F PATTERN is a literal (not regexp)" \ - IF_FEATURE_GREP_EGREP_ALIAS( \ - "\n -E PATTERN is an extended regexp" \ - ) \ - IF_EXTRA_COMPAT( \ - "\n -z Input is NUL terminated" \ - ) \ - "\n -m N Match up to N times per file" \ - IF_FEATURE_GREP_CONTEXT( \ - "\n -A N Print N lines of trailing context" \ - "\n -B N Print N lines of leading context" \ - "\n -C N Same as '-A N -B N'" \ - ) \ - "\n -e PTRN Pattern to match" \ - "\n -f FILE Read pattern from file" \ - -#define grep_example_usage \ - "$ grep root /etc/passwd\n" \ - "root:x:0:0:root:/root:/bin/bash\n" \ - "$ grep ^[rR]oo. /etc/passwd\n" \ - "root:x:0:0:root:/root:/bin/bash\n" - -#define egrep_trivial_usage NOUSAGE_STR -#define egrep_full_usage "" - -#define fgrep_trivial_usage NOUSAGE_STR -#define fgrep_full_usage "" - #define gunzip_trivial_usage \ "[OPTIONS] [FILE]..." #define gunzip_full_usage "\n\n" \ @@ -5104,27 +4986,6 @@ INSERT #define whoami_full_usage "\n\n" \ "Print the user name associated with the current effective user id" -#define xargs_trivial_usage \ - "[OPTIONS] [PROG ARGS]" -#define xargs_full_usage "\n\n" \ - "Run PROG on every item given by stdin\n" \ - "\nOptions:" \ - IF_FEATURE_XARGS_SUPPORT_CONFIRMATION( \ - "\n -p Ask user whether to run each command") \ - "\n -r Don't run command if input is empty" \ - IF_FEATURE_XARGS_SUPPORT_ZERO_TERM( \ - "\n -0 Input is separated by NUL characters") \ - "\n -t Print the command on stderr before execution" \ - "\n -e[STR] STR stops input processing" \ - "\n -n N Pass no more than N args to PROG" \ - "\n -s N Pass command line of no more than N bytes" \ - IF_FEATURE_XARGS_SUPPORT_TERMOPT( \ - "\n -x Exit if size is exceeded") \ - -#define xargs_example_usage \ - "$ ls | xargs gzip\n" \ - "$ find . -name '*.c' -print | xargs rm\n" - #define zcat_trivial_usage \ "FILE" #define zcat_full_usage "\n\n" \