summaryrefslogtreecommitdiffstats
path: root/parse.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2016-02-09 10:34:36 -0500
committerTavian Barnes <tavianator@tavianator.com>2016-02-09 10:40:49 -0500
commit0f09fc54fdf6d5cd453ea0e9fb363756baf87dae (patch)
tree6b69675ba45394c40929ca92c0eb13d1dd53cd1c /parse.c
parentb46da967104df09edcad706e5e8ef31326a113dd (diff)
downloadbfs-0f09fc54fdf6d5cd453ea0e9fb363756baf87dae.tar.xz
Implement -L/-follow.
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/parse.c b/parse.c
index 93657c8..4613aed 100644
--- a/parse.c
+++ b/parse.c
@@ -345,7 +345,7 @@ static struct expr *parse_acnewer(struct parser_state *state, const char *option
struct stat sb;
- bool follow = state->cl->flags & BFTW_FOLLOW_ROOT;
+ bool follow = state->cl->flags & BFTW_FOLLOW;
int flags = follow ? 0 : AT_SYMLINK_NOFOLLOW;
if (fstatat(AT_FDCWD, expr->sdata, &sb, flags) != 0) {
@@ -471,18 +471,26 @@ static struct expr *parse_literal(struct parser_state *state) {
switch (arg[1]) {
case 'P':
if (strcmp(arg, "-P") == 0) {
- state->cl->flags &= ~BFTW_FOLLOW_ROOT;
+ state->cl->flags &= ~(BFTW_FOLLOW | BFTW_DETECT_CYCLES);
return new_option(state, arg);
}
break;
case 'H':
if (strcmp(arg, "-H") == 0) {
+ state->cl->flags &= ~(BFTW_FOLLOW_NONROOT | BFTW_DETECT_CYCLES);
state->cl->flags |= BFTW_FOLLOW_ROOT;
return new_option(state, arg);
}
break;
+ case 'L':
+ if (strcmp(arg, "-L") == 0) {
+ state->cl->flags |= BFTW_FOLLOW | BFTW_DETECT_CYCLES;
+ return new_option(state, arg);
+ }
+ break;
+
case 'a':
if (strcmp(arg, "-amin") == 0) {
return parse_acmtime(state, arg, ATIME, MINUTES);
@@ -529,6 +537,9 @@ static struct expr *parse_literal(struct parser_state *state) {
case 'f':
if (strcmp(arg, "-false") == 0) {
return &expr_false;
+ } else if (strcmp(arg, "-follow") == 0) {
+ state->cl->flags |= BFTW_FOLLOW | BFTW_DETECT_CYCLES;
+ return new_option(state, arg);
}
break;