diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2015-09-08 17:04:13 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2015-09-08 17:11:39 -0400 |
commit | 72460c098f31c87deefc7daf9eeea3a4ad8224ab (patch) | |
tree | 6f5af25602bf0f8b84e8ecc54168e7d0f262064b /bfs.c | |
parent | 12b0b1f572cba2556722d282bb884a52269fe965 (diff) | |
download | bfs-72460c098f31c87deefc7daf9eeea3a4ad8224ab.tar.xz |
Implement -delete.
Related to #5.
Diffstat (limited to 'bfs.c')
-rw-r--r-- | bfs.c | 25 |
1 files changed, 24 insertions, 1 deletions
@@ -11,6 +11,8 @@ #include "bftw.h" #include "color.h" +#include <errno.h> +#include <fcntl.h> #include <fnmatch.h> #include <limits.h> #include <stdbool.h> @@ -283,6 +285,24 @@ static const char *skip_paths(parser_state *state) { } /** + * -delete action. + */ +static bool eval_delete(const expression *expr, eval_state *state) { + int flag = 0; + if (state->ftwbuf->typeflag == BFTW_DIR) { + flag |= AT_REMOVEDIR; + } + + // TODO: Have bftw() tell us a better base fd to use + if (unlinkat(AT_FDCWD, state->fpath, flag) != 0) { + print_error(state->cl->colors, state->fpath, errno); + state->ret = BFTW_STOP; + } + + return true; +} + +/** * -prune action. */ static bool eval_prune(const expression *expr, eval_state *state) { @@ -479,6 +499,9 @@ static expression *parse_literal(parser_state *state) { } else if (strcmp(arg, "-nocolor") == 0) { state->cl->color = false; return new_option(state); + } else if (strcmp(arg, "-delete") == 0) { + state->cl->flags |= BFTW_DEPTH; + return new_action(state, eval_delete); } else if (strcmp(arg, "-depth") == 0) { state->cl->flags |= BFTW_DEPTH; return new_option(state); @@ -835,7 +858,7 @@ static int cmdline_callback(const char *fpath, const struct BFTW *ftwbuf, void * const cmdline *cl = ptr; if (ftwbuf->typeflag == BFTW_ERROR) { - print_error(cl->colors, fpath, ftwbuf); + print_error(cl->colors, fpath, ftwbuf->error); return BFTW_SKIP_SUBTREE; } |