diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2016-12-20 21:09:42 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2016-12-20 21:09:42 -0500 |
commit | 96ca12560f5c4007891985f98fba94fd9c0dc241 (patch) | |
tree | 93f2bbf49996e75a55866668d38113ddef41148e | |
parent | b23b74b9bd204ce432109f92f6dd5468e07daeba (diff) | |
download | bfs-96ca12560f5c4007891985f98fba94fd9c0dc241.tar.xz |
Support -[gu]id NAME like BSD find
-rw-r--r-- | parse.c | 34 | ||||
-rwxr-xr-x | tests.sh | 12 | ||||
-rw-r--r-- | tests/test_0118.out | 19 | ||||
-rw-r--r-- | tests/test_0119.out | 19 |
4 files changed, 59 insertions, 25 deletions
@@ -974,14 +974,7 @@ static struct expr *parse_fprint0(struct parser_state *state, int arg1, int arg2 } /** - * Parse -gid N. - */ -static struct expr *parse_gid(struct parser_state *state, int arg1, int arg2) { - return parse_test_icmp(state, eval_gid); -} - -/** - * Parse -group. + * Parse -gid/-group. */ static struct expr *parse_group(struct parser_state *state, int arg1, int arg2) { const char *arg = state->argv[0]; @@ -994,8 +987,9 @@ static struct expr *parse_group(struct parser_state *state, int arg1, int arg2) struct group *grp = getgrnam(expr->sdata); if (grp) { expr->idata = grp->gr_gid; - } else if (isdigit(expr->sdata[0])) { - if (!parse_int(state, expr->sdata, &expr->idata, IF_LONG_LONG)) { + expr->cmp_flag = CMP_EXACT; + } else if (isdigit(expr->sdata[0]) || expr->sdata[0] == '+' || expr->sdata[0] == '-') { + if (!parse_icmp(state, expr->sdata, expr, 0)) { goto fail; } } else { @@ -1004,7 +998,6 @@ static struct expr *parse_group(struct parser_state *state, int arg1, int arg2) goto fail; } - expr->cmp_flag = CMP_EXACT; return expr; fail: @@ -1013,13 +1006,6 @@ fail: } /** - * Parse -uid N. - */ -static struct expr *parse_uid(struct parser_state *state, int arg1, int arg2) { - return parse_test_icmp(state, eval_uid); -} - -/** * Parse -used N. */ static struct expr *parse_used(struct parser_state *state, int arg1, int arg2) { @@ -1027,7 +1013,7 @@ static struct expr *parse_used(struct parser_state *state, int arg1, int arg2) { } /** - * Parse -user. + * Parse -uid/-user. */ static struct expr *parse_user(struct parser_state *state, int arg1, int arg2) { const char *arg = state->argv[0]; @@ -1040,8 +1026,9 @@ static struct expr *parse_user(struct parser_state *state, int arg1, int arg2) { struct passwd *pwd = getpwnam(expr->sdata); if (pwd) { expr->idata = pwd->pw_uid; - } else if (isdigit(expr->sdata[0])) { - if (!parse_int(state, expr->sdata, &expr->idata, IF_LONG_LONG)) { + expr->cmp_flag = CMP_EXACT; + } else if (isdigit(expr->sdata[0]) || expr->sdata[0] == '+' || expr->sdata[0] == '-') { + if (!parse_icmp(state, expr->sdata, expr, 0)) { goto fail; } } else { @@ -1050,7 +1037,6 @@ static struct expr *parse_user(struct parser_state *state, int arg1, int arg2) { goto fail; } - expr->cmp_flag = CMP_EXACT; return expr; fail: @@ -1809,7 +1795,7 @@ static const struct table_entry parse_table[] = { {"follow", false, parse_follow, BFTW_LOGICAL | BFTW_DETECT_CYCLES, true}, {"fprint", false, parse_fprint}, {"fprint0", false, parse_fprint0}, - {"gid", false, parse_gid}, + {"gid", false, parse_group}, {"group", false, parse_group}, {"help", false, parse_help}, {"hidden", false, parse_hidden}, @@ -1853,7 +1839,7 @@ static const struct table_entry parse_table[] = { {"size", false, parse_size}, {"true", false, parse_const, true}, {"type", false, parse_type, false}, - {"uid", false, parse_uid}, + {"uid", false, parse_user}, {"used", false, parse_used}, {"user", false, parse_user}, {"version", false, parse_version}, @@ -735,9 +735,19 @@ function test_0117() { bfs_diff basic -depth -depth -2 } +function test_0118() { + [ "$BSD" ] || return 0 + bfs_diff basic -gid "$(id -gn)" +} + +function test_0119() { + [ "$BSD" ] || return 0 + bfs_diff basic -uid "$(id -un)" +} + result=0 -for i in {1..117}; do +for i in {1..119}; do test="test_$(printf '%04d' $i)" if [ -t 1 ]; then diff --git a/tests/test_0118.out b/tests/test_0118.out new file mode 100644 index 0000000..bb3cd8d --- /dev/null +++ b/tests/test_0118.out @@ -0,0 +1,19 @@ +basic +basic/a +basic/b +basic/c +basic/e +basic/g +basic/i +basic/j +basic/k +basic/l +basic/c/d +basic/e/f +basic/g/h +basic/j/foo +basic/k/foo +basic/l/foo +basic/k/foo/bar +basic/l/foo/bar +basic/l/foo/bar/baz diff --git a/tests/test_0119.out b/tests/test_0119.out new file mode 100644 index 0000000..bb3cd8d --- /dev/null +++ b/tests/test_0119.out @@ -0,0 +1,19 @@ +basic +basic/a +basic/b +basic/c +basic/e +basic/g +basic/i +basic/j +basic/k +basic/l +basic/c/d +basic/e/f +basic/g/h +basic/j/foo +basic/k/foo +basic/l/foo +basic/k/foo/bar +basic/l/foo/bar +basic/l/foo/bar/baz |