summaryrefslogtreecommitdiffstats
path: root/bftw.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2020-09-18 17:34:03 -0400
committerTavian Barnes <tavianator@tavianator.com>2020-09-18 17:34:03 -0400
commitccf75c74bdac06eec97a2a6a5228c2e706c121bd (patch)
tree0e9b682bbdf15f9da668f7fe343a19ed17371b74 /bftw.c
parent0aa71f890777d2aaddeca53384b94742e4b2678b (diff)
downloadbfs-ccf75c74bdac06eec97a2a6a5228c2e706c121bd.tar.xz
Don't call stat() just to determine symbolic lengths
The new bftw_cached_stat() helper gets us stat info if we already have it, but doesn't call stat() if we don't. In that case we just take a guess for the initial length to readlinkat(). This lets us avoid stat() entirely in many cases for -lname and -printf %l.
Diffstat (limited to 'bftw.c')
-rw-r--r--bftw.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/bftw.c b/bftw.c
index ff4797d..1296360 100644
--- a/bftw.c
+++ b/bftw.c
@@ -886,6 +886,14 @@ const struct bfs_stat *bftw_stat(const struct BFTW *ftwbuf, enum bfs_stat_flag f
return ret;
}
+const struct bfs_stat *bftw_cached_stat(const struct BFTW *ftwbuf, enum bfs_stat_flag flags) {
+ if (flags & BFS_STAT_NOFOLLOW) {
+ return ftwbuf->lstat_cache.buf;
+ } else {
+ return ftwbuf->stat_cache.buf;
+ }
+}
+
enum bftw_type bftw_type(const struct BFTW *ftwbuf, enum bfs_stat_flag flags) {
if (ftwbuf->stat_flags & BFS_STAT_NOFOLLOW) {
if ((flags & BFS_STAT_NOFOLLOW) || ftwbuf->type != BFTW_LNK) {