find: support -perm /BITS. Closes 7340

function                                             old     new   delta
parse_params                                        1487    1497     +10
func_perm                                             57      61      +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 14/0)               Total: 14 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2014-09-05 12:16:15 +02:00
parent 4eb1e425fe
commit 3e9b13e4c5

View File

@ -558,8 +558,8 @@ ACTF(type)
#if ENABLE_FEATURE_FIND_PERM #if ENABLE_FEATURE_FIND_PERM
ACTF(perm) ACTF(perm)
{ {
/* -perm +mode: at least one of perm_mask bits are set */ /* -perm [+/]mode: at least one of perm_mask bits are set */
if (ap->perm_char == '+') if (ap->perm_char == '+' || ap->perm_char == '/')
return (statbuf->st_mode & ap->perm_mask) != 0; return (statbuf->st_mode & ap->perm_mask) != 0;
/* -perm -mode: all of perm_mask are set */ /* -perm -mode: all of perm_mask are set */
if (ap->perm_char == '-') if (ap->perm_char == '-')
@ -1252,14 +1252,14 @@ static action*** parse_params(char **argv)
/* -perm BITS File's mode bits are exactly BITS (octal or symbolic). /* -perm BITS File's mode bits are exactly BITS (octal or symbolic).
* Symbolic modes use mode 0 as a point of departure. * Symbolic modes use mode 0 as a point of departure.
* -perm -BITS All of the BITS are set in file's mode. * -perm -BITS All of the BITS are set in file's mode.
* -perm +BITS At least one of the BITS is set in file's mode. * -perm [+/]BITS At least one of the BITS is set in file's mode.
*/ */
else if (parm == PARM_perm) { else if (parm == PARM_perm) {
action_perm *ap; action_perm *ap;
dbg("%d", __LINE__); dbg("%d", __LINE__);
ap = ALLOC_ACTION(perm); ap = ALLOC_ACTION(perm);
ap->perm_char = arg1[0]; ap->perm_char = arg1[0];
arg1 = plus_minus_num(arg1); arg1 = (arg1[0] == '/' ? arg1+1 : plus_minus_num(arg1));
/*ap->perm_mask = 0; - ALLOC_ACTION did it */ /*ap->perm_mask = 0; - ALLOC_ACTION did it */
if (!bb_parse_mode(arg1, &ap->perm_mask)) if (!bb_parse_mode(arg1, &ap->perm_mask))
bb_error_msg_and_die("invalid mode '%s'", arg1); bb_error_msg_and_die("invalid mode '%s'", arg1);