diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-04-04 23:41:35 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-04-04 23:41:35 +0000 |
| commit | 56fce00fc7c11c2b8dabac5ba0ef6a0a8a19dee5 (patch) | |
| tree | 7e59e42ff0a038c125a9335ff78953b390fe01ea | |
| parent | febe3c421109032cdfb36249c54e314d39256ace (diff) | |
| download | busybox-w32-56fce00fc7c11c2b8dabac5ba0ef6a0a8a19dee5.tar.gz busybox-w32-56fce00fc7c11c2b8dabac5ba0ef6a0a8a19dee5.tar.bz2 busybox-w32-56fce00fc7c11c2b8dabac5ba0ef6a0a8a19dee5.zip | |
find: un-DESKTOPize (Kai Schwenzfeier <niteblade@gmx.net>)
find: -group, -depth (Natanael Copa <natanael.copa@gmail.com>)
find: make constant array static, declare PARM_xx constants with enum
| -rw-r--r-- | findutils/Config.in | 42 | ||||
| -rw-r--r-- | findutils/find.c | 228 | ||||
| -rw-r--r-- | include/usage.h | 4 |
3 files changed, 158 insertions, 116 deletions
diff --git a/findutils/Config.in b/findutils/Config.in index dd8a8c9bb..09a5bb3cb 100644 --- a/findutils/Config.in +++ b/findutils/Config.in | |||
| @@ -90,14 +90,50 @@ config FEATURE_FIND_USER | |||
| 90 | help | 90 | help |
| 91 | Support the 'find -user' option for searching by username or uid. | 91 | Support the 'find -user' option for searching by username or uid. |
| 92 | 92 | ||
| 93 | config FEATURE_FIND_GROUP | ||
| 94 | bool "Enable group/gid matching (-group) option" | ||
| 95 | default y | ||
| 96 | depends on FIND | ||
| 97 | help | ||
| 98 | Support the 'find -group' option for searching by group name or gid. | ||
| 99 | |||
| 93 | config FEATURE_FIND_NOT | 100 | config FEATURE_FIND_NOT |
| 94 | bool "Enable the 'not' (!) operator" | 101 | bool "Enable the 'not' (!) operator" |
| 95 | default y | 102 | default y |
| 96 | depends on FIND | 103 | depends on FIND |
| 97 | help | 104 | help |
| 98 | Support the '!' operator to invert the test results. If 'Enable | 105 | Support the '!' operator to invert the test results. |
| 99 | full-blown desktop' is enabled, then will also support the | 106 | If 'Enable full-blown desktop' is enabled, then will also support |
| 100 | non-POSIX notation '-not'. | 107 | the non-POSIX notation '-not'. |
| 108 | |||
| 109 | config FEATURE_FIND_DEPTH | ||
| 110 | bool "Enable the -depth option" | ||
| 111 | default y | ||
| 112 | depends on FIND | ||
| 113 | help | ||
| 114 | Process each directory's contents before the directory itself. | ||
| 115 | |||
| 116 | config FEATURE_FIND_PAREN | ||
| 117 | bool "Enable parens in options" | ||
| 118 | default y | ||
| 119 | depends on FIND | ||
| 120 | help | ||
| 121 | Enable usage of parens '(' to specify logical order of arguments. | ||
| 122 | |||
| 123 | config FEATURE_FIND_SIZE | ||
| 124 | bool "Enable (-size) option allowing matching for file size" | ||
| 125 | default y | ||
| 126 | depends on FIND | ||
| 127 | help | ||
| 128 | Support the 'find -size' option for searching by file size. | ||
| 129 | |||
| 130 | config FEATURE_FIND_PRUNE | ||
| 131 | bool "Enable (-prune) option allowing to exclude subdirectories" | ||
| 132 | default y | ||
| 133 | depends on FIND | ||
| 134 | help | ||
| 135 | If the file is a directory, dont descend into it. Useful for | ||
| 136 | exclusion .svn and CVS directories. | ||
| 101 | 137 | ||
| 102 | config GREP | 138 | config GREP |
| 103 | bool "grep" | 139 | bool "grep" |
diff --git a/findutils/find.c b/findutils/find.c index a4fe5d187..9ca38c21a 100644 --- a/findutils/find.c +++ b/findutils/find.c | |||
| @@ -71,14 +71,15 @@ USE_FEATURE_FIND_MMIN( ACTS(mmin, char mmin_char; unsigned mmin_mins;)) | |||
| 71 | USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;)) | 71 | USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;)) |
| 72 | USE_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;)) | 72 | USE_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;)) |
| 73 | USE_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; unsigned int *subst_count; int exec_argc;)) | 73 | USE_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; unsigned int *subst_count; int exec_argc;)) |
| 74 | USE_FEATURE_FIND_USER( ACTS(user, int uid;)) | 74 | USE_FEATURE_FIND_USER( ACTS(user, uid_t uid;)) |
| 75 | USE_DESKTOP( ACTS(paren, action ***subexpr;)) | 75 | USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;)) |
| 76 | USE_DESKTOP( ACTS(size, off_t size;)) | 76 | USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;)) |
| 77 | USE_DESKTOP( ACTS(prune)) | 77 | USE_FEATURE_FIND_SIZE( ACTS(size, off_t size;)) |
| 78 | USE_FEATURE_FIND_PRUNE( ACTS(prune)) | ||
| 78 | 79 | ||
| 79 | static action ***actions; | 80 | static action ***actions; |
| 80 | static bool need_print = 1; | 81 | static bool need_print = 1; |
| 81 | 82 | static int recurse_flags = action_recurse; | |
| 82 | 83 | ||
| 83 | #if ENABLE_FEATURE_FIND_EXEC | 84 | #if ENABLE_FEATURE_FIND_EXEC |
| 84 | static unsigned int count_subst(const char *str) | 85 | static unsigned int count_subst(const char *str) |
| @@ -231,6 +232,13 @@ ACTF(user) | |||
| 231 | } | 232 | } |
| 232 | #endif | 233 | #endif |
| 233 | 234 | ||
| 235 | #if ENABLE_FEATURE_FIND_GROUP | ||
| 236 | ACTF(group) | ||
| 237 | { | ||
| 238 | return (statbuf->st_gid == ap->gid); | ||
| 239 | } | ||
| 240 | #endif | ||
| 241 | |||
| 234 | #if ENABLE_FEATURE_FIND_PRINT0 | 242 | #if ENABLE_FEATURE_FIND_PRINT0 |
| 235 | ACTF(print0) | 243 | ACTF(print0) |
| 236 | { | 244 | { |
| @@ -245,12 +253,14 @@ ACTF(print) | |||
| 245 | return TRUE; | 253 | return TRUE; |
| 246 | } | 254 | } |
| 247 | 255 | ||
| 248 | #if ENABLE_DESKTOP | 256 | #if ENABLE_FEATURE_FIND_PAREN |
| 249 | ACTF(paren) | 257 | ACTF(paren) |
| 250 | { | 258 | { |
| 251 | return exec_actions(ap->subexpr, fileName, statbuf); | 259 | return exec_actions(ap->subexpr, fileName, statbuf); |
| 252 | } | 260 | } |
| 261 | #endif | ||
| 253 | 262 | ||
| 263 | #if ENABLE_FEATURE_FIND_SIZE | ||
| 254 | /* | 264 | /* |
| 255 | * -prune: if -depth is not given, return true and do not descend | 265 | * -prune: if -depth is not given, return true and do not descend |
| 256 | * current dir; if -depth is given, return false with no effect. | 266 | * current dir; if -depth is given, return false with no effect. |
| @@ -261,7 +271,9 @@ ACTF(prune) | |||
| 261 | { | 271 | { |
| 262 | return SKIP; | 272 | return SKIP; |
| 263 | } | 273 | } |
| 274 | #endif | ||
| 264 | 275 | ||
| 276 | #if ENABLE_FEATURE_FIND_PRUNE | ||
| 265 | ACTF(size) | 277 | ACTF(size) |
| 266 | { | 278 | { |
| 267 | return statbuf->st_size == ap->size; | 279 | return statbuf->st_size == ap->size; |
| @@ -327,81 +339,69 @@ static const char* plus_minus_num(const char* str) | |||
| 327 | } | 339 | } |
| 328 | #endif | 340 | #endif |
| 329 | 341 | ||
| 330 | #define PARM_a 0 | ||
| 331 | #define PARM_o 1 | ||
| 332 | #define PARM_char_not (PARM_o + ENABLE_FEATURE_FIND_NOT) | ||
| 333 | #define PARM_print (PARM_char_not + 1) | ||
| 334 | #define PARM_print0 (PARM_print + ENABLE_FEATURE_FIND_PRINT0) | ||
| 335 | #define PARM_name (PARM_print0 + 1) | ||
| 336 | #define PARM_type (PARM_name + ENABLE_FEATURE_FIND_TYPE) | ||
| 337 | #define PARM_perm (PARM_type + ENABLE_FEATURE_FIND_PERM) | ||
| 338 | #define PARM_mtime (PARM_perm + ENABLE_FEATURE_FIND_MTIME) | ||
| 339 | #define PARM_mmin (PARM_mtime + ENABLE_FEATURE_FIND_MMIN) | ||
| 340 | #define PARM_newer (PARM_mmin + ENABLE_FEATURE_FIND_NEWER) | ||
| 341 | #define PARM_inum (PARM_newer + ENABLE_FEATURE_FIND_INUM) | ||
| 342 | #define PARM_exec (PARM_inum + ENABLE_FEATURE_FIND_EXEC) | ||
| 343 | #define PARM_user (PARM_exec + ENABLE_FEATURE_FIND_USER) | ||
| 344 | #if ENABLE_DESKTOP | ||
| 345 | #define PARM_and (PARM_user + 1) | ||
| 346 | #define PARM_or (PARM_and + 1) | ||
| 347 | #define PARM_not (PARM_or + ENABLE_FEATURE_FIND_NOT) | ||
| 348 | #define PARM_char_brace (PARM_not + 1) | ||
| 349 | #define PARM_prune (PARM_char_brace + 1) | ||
| 350 | #define PARM_size (PARM_prune + 1) | ||
| 351 | #endif | ||
| 352 | static action*** parse_params(char **argv) | 342 | static action*** parse_params(char **argv) |
| 353 | { | 343 | { |
| 354 | action*** appp; | 344 | enum { |
| 355 | unsigned cur_group = 0; | 345 | PARM_a , |
| 356 | unsigned cur_action = 0; | 346 | PARM_o , |
| 357 | USE_FEATURE_FIND_NOT( bool invert_flag = 0; ) | 347 | USE_FEATURE_FIND_NOT( PARM_char_not ,) |
| 358 | const char * const params[] = { | 348 | PARM_print , |
| 359 | "-a", | 349 | USE_FEATURE_FIND_PRINT0(PARM_print0 ,) |
| 360 | "-o", | 350 | PARM_name , |
| 361 | #if ENABLE_FEATURE_FIND_NOT | 351 | USE_FEATURE_FIND_TYPE( PARM_type ,) |
| 362 | "!", | 352 | USE_FEATURE_FIND_PERM( PARM_perm ,) |
| 363 | #endif | 353 | USE_FEATURE_FIND_MTIME( PARM_mtime ,) |
| 364 | "-print", | 354 | USE_FEATURE_FIND_MMIN( PARM_mmin ,) |
| 365 | #if ENABLE_FEATURE_FIND_PRINT0 | 355 | USE_FEATURE_FIND_NEWER( PARM_newer ,) |
| 366 | "-print0", | 356 | USE_FEATURE_FIND_INUM( PARM_inum ,) |
| 367 | #endif | 357 | USE_FEATURE_FIND_EXEC( PARM_exec ,) |
| 368 | "-name", | 358 | USE_FEATURE_FIND_USER( PARM_user ,) |
| 369 | #if ENABLE_FEATURE_FIND_TYPE | 359 | USE_FEATURE_FIND_GROUP( PARM_group ,) |
| 370 | "-type", | 360 | USE_FEATURE_FIND_DEPTH( PARM_depth ,) |
| 371 | #endif | 361 | USE_FEATURE_FIND_PAREN( PARM_char_brace,) |
| 372 | #if ENABLE_FEATURE_FIND_PERM | 362 | USE_FEATURE_FIND_SIZE( PARM_prune ,) |
| 373 | "-perm", | 363 | USE_FEATURE_FIND_PRUNE( PARM_size ,) |
| 374 | #endif | 364 | #if ENABLE_DESKTOP |
| 375 | #if ENABLE_FEATURE_FIND_MTIME | 365 | PARM_and , |
| 376 | "-mtime", | 366 | PARM_or , |
| 377 | #endif | 367 | USE_FEATURE_FIND_NOT( PARM_not ,) |
| 378 | #if ENABLE_FEATURE_FIND_MMIN | ||
| 379 | "-mmin", | ||
| 380 | #endif | ||
| 381 | #if ENABLE_FEATURE_FIND_NEWER | ||
| 382 | "-newer", | ||
| 383 | #endif | ||
| 384 | #if ENABLE_FEATURE_FIND_INUM | ||
| 385 | "-inum", | ||
| 386 | #endif | ||
| 387 | #if ENABLE_FEATURE_FIND_EXEC | ||
| 388 | "-exec", | ||
| 389 | #endif | ||
| 390 | #if ENABLE_FEATURE_FIND_USER | ||
| 391 | "-user", | ||
| 392 | #endif | 368 | #endif |
| 369 | }; | ||
| 370 | |||
| 371 | static const char *const params[] = { | ||
| 372 | "-a" , | ||
| 373 | "-o" , | ||
| 374 | USE_FEATURE_FIND_NOT( "!" ,) | ||
| 375 | "-print" , | ||
| 376 | USE_FEATURE_FIND_PRINT0("-print0",) | ||
| 377 | "-name" , | ||
| 378 | USE_FEATURE_FIND_TYPE( "-type" ,) | ||
| 379 | USE_FEATURE_FIND_PERM( "-perm" ,) | ||
| 380 | USE_FEATURE_FIND_MTIME( "-mtime" ,) | ||
| 381 | USE_FEATURE_FIND_MMIN( "-mmin" ,) | ||
| 382 | USE_FEATURE_FIND_NEWER( "-newer" ,) | ||
| 383 | USE_FEATURE_FIND_INUM( "-inum" ,) | ||
| 384 | USE_FEATURE_FIND_EXEC( "-exec" ,) | ||
| 385 | USE_FEATURE_FIND_USER( "-user" ,) | ||
| 386 | USE_FEATURE_FIND_GROUP( "-group" ,) | ||
| 387 | USE_FEATURE_FIND_DEPTH( "-depth" ,) | ||
| 388 | USE_FEATURE_FIND_PAREN( "(" ,) | ||
| 389 | USE_FEATURE_FIND_SIZE( "-prune" ,) | ||
| 390 | USE_FEATURE_FIND_PRUNE( "-size" ,) | ||
| 393 | #if ENABLE_DESKTOP | 391 | #if ENABLE_DESKTOP |
| 394 | "-and", | 392 | "-and" , |
| 395 | "-or", | 393 | "-or" , |
| 396 | # if ENABLE_FEATURE_FIND_NOT | 394 | USE_FEATURE_FIND_NOT( "-not" ,) |
| 397 | "-not", | ||
| 398 | # endif | ||
| 399 | "(", | ||
| 400 | "-prune", | ||
| 401 | "-size", | ||
| 402 | #endif | 395 | #endif |
| 403 | NULL | 396 | NULL |
| 404 | }; | 397 | }; |
| 398 | |||
| 399 | action*** appp; | ||
| 400 | unsigned cur_group = 0; | ||
| 401 | unsigned cur_action = 0; | ||
| 402 | USE_FEATURE_FIND_NOT( bool invert_flag = 0; ) | ||
| 403 | |||
| 404 | /* 'static' doesn't work here! (gcc 4.1.2) */ | ||
| 405 | action* alloc_action(int sizeof_struct, action_fp f) | 405 | action* alloc_action(int sizeof_struct, action_fp f) |
| 406 | { | 406 | { |
| 407 | action *ap; | 407 | action *ap; |
| @@ -413,6 +413,7 @@ static action*** parse_params(char **argv) | |||
| 413 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | 413 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) |
| 414 | return ap; | 414 | return ap; |
| 415 | } | 415 | } |
| 416 | |||
| 416 | #define ALLOC_ACTION(name) (action_##name*)alloc_action(sizeof(action_##name), (action_fp) func_##name) | 417 | #define ALLOC_ACTION(name) (action_##name*)alloc_action(sizeof(action_##name), (action_fp) func_##name) |
| 417 | 418 | ||
| 418 | appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */ | 419 | appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */ |
| @@ -436,12 +437,10 @@ static action*** parse_params(char **argv) | |||
| 436 | const char *arg1 = argv[1]; | 437 | const char *arg1 = argv[1]; |
| 437 | int parm = index_in_str_array(params, arg); | 438 | int parm = index_in_str_array(params, arg); |
| 438 | /* --- Operators --- */ | 439 | /* --- Operators --- */ |
| 439 | if (parm == PARM_a USE_DESKTOP(|| parm == PARM_and)) | 440 | if (parm == PARM_a USE_DESKTOP(|| parm == PARM_and)) { |
| 440 | { | ||
| 441 | /* no further special handling required */ | 441 | /* no further special handling required */ |
| 442 | } | 442 | } |
| 443 | else if (parm == PARM_o USE_DESKTOP(|| parm == PARM_or)) | 443 | else if (parm == PARM_o USE_DESKTOP(|| parm == PARM_or)) { |
| 444 | { | ||
| 445 | /* start new OR group */ | 444 | /* start new OR group */ |
| 446 | cur_group++; | 445 | cur_group++; |
| 447 | appp = xrealloc(appp, (cur_group+2) * sizeof(*appp)); | 446 | appp = xrealloc(appp, (cur_group+2) * sizeof(*appp)); |
| @@ -450,31 +449,27 @@ static action*** parse_params(char **argv) | |||
| 450 | cur_action = 0; | 449 | cur_action = 0; |
| 451 | } | 450 | } |
| 452 | #if ENABLE_FEATURE_FIND_NOT | 451 | #if ENABLE_FEATURE_FIND_NOT |
| 453 | else if (parm == PARM_char_not USE_DESKTOP(|| parm == PARM_not)) | 452 | else if (parm == PARM_char_not USE_DESKTOP(|| parm == PARM_not)) { |
| 454 | { | ||
| 455 | /* also handles "find ! ! -name 'foo*'" */ | 453 | /* also handles "find ! ! -name 'foo*'" */ |
| 456 | invert_flag ^= 1; | 454 | invert_flag ^= 1; |
| 457 | } | 455 | } |
| 458 | #endif | 456 | #endif |
| 459 | 457 | ||
| 460 | /* --- Tests and actions --- */ | 458 | /* --- Tests and actions --- */ |
| 461 | else if (parm == PARM_print) | 459 | else if (parm == PARM_print) { |
| 462 | { | ||
| 463 | need_print = 0; | 460 | need_print = 0; |
| 464 | /* GNU find ignores '!' here: "find ! -print" */ | 461 | /* GNU find ignores '!' here: "find ! -print" */ |
| 465 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | 462 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) |
| 466 | (void) ALLOC_ACTION(print); | 463 | (void) ALLOC_ACTION(print); |
| 467 | } | 464 | } |
| 468 | #if ENABLE_FEATURE_FIND_PRINT0 | 465 | #if ENABLE_FEATURE_FIND_PRINT0 |
| 469 | else if (parm == PARM_print0) | 466 | else if (parm == PARM_print0) { |
| 470 | { | ||
| 471 | need_print = 0; | 467 | need_print = 0; |
| 472 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | 468 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) |
| 473 | (void) ALLOC_ACTION(print0); | 469 | (void) ALLOC_ACTION(print0); |
| 474 | } | 470 | } |
| 475 | #endif | 471 | #endif |
| 476 | else if (parm == PARM_name) | 472 | else if (parm == PARM_name) { |
| 477 | { | ||
| 478 | action_name *ap; | 473 | action_name *ap; |
| 479 | if (!*++argv) | 474 | if (!*++argv) |
| 480 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 475 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| @@ -482,8 +477,7 @@ static action*** parse_params(char **argv) | |||
| 482 | ap->pattern = arg1; | 477 | ap->pattern = arg1; |
| 483 | } | 478 | } |
| 484 | #if ENABLE_FEATURE_FIND_TYPE | 479 | #if ENABLE_FEATURE_FIND_TYPE |
| 485 | else if (parm == PARM_type) | 480 | else if (parm == PARM_type) { |
| 486 | { | ||
| 487 | action_type *ap; | 481 | action_type *ap; |
| 488 | if (!*++argv) | 482 | if (!*++argv) |
| 489 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 483 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| @@ -498,8 +492,7 @@ static action*** parse_params(char **argv) | |||
| 498 | * -perm -mode All of the permission bits mode are set for the file. | 492 | * -perm -mode All of the permission bits mode are set for the file. |
| 499 | * -perm +mode Any of the permission bits mode are set for the file. | 493 | * -perm +mode Any of the permission bits mode are set for the file. |
| 500 | */ | 494 | */ |
| 501 | else if (parm == PARM_perm) | 495 | else if (parm == PARM_perm) { |
| 502 | { | ||
| 503 | action_perm *ap; | 496 | action_perm *ap; |
| 504 | if (!*++argv) | 497 | if (!*++argv) |
| 505 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 498 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| @@ -512,8 +505,7 @@ static action*** parse_params(char **argv) | |||
| 512 | } | 505 | } |
| 513 | #endif | 506 | #endif |
| 514 | #if ENABLE_FEATURE_FIND_MTIME | 507 | #if ENABLE_FEATURE_FIND_MTIME |
| 515 | else if (parm == PARM_mtime) | 508 | else if (parm == PARM_mtime) { |
| 516 | { | ||
| 517 | action_mtime *ap; | 509 | action_mtime *ap; |
| 518 | if (!*++argv) | 510 | if (!*++argv) |
| 519 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 511 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| @@ -523,8 +515,7 @@ static action*** parse_params(char **argv) | |||
| 523 | } | 515 | } |
| 524 | #endif | 516 | #endif |
| 525 | #if ENABLE_FEATURE_FIND_MMIN | 517 | #if ENABLE_FEATURE_FIND_MMIN |
| 526 | else if (parm == PARM_mmin) | 518 | else if (parm == PARM_mmin) { |
| 527 | { | ||
| 528 | action_mmin *ap; | 519 | action_mmin *ap; |
| 529 | if (!*++argv) | 520 | if (!*++argv) |
| 530 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 521 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| @@ -534,8 +525,7 @@ static action*** parse_params(char **argv) | |||
| 534 | } | 525 | } |
| 535 | #endif | 526 | #endif |
| 536 | #if ENABLE_FEATURE_FIND_NEWER | 527 | #if ENABLE_FEATURE_FIND_NEWER |
| 537 | else if (parm == PARM_newer) | 528 | else if (parm == PARM_newer) { |
| 538 | { | ||
| 539 | action_newer *ap; | 529 | action_newer *ap; |
| 540 | struct stat stat_newer; | 530 | struct stat stat_newer; |
| 541 | if (!*++argv) | 531 | if (!*++argv) |
| @@ -546,8 +536,7 @@ static action*** parse_params(char **argv) | |||
| 546 | } | 536 | } |
| 547 | #endif | 537 | #endif |
| 548 | #if ENABLE_FEATURE_FIND_INUM | 538 | #if ENABLE_FEATURE_FIND_INUM |
| 549 | else if (parm == PARM_inum) | 539 | else if (parm == PARM_inum) { |
| 550 | { | ||
| 551 | action_inum *ap; | 540 | action_inum *ap; |
| 552 | if (!*++argv) | 541 | if (!*++argv) |
| 553 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 542 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| @@ -556,8 +545,7 @@ static action*** parse_params(char **argv) | |||
| 556 | } | 545 | } |
| 557 | #endif | 546 | #endif |
| 558 | #if ENABLE_FEATURE_FIND_EXEC | 547 | #if ENABLE_FEATURE_FIND_EXEC |
| 559 | else if (parm == PARM_exec) | 548 | else if (parm == PARM_exec) { |
| 560 | { | ||
| 561 | int i; | 549 | int i; |
| 562 | action_exec *ap; | 550 | action_exec *ap; |
| 563 | need_print = 0; | 551 | need_print = 0; |
| @@ -582,8 +570,7 @@ static action*** parse_params(char **argv) | |||
| 582 | } | 570 | } |
| 583 | #endif | 571 | #endif |
| 584 | #if ENABLE_FEATURE_FIND_USER | 572 | #if ENABLE_FEATURE_FIND_USER |
| 585 | else if (parm == PARM_user) | 573 | else if (parm == PARM_user) { |
| 586 | { | ||
| 587 | action_user *ap; | 574 | action_user *ap; |
| 588 | if (!*++argv) | 575 | if (!*++argv) |
| 589 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 576 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| @@ -593,9 +580,24 @@ static action*** parse_params(char **argv) | |||
| 593 | ap->uid = xuname2uid(arg1); | 580 | ap->uid = xuname2uid(arg1); |
| 594 | } | 581 | } |
| 595 | #endif | 582 | #endif |
| 596 | #if ENABLE_DESKTOP | 583 | #if ENABLE_FEATURE_FIND_GROUP |
| 597 | else if (parm == PARM_char_brace) | 584 | else if (parm == PARM_group) { |
| 598 | { | 585 | action_group *ap; |
| 586 | if (!*++argv) | ||
| 587 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | ||
| 588 | ap = ALLOC_ACTION(group); | ||
| 589 | ap->gid = bb_strtou(arg1, NULL, 10); | ||
| 590 | if (errno) | ||
| 591 | ap->gid = xgroup2gid(arg1); | ||
| 592 | } | ||
| 593 | #endif | ||
| 594 | #if ENABLE_FEATURE_FIND_DEPTH | ||
| 595 | else if (parm == PARM_depth) { | ||
| 596 | recurse_flags |= action_depthFirst; | ||
| 597 | } | ||
| 598 | #endif | ||
| 599 | #if ENABLE_FEATURE_FIND_PAREN | ||
| 600 | else if (parm == PARM_char_brace) { | ||
| 599 | action_paren *ap; | 601 | action_paren *ap; |
| 600 | char **endarg; | 602 | char **endarg; |
| 601 | unsigned nested = 1; | 603 | unsigned nested = 1; |
| @@ -616,13 +618,15 @@ static action*** parse_params(char **argv) | |||
| 616 | *endarg = (char*) ")"; /* restore NULLed parameter */ | 618 | *endarg = (char*) ")"; /* restore NULLed parameter */ |
| 617 | argv = endarg; | 619 | argv = endarg; |
| 618 | } | 620 | } |
| 619 | else if (parm == PARM_prune) | 621 | #endif |
| 620 | { | 622 | #if ENABLE_FEATURE_FIND_PRUNE |
| 623 | else if (parm == PARM_prune) { | ||
| 621 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) | 624 | USE_FEATURE_FIND_NOT( invert_flag = 0; ) |
| 622 | (void) ALLOC_ACTION(prune); | 625 | (void) ALLOC_ACTION(prune); |
| 623 | } | 626 | } |
| 624 | else if (parm == PARM_size) | 627 | #endif |
| 625 | { | 628 | #if ENABLE_FEATURE_FIND_SIZE |
| 629 | else if (parm == PARM_size) { | ||
| 626 | action_size *ap; | 630 | action_size *ap; |
| 627 | if (!*++argv) | 631 | if (!*++argv) |
| 628 | bb_error_msg_and_die(bb_msg_requires_arg, arg); | 632 | bb_error_msg_and_die(bb_msg_requires_arg, arg); |
| @@ -657,7 +661,7 @@ USE_FEATURE_FIND_XDEV( "-xdev", ) | |||
| 657 | break; | 661 | break; |
| 658 | if (ENABLE_FEATURE_FIND_NOT && LONE_CHAR(argv[firstopt], '!')) | 662 | if (ENABLE_FEATURE_FIND_NOT && LONE_CHAR(argv[firstopt], '!')) |
| 659 | break; | 663 | break; |
| 660 | #if ENABLE_DESKTOP | 664 | #if ENABLE_FEATURE_FIND_PAREN |
| 661 | if (LONE_CHAR(argv[firstopt], '(')) | 665 | if (LONE_CHAR(argv[firstopt], '(')) |
| 662 | break; | 666 | break; |
| 663 | #endif | 667 | #endif |
| @@ -706,7 +710,7 @@ USE_FEATURE_FIND_XDEV( "-xdev", ) | |||
| 706 | 710 | ||
| 707 | for (i = 1; i < firstopt; i++) { | 711 | for (i = 1; i < firstopt; i++) { |
| 708 | if (!recursive_action(argv[i], | 712 | if (!recursive_action(argv[i], |
| 709 | action_recurse|(1<<dereference), /* flags */ | 713 | recurse_flags|(1<<dereference), /* flags */ |
| 710 | fileAction, /* file action */ | 714 | fileAction, /* file action */ |
| 711 | fileAction, /* dir action */ | 715 | fileAction, /* dir action */ |
| 712 | NULL, /* user data */ | 716 | NULL, /* user data */ |
diff --git a/include/usage.h b/include/usage.h index 8e0da197c..1889010dd 100644 --- a/include/usage.h +++ b/include/usage.h | |||
| @@ -958,9 +958,11 @@ | |||
| 958 | ) USE_FEATURE_FIND_EXEC( \ | 958 | ) USE_FEATURE_FIND_EXEC( \ |
| 959 | "\n -exec CMD Execute CMD with all instances of {} replaced by the" \ | 959 | "\n -exec CMD Execute CMD with all instances of {} replaced by the" \ |
| 960 | "\n files matching EXPRESSION" \ | 960 | "\n files matching EXPRESSION" \ |
| 961 | ) USE_DESKTOP( \ | 961 | ) USE_FEATURE_FIND_SIZE( \ |
| 962 | "\n -size N File size is N" \ | 962 | "\n -size N File size is N" \ |
| 963 | ) USE_FEATURE_FIND_PRUNE( \ | ||
| 963 | "\n -prune Stop traversing current subtree" \ | 964 | "\n -prune Stop traversing current subtree" \ |
| 965 | ) USE_FEATURE_FIND_PAREN( \ | ||
| 964 | "\n (expr) Group" \ | 966 | "\n (expr) Group" \ |
| 965 | ) | 967 | ) |
| 966 | 968 | ||
