aboutsummaryrefslogtreecommitdiff
path: root/sys/base/fs/walker.c
diff options
context:
space:
mode:
authorNicholas <nbnoll@eml.cc>2021-11-11 17:07:44 -0800
committerNicholas <nbnoll@eml.cc>2021-11-11 17:07:44 -0800
commitb375f3cdedb5b0e08745d100b40e38d2f8396a58 (patch)
treea51d5763646ff482c26e79bfc1dcebccbe4812a7 /sys/base/fs/walker.c
parent44b30ea0883af2827e618a45d472b47cf041a842 (diff)
parent9695ea005d4af93dcd60f74f10fd3c54499a182f (diff)
chore: merge master into laptop
Diffstat (limited to 'sys/base/fs/walker.c')
-rw-r--r--sys/base/fs/walker.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/sys/base/fs/walker.c b/sys/base/fs/walker.c
new file mode 100644
index 0000000..65ff391
--- /dev/null
+++ b/sys/base/fs/walker.c
@@ -0,0 +1,39 @@
+#include "internal.h"
+
+static
+void
+delete(fs·History *h)
+{
+ SET_FREE(h, sys·Memory, nil);
+}
+
+int
+fs·init(fs·Walker *fs, char *path)
+{
+ fs->base = fs->end = fs->path;
+
+ if(!path || !path[0]){
+ path = getcwd(fs->path, arrlen(fs->path));
+ if (!path)
+ return 1;
+ fs->end += strlen(path);
+ }else
+ fs->end = str·copyn(fs->base, path, arrlen(fs->path));
+
+ if(fs->path[0] != '/')
+ fs->fd = AT_FDCWD;
+
+ if(!fs->hist && !(fs->flags & fs·nolinks))
+ fs->hist = calloc(1, sizeof(*fs->hist));
+
+ return 0;
+}
+
+void
+fs·fini(fs·Walker *fs)
+{
+ if(fs->hist){
+ delete(fs->hist);
+ free(fs->hist);
+ }
+}