summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2016-02-01 17:46:06 -0500
committerTavian Barnes <tavianator@tavianator.com>2016-02-02 10:43:41 -0500
commit70fadadf1fc7e1bd09c3d0f451614a678277409c (patch)
tree92ffc1ae7b3ce13a93b6a85330b0615c52484786
parentb997ddf3df6535765f7eab0683eae4703933a703 (diff)
downloadbfs-70fadadf1fc7e1bd09c3d0f451614a678277409c.tar.xz
Add -gid and -uid support.
-rw-r--r--bfs.h3
-rw-r--r--eval.c24
-rw-r--r--parse.c4
-rwxr-xr-xtests.sh16
4 files changed, 46 insertions, 1 deletions
diff --git a/bfs.h b/bfs.h
index e4dffdd..a8efffb 100644
--- a/bfs.h
+++ b/bfs.h
@@ -125,6 +125,9 @@ bool eval_ctime(const expression *expr, eval_state *state);
bool eval_mmin(const expression *expr, eval_state *state);
bool eval_mtime(const expression *expr, eval_state *state);
+bool eval_gid(const expression *expr, eval_state *state);
+bool eval_uid(const expression *expr, eval_state *state);
+
bool eval_empty(const expression *expr, eval_state *state);
bool eval_hidden(const expression *expr, eval_state *state);
bool eval_type(const expression *expr, eval_state *state);
diff --git a/eval.c b/eval.c
index 243546e..b042339 100644
--- a/eval.c
+++ b/eval.c
@@ -179,6 +179,30 @@ bool eval_mtime(const expression *expr, eval_state *state) {
}
/**
+ * -gid test.
+ */
+bool eval_gid(const expression *expr, eval_state *state) {
+ const struct stat *statbuf = fill_statbuf(state);
+ if (!statbuf) {
+ return false;
+ }
+
+ return do_cmp(expr, statbuf->st_gid);
+}
+
+/**
+ * -uid test.
+ */
+bool eval_uid(const expression *expr, eval_state *state) {
+ const struct stat *statbuf = fill_statbuf(state);
+ if (!statbuf) {
+ return false;
+ }
+
+ return do_cmp(expr, statbuf->st_uid);
+}
+
+/**
* -delete action.
*/
bool eval_delete(const expression *expr, eval_state *state) {
diff --git a/parse.c b/parse.c
index 6983f16..d53a08b 100644
--- a/parse.c
+++ b/parse.c
@@ -409,6 +409,10 @@ static expression *parse_literal(parser_state *state) {
return new_test_idata(state, eval_access, X_OK);
} else if (strcmp(arg, "-false") == 0) {
return &expr_false;
+ } else if (strcmp(arg, "-gid") == 0) {
+ return parse_test_icmp(state, arg, eval_gid);
+ } else if (strcmp(arg, "-uid") == 0) {
+ return parse_test_icmp(state, arg, eval_uid);
} else if (strcmp(arg, "-hidden") == 0) {
return new_test(state, eval_hidden);
} else if (strcmp(arg, "-nohidden") == 0) {
diff --git a/tests.sh b/tests.sh
index bb24fe0..23a9aba 100755
--- a/tests.sh
+++ b/tests.sh
@@ -110,7 +110,21 @@ function test_0015() {
find_diff "$1" -empty
}
-for i in {1..15}; do
+function test_0016() {
+ basic_structure "$1"
+ find_diff "$1" -gid "$(id -g)" && \
+ find_diff "$1" -gid +0 && \
+ find_diff "$1" -gid -10000
+}
+
+function test_0017() {
+ basic_structure "$1"
+ find_diff "$1" -uid "$(id -u)" && \
+ find_diff "$1" -uid +0 && \
+ find_diff "$1" -uid -10000
+}
+
+for i in {1..17}; do
dir="$(mktemp -d "${TMPDIR:-/tmp}"/bfs.XXXXXXXXXX)"
test="test_$(printf '%04d' $i)"
"$test" "$dir"