[PATCH v2] find: implement -nouser, -nogroup

David Leonard d+busybox at adaptive-enterprises.com
Sun Jan 29 12:13:52 UTC 2023


* v2 Fix ifdef guard typo found by Kang-Che Sung

Subject: [PATCH v2] find: implement -nouser, -nogroup

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html

   -nouser
     The primary shall evaluate as true if the file belongs to a user ID
     for which the getpwuid() function defined in the System Interfaces
     volume of POSIX.1-2017 (or equivalent) returns NULL.

   -nogroup
     The primary shall evaluate as true if the file belongs to a group ID
     for which the getgrgid() function defined in the System Interfaces
     volume of POSIX.1-2017 (or equivalent) returns NULL.

function                                             old     new   delta
parse_params                                        1811    1845     +34
func_nouser                                            -      24     +24
func_nogroup                                           -      24     +24
static.params                                        275     292     +17
.rodata                                           100767  100775      +8
packed_usage                                       34553   34541     -12
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 3/1 up/down: 107/-12)            Total: 95 bytes
    text	   data	    bss	    dec	    hex	filename
1064435	  16587	   1816	1082838	 1085d6	busybox_old
1064530	  16587	   1816	1082933	 108635	busybox_unstripped
---
  findutils/find.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
  1 file changed, 46 insertions(+)

diff --git a/findutils/find.c b/findutils/find.c
index 40f66ab2e..fc7fd14b5 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -197,6 +197,16 @@
  //config:	default y
  //config:	depends on FIND
  //config:
+//config:config FEATURE_FIND_NOUSER
+//config:	bool "Enable -nouser matching"
+//config:	default y
+//config:	depends on FIND
+//config:
+//config:config FEATURE_FIND_NOGROUP
+//config:	bool "Enable -nogroup matching"
+//config:	default y
+//config:	depends on FIND
+//config:
  //config:config FEATURE_FIND_NOT
  //config:	bool "Enable the 'not' (!) operator"
  //config:	default y
@@ -373,6 +383,12 @@
  //usage:	IF_FEATURE_FIND_GROUP(
  //usage:     "\n	-group NAME/ID	File is owned by given group"
  //usage:	)
+//usage:	IF_FEATURE_FIND_NOUSER(
+//usage:     "\n	-nouser		File is owned by unknown uid"
+//usage:	)
+//usage:	IF_FEATURE_FIND_NOGROUP(
+//usage:     "\n	-nogroup	File is owned by unknown gid"
+//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"
@@ -466,6 +482,8 @@ IF_FEATURE_FIND_NEWER(  ACTS(newer, time_t newer_mtime;))
  IF_FEATURE_FIND_INUM(   ACTS(inum,  ino_t inode_num;))
  IF_FEATURE_FIND_SAMEFILE(ACTS(samefile, ino_t inode_num; dev_t device;))
  IF_FEATURE_FIND_USER(   ACTS(user,  uid_t uid;))
+IF_FEATURE_FIND_NOUSER( ACTS(nouser))
+IF_FEATURE_FIND_NOGROUP(ACTS(nogroup))
  IF_FEATURE_FIND_SIZE(   ACTS(size,  char size_char; off_t size;))
  IF_FEATURE_FIND_CONTEXT(ACTS(context, security_context_t context;))
  IF_FEATURE_FIND_PAREN(  ACTS(paren, action ***subexpr;))
@@ -891,6 +909,18 @@ ACTF(group)
  	return (statbuf->st_gid == ap->gid);
  }
  #endif
+#if ENABLE_FEATURE_FIND_NOUSER
+ACTF(nouser)
+{
+	return !getpwuid(statbuf->st_uid);
+}
+#endif
+#if ENABLE_FEATURE_FIND_NOGROUP
+ACTF(nogroup)
+{
+	return !getgrgid(statbuf->st_gid);
+}
+#endif
  #if ENABLE_FEATURE_FIND_PRINT0
  ACTF(print0)
  {
@@ -1144,6 +1174,8 @@ static action*** parse_params(char **argv)
  	IF_FEATURE_FIND_QUIT(   PARM_quit      ,)
  	IF_FEATURE_FIND_DELETE( PARM_delete    ,)
  	IF_FEATURE_FIND_EMPTY(	PARM_empty     ,)
+	IF_FEATURE_FIND_NOUSER( PARM_nouser    ,)
+	IF_FEATURE_FIND_NOGROUP(PARM_nogroup   ,)
  	IF_FEATURE_FIND_EXEC(   PARM_exec      ,)
  	IF_FEATURE_FIND_EXEC_OK(PARM_ok        ,)
  	IF_FEATURE_FIND_EXECUTABLE(PARM_executable,)
@@ -1196,6 +1228,8 @@ static action*** parse_params(char **argv)
  	IF_FEATURE_FIND_QUIT(   "-quit\0"  )
  	IF_FEATURE_FIND_DELETE( "-delete\0" )
  	IF_FEATURE_FIND_EMPTY(	"-empty\0"  )
+	IF_FEATURE_FIND_NOUSER( "-nouser\0"   )
+	IF_FEATURE_FIND_NOGROUP("-nogroup\0"  )
  	IF_FEATURE_FIND_EXEC(   "-exec\0"   )
  	IF_FEATURE_FIND_EXEC_OK("-ok\0"     )
  	IF_FEATURE_FIND_EXECUTABLE("-executable\0")
@@ -1594,6 +1628,18 @@ static action*** parse_params(char **argv)
  				ap->gid = xgroup2gid(arg1);
  		}
  #endif
+#if ENABLE_FEATURE_FIND_NOUSER
+		else if (parm == PARM_nouser) {
+			dbg("%d", __LINE__);
+			(void) ALLOC_ACTION(nouser);
+		}
+#endif
+#if ENABLE_FEATURE_FIND_NOGROUP
+		else if (parm == PARM_nogroup) {
+			dbg("%d", __LINE__);
+			(void) ALLOC_ACTION(nogroup);
+		}
+#endif
  #if ENABLE_FEATURE_FIND_SIZE
  		else if (parm == PARM_size) {
  /* -size n[bckw]: file uses n units of space
-- 
2.34.1



More information about the busybox mailing list