aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-06-19 22:22:57 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-06-19 22:22:57 +0000
commita19faf8bb7fc1db51f863fea4233639851ba7789 (patch)
tree9f4570279b58d05484d232ed36164c07dd9fd86d
parentdcf6de552a15c1e7bddb32f1028ceb6214915425 (diff)
downloadbusybox-w32-a19faf8bb7fc1db51f863fea4233639851ba7789.tar.gz
busybox-w32-a19faf8bb7fc1db51f863fea4233639851ba7789.tar.bz2
busybox-w32-a19faf8bb7fc1db51f863fea4233639851ba7789.zip
find: -context support for SELinux (KaiGai Kohei <kaigai@kaigai.gr.jp>)
find: make it a bit smaller function old new delta .rodata 129018 129050 +32 parse_params 1509 1346 -163 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 32/-163) Total: -131 bytes
-rw-r--r--findutils/Config.in7
-rw-r--r--findutils/find.c345
-rw-r--r--include/usage.h2
3 files changed, 191 insertions, 163 deletions
diff --git a/findutils/Config.in b/findutils/Config.in
index f8ad98de1..50415cb5f 100644
--- a/findutils/Config.in
+++ b/findutils/Config.in
@@ -164,6 +164,13 @@ config FEATURE_FIND_REGEX
164 help 164 help
165 The -regex option matches whole pathname against regular expression. 165 The -regex option matches whole pathname against regular expression.
166 166
167config FEATURE_FIND_CONTEXT
168 bool "Enable (-context) option for matching security context"
169 default n
170 depends on FIND && SELINUX
171 help
172 Support the 'find -context' option for matching security context.
173
167config GREP 174config GREP
168 bool "grep" 175 bool "grep"
169 default n 176 default n
diff --git a/findutils/find.c b/findutils/find.c
index 036d13f4a..aa2244141 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -75,24 +75,25 @@ typedef struct {
75} action; 75} action;
76#define ACTS(name, arg...) typedef struct { action a; arg; } action_##name; 76#define ACTS(name, arg...) typedef struct { action a; arg; } action_##name;
77#define ACTF(name) static int func_##name(const char *fileName, struct stat *statbuf, action_##name* ap) 77#define ACTF(name) static int func_##name(const char *fileName, struct stat *statbuf, action_##name* ap)
78 ACTS(print) 78 ACTS(print)
79 ACTS(name, const char *pattern;) 79 ACTS(name, const char *pattern;)
80USE_FEATURE_FIND_PATH( ACTS(path, const char *pattern;)) 80USE_FEATURE_FIND_PATH( ACTS(path, const char *pattern;))
81USE_FEATURE_FIND_REGEX( ACTS(regex, regex_t compiled_pattern;)) 81USE_FEATURE_FIND_REGEX( ACTS(regex, regex_t compiled_pattern;))
82USE_FEATURE_FIND_PRINT0(ACTS(print0)) 82USE_FEATURE_FIND_PRINT0( ACTS(print0))
83USE_FEATURE_FIND_TYPE( ACTS(type, int type_mask;)) 83USE_FEATURE_FIND_TYPE( ACTS(type, int type_mask;))
84USE_FEATURE_FIND_PERM( ACTS(perm, char perm_char; mode_t perm_mask;)) 84USE_FEATURE_FIND_PERM( ACTS(perm, char perm_char; mode_t perm_mask;))
85USE_FEATURE_FIND_MTIME( ACTS(mtime, char mtime_char; unsigned mtime_days;)) 85USE_FEATURE_FIND_MTIME( ACTS(mtime, char mtime_char; unsigned mtime_days;))
86USE_FEATURE_FIND_MMIN( ACTS(mmin, char mmin_char; unsigned mmin_mins;)) 86USE_FEATURE_FIND_MMIN( ACTS(mmin, char mmin_char; unsigned mmin_mins;))
87USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;)) 87USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;))
88USE_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;)) 88USE_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;))
89USE_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; unsigned *subst_count; int exec_argc;)) 89USE_FEATURE_FIND_USER( ACTS(user, uid_t uid;))
90USE_FEATURE_FIND_USER( ACTS(user, uid_t uid;)) 90USE_FEATURE_FIND_SIZE( ACTS(size, char size_char; off_t size;))
91USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;)) 91USE_FEATURE_FIND_CONTEXT(ACTS(context, security_context_t context;))
92USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;)) 92USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;))
93USE_FEATURE_FIND_SIZE( ACTS(size, char size_char; off_t size;)) 93USE_FEATURE_FIND_PRUNE( ACTS(prune))
94USE_FEATURE_FIND_PRUNE( ACTS(prune)) 94USE_FEATURE_FIND_DELETE( ACTS(delete))
95USE_FEATURE_FIND_DELETE(ACTS(delete)) 95USE_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; unsigned *subst_count; int exec_argc;))
96USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;))
96 97
97static action ***actions; 98static action ***actions;
98static bool need_print = 1; 99static bool need_print = 1;
@@ -102,7 +103,7 @@ static int recurse_flags = ACTION_RECURSE;
102static unsigned count_subst(const char *str) 103static unsigned count_subst(const char *str)
103{ 104{
104 unsigned count = 0; 105 unsigned count = 0;
105 while ((str = strstr(str, "{}"))) { 106 while ((str = strstr(str, "{}")) != NULL) {
106 count++; 107 count++;
107 str++; 108 str++;
108 } 109 }
@@ -355,6 +356,24 @@ ACTF(delete)
355 return TRUE; 356 return TRUE;
356} 357}
357#endif 358#endif
359#if ENABLE_FEATURE_FIND_CONTEXT
360ACTF(context)
361{
362 security_context_t con;
363 int rc;
364
365 if (recurse_flags & ACTION_FOLLOWLINKS) {
366 rc = getfilecon(fileName, &con);
367 } else {
368 rc = lgetfilecon(fileName, &con);
369 }
370 if (rc < 0)
371 return FALSE;
372 rc = strcmp(ap->context, con);
373 freecon(con);
374 return rc == 0;
375}
376#endif
358 377
359 378
360static int fileAction(const char *fileName, struct stat *statbuf, void *userData, int depth) 379static int fileAction(const char *fileName, struct stat *statbuf, void *userData, int depth)
@@ -424,64 +443,68 @@ static const char* plus_minus_num(const char* str)
424static action*** parse_params(char **argv) 443static action*** parse_params(char **argv)
425{ 444{
426 enum { 445 enum {
427 PARM_a , 446 PARM_a ,
428 PARM_o , 447 PARM_o ,
429 USE_FEATURE_FIND_NOT( PARM_char_not ,) 448 USE_FEATURE_FIND_NOT( PARM_char_not ,)
430 PARM_print ,
431 USE_FEATURE_FIND_PRINT0(PARM_print0 ,)
432 PARM_name ,
433 USE_FEATURE_FIND_PATH( PARM_path ,)
434 USE_FEATURE_FIND_REGEX( PARM_regex ,)
435 USE_FEATURE_FIND_TYPE( PARM_type ,)
436 USE_FEATURE_FIND_PERM( PARM_perm ,)
437 USE_FEATURE_FIND_MTIME( PARM_mtime ,)
438 USE_FEATURE_FIND_MMIN( PARM_mmin ,)
439 USE_FEATURE_FIND_NEWER( PARM_newer ,)
440 USE_FEATURE_FIND_INUM( PARM_inum ,)
441 USE_FEATURE_FIND_EXEC( PARM_exec ,)
442 USE_FEATURE_FIND_USER( PARM_user ,)
443 USE_FEATURE_FIND_GROUP( PARM_group ,)
444 USE_FEATURE_FIND_DEPTH( PARM_depth ,)
445 USE_FEATURE_FIND_PAREN( PARM_char_brace,)
446 USE_FEATURE_FIND_SIZE( PARM_size ,)
447 USE_FEATURE_FIND_PRUNE( PARM_prune ,)
448 USE_FEATURE_FIND_DELETE(PARM_delete ,)
449#if ENABLE_DESKTOP 449#if ENABLE_DESKTOP
450 PARM_and , 450 PARM_and ,
451 PARM_or , 451 PARM_or ,
452 USE_FEATURE_FIND_NOT( PARM_not ,) 452 USE_FEATURE_FIND_NOT( PARM_not ,)
453#endif 453#endif
454 PARM_print ,
455 USE_FEATURE_FIND_PRINT0( PARM_print0 ,)
456 USE_FEATURE_FIND_DEPTH( PARM_depth ,)
457 USE_FEATURE_FIND_PRUNE( PARM_prune ,)
458 USE_FEATURE_FIND_DELETE( PARM_delete ,)
459 USE_FEATURE_FIND_EXEC( PARM_exec ,)
460 USE_FEATURE_FIND_PAREN( PARM_char_brace,)
461 /* All options starting from here require argument */
462 PARM_name ,
463 USE_FEATURE_FIND_PATH( PARM_path ,)
464 USE_FEATURE_FIND_REGEX( PARM_regex ,)
465 USE_FEATURE_FIND_TYPE( PARM_type ,)
466 USE_FEATURE_FIND_PERM( PARM_perm ,)
467 USE_FEATURE_FIND_MTIME( PARM_mtime ,)
468 USE_FEATURE_FIND_MMIN( PARM_mmin ,)
469 USE_FEATURE_FIND_NEWER( PARM_newer ,)
470 USE_FEATURE_FIND_INUM( PARM_inum ,)
471 USE_FEATURE_FIND_USER( PARM_user ,)
472 USE_FEATURE_FIND_GROUP( PARM_group ,)
473 USE_FEATURE_FIND_SIZE( PARM_size ,)
474 USE_FEATURE_FIND_CONTEXT(PARM_context ,)
454 }; 475 };
455 476
456 static const char *const params[] = { 477 static const char *const params[] = {
457 "-a" , 478 "-a" ,
458 "-o" , 479 "-o" ,
459 USE_FEATURE_FIND_NOT( "!" ,) 480 USE_FEATURE_FIND_NOT( "!" ,)
460 "-print" ,
461 USE_FEATURE_FIND_PRINT0("-print0",)
462 "-name" ,
463 USE_FEATURE_FIND_PATH( "-path" ,)
464 USE_FEATURE_FIND_REGEX( "-regex" ,)
465 USE_FEATURE_FIND_TYPE( "-type" ,)
466 USE_FEATURE_FIND_PERM( "-perm" ,)
467 USE_FEATURE_FIND_MTIME( "-mtime" ,)
468 USE_FEATURE_FIND_MMIN( "-mmin" ,)
469 USE_FEATURE_FIND_NEWER( "-newer" ,)
470 USE_FEATURE_FIND_INUM( "-inum" ,)
471 USE_FEATURE_FIND_EXEC( "-exec" ,)
472 USE_FEATURE_FIND_USER( "-user" ,)
473 USE_FEATURE_FIND_GROUP( "-group" ,)
474 USE_FEATURE_FIND_DEPTH( "-depth" ,)
475 USE_FEATURE_FIND_PAREN( "(" ,)
476 USE_FEATURE_FIND_SIZE( "-size" ,)
477 USE_FEATURE_FIND_PRUNE( "-prune" ,)
478 USE_FEATURE_FIND_DELETE("-delete",)
479#if ENABLE_DESKTOP 481#if ENABLE_DESKTOP
480 "-and" , 482 "-and" ,
481 "-or" , 483 "-or" ,
482 USE_FEATURE_FIND_NOT( "-not" ,) 484 USE_FEATURE_FIND_NOT( "-not" ,)
483#endif 485#endif
484 NULL 486 "-print" ,
487 USE_FEATURE_FIND_PRINT0( "-print0" ,)
488 USE_FEATURE_FIND_DEPTH( "-depth" ,)
489 USE_FEATURE_FIND_PRUNE( "-prune" ,)
490 USE_FEATURE_FIND_DELETE( "-delete" ,)
491 USE_FEATURE_FIND_EXEC( "-exec" ,)
492 USE_FEATURE_FIND_PAREN( "(" ,)
493 /* All options starting from here require argument */
494 "-name" ,
495 USE_FEATURE_FIND_PATH( "-path" ,)
496 USE_FEATURE_FIND_REGEX( "-regex" ,)
497 USE_FEATURE_FIND_TYPE( "-type" ,)
498 USE_FEATURE_FIND_PERM( "-perm" ,)
499 USE_FEATURE_FIND_MTIME( "-mtime" ,)
500 USE_FEATURE_FIND_MMIN( "-mmin" ,)
501 USE_FEATURE_FIND_NEWER( "-newer" ,)
502 USE_FEATURE_FIND_INUM( "-inum" ,)
503 USE_FEATURE_FIND_USER( "-user" ,)
504 USE_FEATURE_FIND_GROUP( "-group" ,)
505 USE_FEATURE_FIND_SIZE( "-size" ,)
506 USE_FEATURE_FIND_CONTEXT("-context",)
507 NULL
485 }; 508 };
486 509
487 action*** appp; 510 action*** appp;
@@ -522,8 +545,19 @@ static action*** parse_params(char **argv)
522 */ 545 */
523 while (*argv) { 546 while (*argv) {
524 const char *arg = argv[0]; 547 const char *arg = argv[0];
525 const char *arg1 = argv[1];
526 int parm = index_in_str_array(params, arg); 548 int parm = index_in_str_array(params, arg);
549 const char *arg1 = argv[1];
550
551 if (parm >= PARM_name) {
552 /* All options starting from -name require argument */
553 if (!arg1)
554 bb_error_msg_and_die(bb_msg_requires_arg, arg);
555 argv++;
556 }
557
558 /* We can use big switch() here, but on i386
559 * it doesn't give smaller code. Other arches? */
560
527 /* --- Operators --- */ 561 /* --- Operators --- */
528 if (parm == PARM_a USE_DESKTOP(|| parm == PARM_and)) { 562 if (parm == PARM_a USE_DESKTOP(|| parm == PARM_and)) {
529 /* no further special handling required */ 563 /* no further special handling required */
@@ -557,18 +591,80 @@ static action*** parse_params(char **argv)
557 (void) ALLOC_ACTION(print0); 591 (void) ALLOC_ACTION(print0);
558 } 592 }
559#endif 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_PRUNE
600 else if (parm == PARM_prune) {
601 USE_FEATURE_FIND_NOT( invert_flag = 0; )
602 (void) ALLOC_ACTION(prune);
603 }
604#endif
605#if ENABLE_FEATURE_FIND_DELETE
606 else if (parm == PARM_delete) {
607 need_print = 0;
608 recurse_flags |= ACTION_DEPTHFIRST;
609 (void) ALLOC_ACTION(delete);
610 }
611#endif
612#if ENABLE_FEATURE_FIND_EXEC
613 else if (parm == PARM_exec) {
614 int i;
615 action_exec *ap;
616 need_print = 0;
617 USE_FEATURE_FIND_NOT( invert_flag = 0; )
618 ap = ALLOC_ACTION(exec);
619 ap->exec_argv = ++argv; /* first arg after -exec */
620 ap->exec_argc = 0;
621 while (1) {
622 if (!*argv) /* did not see ';' until end */
623 bb_error_msg_and_die("-exec CMD must end by ';'");
624 if (LONE_CHAR(argv[0], ';'))
625 break;
626 argv++;
627 ap->exec_argc++;
628 }
629 if (ap->exec_argc == 0)
630 bb_error_msg_and_die(bb_msg_requires_arg, arg);
631 ap->subst_count = xmalloc(ap->exec_argc * sizeof(int));
632 i = ap->exec_argc;
633 while (i--)
634 ap->subst_count[i] = count_subst(ap->exec_argv[i]);
635 }
636#endif
637#if ENABLE_FEATURE_FIND_PAREN
638 else if (parm == PARM_char_brace) {
639 action_paren *ap;
640 char **endarg;
641 unsigned nested = 1;
642
643 endarg = argv;
644 while (1) {
645 if (!*++endarg)
646 bb_error_msg_and_die("unpaired '('");
647 if (LONE_CHAR(*endarg, '('))
648 nested++;
649 else if (LONE_CHAR(*endarg, ')') && !--nested) {
650 *endarg = NULL;
651 break;
652 }
653 }
654 ap = ALLOC_ACTION(paren);
655 ap->subexpr = parse_params(argv + 1);
656 *endarg = (char*) ")"; /* restore NULLed parameter */
657 argv = endarg;
658 }
659#endif
560 else if (parm == PARM_name) { 660 else if (parm == PARM_name) {
561 action_name *ap; 661 action_name *ap;
562 if (!*++argv)
563 bb_error_msg_and_die(bb_msg_requires_arg, arg);
564 ap = ALLOC_ACTION(name); 662 ap = ALLOC_ACTION(name);
565 ap->pattern = arg1; 663 ap->pattern = arg1;
566 } 664 }
567#if ENABLE_FEATURE_FIND_PATH 665#if ENABLE_FEATURE_FIND_PATH
568 else if (parm == PARM_path) { 666 else if (parm == PARM_path) {
569 action_path *ap; 667 action_path *ap;
570 if (!*++argv)
571 bb_error_msg_and_die(bb_msg_requires_arg, arg);
572 ap = ALLOC_ACTION(path); 668 ap = ALLOC_ACTION(path);
573 ap->pattern = arg1; 669 ap->pattern = arg1;
574 } 670 }
@@ -576,8 +672,6 @@ static action*** parse_params(char **argv)
576#if ENABLE_FEATURE_FIND_REGEX 672#if ENABLE_FEATURE_FIND_REGEX
577 else if (parm == PARM_regex) { 673 else if (parm == PARM_regex) {
578 action_regex *ap; 674 action_regex *ap;
579 if (!*++argv)
580 bb_error_msg_and_die(bb_msg_requires_arg, arg);
581 ap = ALLOC_ACTION(regex); 675 ap = ALLOC_ACTION(regex);
582 xregcomp(&ap->compiled_pattern, arg1, 0 /*cflags*/); 676 xregcomp(&ap->compiled_pattern, arg1, 0 /*cflags*/);
583 } 677 }
@@ -585,8 +679,6 @@ static action*** parse_params(char **argv)
585#if ENABLE_FEATURE_FIND_TYPE 679#if ENABLE_FEATURE_FIND_TYPE
586 else if (parm == PARM_type) { 680 else if (parm == PARM_type) {
587 action_type *ap; 681 action_type *ap;
588 if (!*++argv)
589 bb_error_msg_and_die(bb_msg_requires_arg, arg);
590 ap = ALLOC_ACTION(type); 682 ap = ALLOC_ACTION(type);
591 ap->type_mask = find_type(arg1); 683 ap->type_mask = find_type(arg1);
592 } 684 }
@@ -599,8 +691,6 @@ static action*** parse_params(char **argv)
599 */ 691 */
600 else if (parm == PARM_perm) { 692 else if (parm == PARM_perm) {
601 action_perm *ap; 693 action_perm *ap;
602 if (!*++argv)
603 bb_error_msg_and_die(bb_msg_requires_arg, arg);
604 ap = ALLOC_ACTION(perm); 694 ap = ALLOC_ACTION(perm);
605 ap->perm_char = arg1[0]; 695 ap->perm_char = arg1[0];
606 arg1 = plus_minus_num(arg1); 696 arg1 = plus_minus_num(arg1);
@@ -612,8 +702,6 @@ static action*** parse_params(char **argv)
612#if ENABLE_FEATURE_FIND_MTIME 702#if ENABLE_FEATURE_FIND_MTIME
613 else if (parm == PARM_mtime) { 703 else if (parm == PARM_mtime) {
614 action_mtime *ap; 704 action_mtime *ap;
615 if (!*++argv)
616 bb_error_msg_and_die(bb_msg_requires_arg, arg);
617 ap = ALLOC_ACTION(mtime); 705 ap = ALLOC_ACTION(mtime);
618 ap->mtime_char = arg1[0]; 706 ap->mtime_char = arg1[0];
619 ap->mtime_days = xatoul(plus_minus_num(arg1)); 707 ap->mtime_days = xatoul(plus_minus_num(arg1));
@@ -622,8 +710,6 @@ static action*** parse_params(char **argv)
622#if ENABLE_FEATURE_FIND_MMIN 710#if ENABLE_FEATURE_FIND_MMIN
623 else if (parm == PARM_mmin) { 711 else if (parm == PARM_mmin) {
624 action_mmin *ap; 712 action_mmin *ap;
625 if (!*++argv)
626 bb_error_msg_and_die(bb_msg_requires_arg, arg);
627 ap = ALLOC_ACTION(mmin); 713 ap = ALLOC_ACTION(mmin);
628 ap->mmin_char = arg1[0]; 714 ap->mmin_char = arg1[0];
629 ap->mmin_mins = xatoul(plus_minus_num(arg1)); 715 ap->mmin_mins = xatoul(plus_minus_num(arg1));
@@ -631,54 +717,23 @@ static action*** parse_params(char **argv)
631#endif 717#endif
632#if ENABLE_FEATURE_FIND_NEWER 718#if ENABLE_FEATURE_FIND_NEWER
633 else if (parm == PARM_newer) { 719 else if (parm == PARM_newer) {
634 action_newer *ap;
635 struct stat stat_newer; 720 struct stat stat_newer;
636 if (!*++argv) 721 action_newer *ap;
637 bb_error_msg_and_die(bb_msg_requires_arg, arg);
638 xstat(arg1, &stat_newer);
639 ap = ALLOC_ACTION(newer); 722 ap = ALLOC_ACTION(newer);
723 xstat(arg1, &stat_newer);
640 ap->newer_mtime = stat_newer.st_mtime; 724 ap->newer_mtime = stat_newer.st_mtime;
641 } 725 }
642#endif 726#endif
643#if ENABLE_FEATURE_FIND_INUM 727#if ENABLE_FEATURE_FIND_INUM
644 else if (parm == PARM_inum) { 728 else if (parm == PARM_inum) {
645 action_inum *ap; 729 action_inum *ap;
646 if (!*++argv)
647 bb_error_msg_and_die(bb_msg_requires_arg, arg);
648 ap = ALLOC_ACTION(inum); 730 ap = ALLOC_ACTION(inum);
649 ap->inode_num = xatoul(arg1); 731 ap->inode_num = xatoul(arg1);
650 } 732 }
651#endif 733#endif
652#if ENABLE_FEATURE_FIND_EXEC
653 else if (parm == PARM_exec) {
654 int i;
655 action_exec *ap;
656 need_print = 0;
657 USE_FEATURE_FIND_NOT( invert_flag = 0; )
658 ap = ALLOC_ACTION(exec);
659 ap->exec_argv = ++argv; /* first arg after -exec */
660 ap->exec_argc = 0;
661 while (1) {
662 if (!*argv) /* did not see ';' until end */
663 bb_error_msg_and_die(bb_msg_requires_arg, arg);
664 if (LONE_CHAR(argv[0], ';'))
665 break;
666 argv++;
667 ap->exec_argc++;
668 }
669 if (ap->exec_argc == 0)
670 bb_error_msg_and_die(bb_msg_requires_arg, arg);
671 ap->subst_count = xmalloc(ap->exec_argc * sizeof(int));
672 i = ap->exec_argc;
673 while (i--)
674 ap->subst_count[i] = count_subst(ap->exec_argv[i]);
675 }
676#endif
677#if ENABLE_FEATURE_FIND_USER 734#if ENABLE_FEATURE_FIND_USER
678 else if (parm == PARM_user) { 735 else if (parm == PARM_user) {
679 action_user *ap; 736 action_user *ap;
680 if (!*++argv)
681 bb_error_msg_and_die(bb_msg_requires_arg, arg);
682 ap = ALLOC_ACTION(user); 737 ap = ALLOC_ACTION(user);
683 ap->uid = bb_strtou(arg1, NULL, 10); 738 ap->uid = bb_strtou(arg1, NULL, 10);
684 if (errno) 739 if (errno)
@@ -688,42 +743,12 @@ static action*** parse_params(char **argv)
688#if ENABLE_FEATURE_FIND_GROUP 743#if ENABLE_FEATURE_FIND_GROUP
689 else if (parm == PARM_group) { 744 else if (parm == PARM_group) {
690 action_group *ap; 745 action_group *ap;
691 if (!*++argv)
692 bb_error_msg_and_die(bb_msg_requires_arg, arg);
693 ap = ALLOC_ACTION(group); 746 ap = ALLOC_ACTION(group);
694 ap->gid = bb_strtou(arg1, NULL, 10); 747 ap->gid = bb_strtou(arg1, NULL, 10);
695 if (errno) 748 if (errno)
696 ap->gid = xgroup2gid(arg1); 749 ap->gid = xgroup2gid(arg1);
697 } 750 }
698#endif 751#endif
699#if ENABLE_FEATURE_FIND_DEPTH
700 else if (parm == PARM_depth) {
701 recurse_flags |= ACTION_DEPTHFIRST;
702 }
703#endif
704#if ENABLE_FEATURE_FIND_PAREN
705 else if (parm == PARM_char_brace) {
706 action_paren *ap;
707 char **endarg;
708 unsigned nested = 1;
709
710 endarg = argv;
711 while (1) {
712 if (!*++endarg)
713 bb_error_msg_and_die("unpaired '('");
714 if (LONE_CHAR(*endarg, '('))
715 nested++;
716 else if (LONE_CHAR(*endarg, ')') && !--nested) {
717 *endarg = NULL;
718 break;
719 }
720 }
721 ap = ALLOC_ACTION(paren);
722 ap->subexpr = parse_params(argv + 1);
723 *endarg = (char*) ")"; /* restore NULLed parameter */
724 argv = endarg;
725 }
726#endif
727#if ENABLE_FEATURE_FIND_SIZE 752#if ENABLE_FEATURE_FIND_SIZE
728 else if (parm == PARM_size) { 753 else if (parm == PARM_size) {
729/* -size n[bckw]: file uses n units of space 754/* -size n[bckw]: file uses n units of space
@@ -746,24 +771,18 @@ static action*** parse_params(char **argv)
746 { NULL, 0 } 771 { NULL, 0 }
747 }; 772 };
748 action_size *ap; 773 action_size *ap;
749 if (!*++argv)
750 bb_error_msg_and_die(bb_msg_requires_arg, arg);
751 ap = ALLOC_ACTION(size); 774 ap = ALLOC_ACTION(size);
752 ap->size_char = arg1[0]; 775 ap->size_char = arg1[0];
753 ap->size = XATOU_SFX(plus_minus_num(arg1), find_suffixes); 776 ap->size = XATOU_SFX(plus_minus_num(arg1), find_suffixes);
754 } 777 }
755#endif 778#endif
756#if ENABLE_FEATURE_FIND_PRUNE 779#if ENABLE_FEATURE_FIND_CONTEXT
757 else if (parm == PARM_prune) { 780 else if (parm == PARM_context) {
758 USE_FEATURE_FIND_NOT( invert_flag = 0; ) 781 action_context *ap;
759 (void) ALLOC_ACTION(prune); 782 ap = ALLOC_ACTION(context);
760 } 783 ap->context = NULL;
761#endif 784 if (selinux_raw_to_trans_context(arg1, &ap->context))
762#if ENABLE_FEATURE_FIND_DELETE 785 bb_perror_msg("%s", arg1);
763 else if (parm == PARM_delete) {
764 need_print = 0;
765 recurse_flags |= ACTION_DEPTHFIRST;
766 (void) ALLOC_ACTION(delete);
767 } 786 }
768#endif 787#endif
769 else { 788 else {
diff --git a/include/usage.h b/include/usage.h
index f5bd96a47..7d09feb05 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -981,6 +981,8 @@
981 USE_FEATURE_FIND_PRINT0( \ 981 USE_FEATURE_FIND_PRINT0( \
982 "\n -print0 Delimit output with null characters rather than" \ 982 "\n -print0 Delimit output with null characters rather than" \
983 "\n newlines") \ 983 "\n newlines") \
984 USE_FEATURE_FIND_CONTEXT ( \
985 "\n -context File has specified security context") \
984 USE_FEATURE_FIND_EXEC( \ 986 USE_FEATURE_FIND_EXEC( \
985 "\n -exec CMD ARG ; Execute CMD with all instances of {} replaced by the" \ 987 "\n -exec CMD ARG ; Execute CMD with all instances of {} replaced by the" \
986 "\n matching files") \ 988 "\n matching files") \