aboutsummaryrefslogtreecommitdiff
path: root/findutils/find.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-04-04 23:41:35 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-04-04 23:41:35 +0000
commit56fce00fc7c11c2b8dabac5ba0ef6a0a8a19dee5 (patch)
tree7e59e42ff0a038c125a9335ff78953b390fe01ea /findutils/find.c
parentfebe3c421109032cdfb36249c54e314d39256ace (diff)
downloadbusybox-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
Diffstat (limited to 'findutils/find.c')
-rw-r--r--findutils/find.c228
1 files changed, 116 insertions, 112 deletions
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;))
71USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;)) 71USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;))
72USE_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;)) 72USE_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;))
73USE_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; unsigned int *subst_count; int exec_argc;)) 73USE_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; unsigned int *subst_count; int exec_argc;))
74USE_FEATURE_FIND_USER( ACTS(user, int uid;)) 74USE_FEATURE_FIND_USER( ACTS(user, uid_t uid;))
75USE_DESKTOP( ACTS(paren, action ***subexpr;)) 75USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;))
76USE_DESKTOP( ACTS(size, off_t size;)) 76USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;))
77USE_DESKTOP( ACTS(prune)) 77USE_FEATURE_FIND_SIZE( ACTS(size, off_t size;))
78USE_FEATURE_FIND_PRUNE( ACTS(prune))
78 79
79static action ***actions; 80static action ***actions;
80static bool need_print = 1; 81static bool need_print = 1;
81 82static int recurse_flags = action_recurse;
82 83
83#if ENABLE_FEATURE_FIND_EXEC 84#if ENABLE_FEATURE_FIND_EXEC
84static unsigned int count_subst(const char *str) 85static 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
236ACTF(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
235ACTF(print0) 243ACTF(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
249ACTF(paren) 257ACTF(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
265ACTF(size) 277ACTF(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
352static action*** parse_params(char **argv) 342static 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 */