find: implement -executable
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 6 Jul 2018 19:04:41 +0000 (21:04 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 6 Jul 2018 19:04:41 +0000 (21:04 +0200)
function                                             old     new   delta
func_executable                                        -      19     +19
parse_params                                        1505    1519     +14
static.params                                        216     228     +12
packed_usage                                       32847   32855      +8
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 3/0 up/down: 53/0)               Total: 53 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
findutils/find.c

index 72732615bbec0afb12b4b8901919a491583137ed..6407c6c5afd2c623ba532975932e17db23de6c14 100644 (file)
 //config:      Enable searching based on file type (file,
 //config:      directory, socket, device, etc.).
 //config:
+//config:config FEATURE_FIND_EXECUTABLE
+//config:      bool "Enable -executable: file is executable"
+//config:      default y
+//config:      depends on FIND
+//config:
 //config:config FEATURE_FIND_XDEV
 //config:      bool "Enable -xdev: 'stay in filesystem'"
 //config:      default y
 //usage:       IF_FEATURE_FIND_TYPE(
 //usage:     "\n       -type X         File type is X (one of: f,d,l,b,c,s,p)"
 //usage:       )
+//usage:       IF_FEATURE_FIND_EXECUTABLE(
+//usage:     "\n       -executable     File is executable"
+//usage:       )
 //usage:       IF_FEATURE_FIND_PERM(
 //usage:     "\n       -perm MASK      At least one mask bit (+MASK), all bits (-MASK),"
 //usage:     "\n                       or exactly MASK bits are set in file's mode"
@@ -375,6 +383,7 @@ IF_FEATURE_FIND_PATH(   ACTS(path,  const char *pattern; bool ipath;))
 IF_FEATURE_FIND_REGEX(  ACTS(regex, regex_t compiled_pattern;))
 IF_FEATURE_FIND_PRINT0( ACTS(print0))
 IF_FEATURE_FIND_TYPE(   ACTS(type,  int type_mask;))
+IF_FEATURE_FIND_EXECUTABLE(ACTS(executable))
 IF_FEATURE_FIND_PERM(   ACTS(perm,  char perm_char; mode_t perm_mask;))
 IF_FEATURE_FIND_MTIME(  ACTS(mtime, char mtime_char; unsigned mtime_days;))
 IF_FEATURE_FIND_MMIN(   ACTS(mmin,  char mmin_char; unsigned mmin_mins;))
@@ -578,6 +587,12 @@ ACTF(type)
        return ((statbuf->st_mode & S_IFMT) == ap->type_mask);
 }
 #endif
+#if ENABLE_FEATURE_FIND_EXECUTABLE
+ACTF(executable)
+{
+       return access(fileName, X_OK) == 0;
+}
+#endif
 #if ENABLE_FEATURE_FIND_PERM
 ACTF(perm)
 {
@@ -975,6 +990,7 @@ static action*** parse_params(char **argv)
        IF_FEATURE_FIND_QUIT(   PARM_quit      ,)
        IF_FEATURE_FIND_DELETE( PARM_delete    ,)
        IF_FEATURE_FIND_EXEC(   PARM_exec      ,)
+       IF_FEATURE_FIND_EXECUTABLE(PARM_executable,)
        IF_FEATURE_FIND_PAREN(  PARM_char_brace,)
        /* All options/actions starting from here require argument */
                                PARM_name      ,
@@ -1019,6 +1035,7 @@ static action*** parse_params(char **argv)
        IF_FEATURE_FIND_QUIT(   "-quit\0"  )
        IF_FEATURE_FIND_DELETE( "-delete\0" )
        IF_FEATURE_FIND_EXEC(   "-exec\0"   )
+       IF_FEATURE_FIND_EXECUTABLE("-executable\0")
        IF_FEATURE_FIND_PAREN(  "(\0"       )
        /* All options/actions starting from here require argument */
                                "-name\0"
@@ -1288,6 +1305,11 @@ static action*** parse_params(char **argv)
                        dbg("created:type mask:%x", ap->type_mask);
                }
 #endif
+#if ENABLE_FEATURE_FIND_EXECUTABLE
+               else if (parm == PARM_executable) {
+                       (void) ALLOC_ACTION(executable);
+               }
+#endif
 #if ENABLE_FEATURE_FIND_PERM
 /* -perm BITS   File's mode bits are exactly BITS (octal or symbolic).
  *              Symbolic modes use mode 0 as a point of departure.