diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-19 22:22:57 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-19 22:22:57 +0000 |
commit | a19faf8bb7fc1db51f863fea4233639851ba7789 (patch) | |
tree | 9f4570279b58d05484d232ed36164c07dd9fd86d | |
parent | dcf6de552a15c1e7bddb32f1028ceb6214915425 (diff) | |
download | busybox-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.in | 7 | ||||
-rw-r--r-- | findutils/find.c | 345 | ||||
-rw-r--r-- | include/usage.h | 2 |
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 | ||
167 | config 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 | |||
167 | config GREP | 174 | config 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;) |
80 | USE_FEATURE_FIND_PATH( ACTS(path, const char *pattern;)) | 80 | USE_FEATURE_FIND_PATH( ACTS(path, const char *pattern;)) |
81 | USE_FEATURE_FIND_REGEX( ACTS(regex, regex_t compiled_pattern;)) | 81 | USE_FEATURE_FIND_REGEX( ACTS(regex, regex_t compiled_pattern;)) |
82 | USE_FEATURE_FIND_PRINT0(ACTS(print0)) | 82 | USE_FEATURE_FIND_PRINT0( ACTS(print0)) |
83 | USE_FEATURE_FIND_TYPE( ACTS(type, int type_mask;)) | 83 | USE_FEATURE_FIND_TYPE( ACTS(type, int type_mask;)) |
84 | USE_FEATURE_FIND_PERM( ACTS(perm, char perm_char; mode_t perm_mask;)) | 84 | USE_FEATURE_FIND_PERM( ACTS(perm, char perm_char; mode_t perm_mask;)) |
85 | USE_FEATURE_FIND_MTIME( ACTS(mtime, char mtime_char; unsigned mtime_days;)) | 85 | USE_FEATURE_FIND_MTIME( ACTS(mtime, char mtime_char; unsigned mtime_days;)) |
86 | USE_FEATURE_FIND_MMIN( ACTS(mmin, char mmin_char; unsigned mmin_mins;)) | 86 | USE_FEATURE_FIND_MMIN( ACTS(mmin, char mmin_char; unsigned mmin_mins;)) |
87 | USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;)) | 87 | USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;)) |
88 | USE_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;)) | 88 | USE_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;)) |
89 | USE_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; unsigned *subst_count; int exec_argc;)) | 89 | USE_FEATURE_FIND_USER( ACTS(user, uid_t uid;)) |
90 | USE_FEATURE_FIND_USER( ACTS(user, uid_t uid;)) | 90 | USE_FEATURE_FIND_SIZE( ACTS(size, char size_char; off_t size;)) |
91 | USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;)) | 91 | USE_FEATURE_FIND_CONTEXT(ACTS(context, security_context_t context;)) |
92 | USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;)) | 92 | USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;)) |
93 | USE_FEATURE_FIND_SIZE( ACTS(size, char size_char; off_t size;)) | 93 | USE_FEATURE_FIND_PRUNE( ACTS(prune)) |
94 | USE_FEATURE_FIND_PRUNE( ACTS(prune)) | 94 | USE_FEATURE_FIND_DELETE( ACTS(delete)) |
95 | USE_FEATURE_FIND_DELETE(ACTS(delete)) | 95 | USE_FEATURE_FIND_EXEC( ACTS(exec, char **exec_argv; unsigned *subst_count; int exec_argc;)) |
96 | USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;)) | ||
96 | 97 | ||
97 | static action ***actions; | 98 | static action ***actions; |
98 | static bool need_print = 1; | 99 | static bool need_print = 1; |
@@ -102,7 +103,7 @@ static int recurse_flags = ACTION_RECURSE; | |||
102 | static unsigned count_subst(const char *str) | 103 | static 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 | ||
360 | ACTF(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 | ||
360 | static int fileAction(const char *fileName, struct stat *statbuf, void *userData, int depth) | 379 | static 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) | |||
424 | static action*** parse_params(char **argv) | 443 | static 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") \ |