From af18b301eb16eb8496b31e5386b4c21c9045a5e6 Mon Sep 17 00:00:00 2001 From: Aaro Koskinen Date: Thu, 12 Sep 2019 12:04:13 +0200 Subject: [PATCH] find: implement -empty function old new delta func_empty - 121 +121 packed_usage 33154 33167 +13 parse_params 1490 1500 +10 static.params 228 235 +7 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 3/0 up/down: 151/0) Total: 151 bytes Signed-off-by: Aaro Koskinen Signed-off-by: Denys Vlasenko --- findutils/find.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/findutils/find.c b/findutils/find.c index d6679bd08..9a2c61b75 100644 --- a/findutils/find.c +++ b/findutils/find.c @@ -203,6 +203,14 @@ //config: WARNING: This option can do much harm if used wrong. Busybox will not //config: try to protect the user from doing stupid things. Use with care. //config: +//config:config FEATURE_FIND_EMPTY +//config: bool "Enable -empty: match empty files or directories" +//config: default y +//config: depends on FIND +//config: help +//config: Support the 'find -empty' option to find empty regular files +//config: or directories. +//config: //config:config FEATURE_FIND_PATH //config: bool "Enable -path: match pathname with shell pattern" //config: default y @@ -315,6 +323,9 @@ //usage: IF_FEATURE_FIND_CONTEXT( //usage: "\n -context CTX File has specified security context" //usage: ) +//usage: IF_FEATURE_FIND_EMPTY( +//usage: "\n -empty Match empty file/directory" +//usage: ) //usage: IF_FEATURE_FIND_PRUNE( //usage: "\n -prune If current file is directory, don't descend into it" //usage: ) @@ -396,6 +407,7 @@ IF_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;)) IF_FEATURE_FIND_PRUNE( ACTS(prune)) IF_FEATURE_FIND_QUIT( ACTS(quit)) IF_FEATURE_FIND_DELETE( ACTS(delete)) +IF_FEATURE_FIND_EMPTY( ACTS(empty)) IF_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; /* -exec ARGS */ unsigned *subst_count; @@ -824,6 +836,30 @@ ACTF(delete) return TRUE; } #endif +#if ENABLE_FEATURE_FIND_EMPTY +ACTF(empty) +{ + if (S_ISDIR(statbuf->st_mode)) { + DIR *dir; + struct dirent *dent; + + dir = opendir(fileName); + if (!dir) { + bb_simple_perror_msg(fileName); + return FALSE; + } + + while ((dent = readdir(dir)) != NULL + && DOT_OR_DOTDOT(dent->d_name) + ) { + continue; + } + closedir(dir); + return dent == NULL; + } + return S_ISREG(statbuf->st_mode) && statbuf->st_size == 0; +} +#endif #if ENABLE_FEATURE_FIND_CONTEXT ACTF(context) { @@ -989,6 +1025,7 @@ static action*** parse_params(char **argv) IF_FEATURE_FIND_PRUNE( PARM_prune ,) IF_FEATURE_FIND_QUIT( PARM_quit ,) IF_FEATURE_FIND_DELETE( PARM_delete ,) + IF_FEATURE_FIND_EMPTY( PARM_empty ,) IF_FEATURE_FIND_EXEC( PARM_exec ,) IF_FEATURE_FIND_EXECUTABLE(PARM_executable,) IF_FEATURE_FIND_PAREN( PARM_char_brace,) @@ -1034,6 +1071,7 @@ static action*** parse_params(char **argv) IF_FEATURE_FIND_PRUNE( "-prune\0" ) IF_FEATURE_FIND_QUIT( "-quit\0" ) IF_FEATURE_FIND_DELETE( "-delete\0" ) + IF_FEATURE_FIND_EMPTY( "-empty\0" ) IF_FEATURE_FIND_EXEC( "-exec\0" ) IF_FEATURE_FIND_EXECUTABLE("-executable\0") IF_FEATURE_FIND_PAREN( "(\0" ) @@ -1203,6 +1241,12 @@ static action*** parse_params(char **argv) (void) ALLOC_ACTION(delete); } #endif +#if ENABLE_FEATURE_FIND_EMPTY + else if (parm == PARM_empty) { + dbg("%d", __LINE__); + (void) ALLOC_ACTION(empty); + } +#endif #if ENABLE_FEATURE_FIND_EXEC else if (parm == PARM_exec) { int i; -- 2.25.1