aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-12-05 16:53:55 -0800
committerNicholas Noll <nbnoll@eml.cc>2021-12-05 16:53:55 -0800
commitb4cb7c06f94e2e91b22b7d82efd7943a82331d86 (patch)
tree99fa7085855875efa7422ee58f322f8c94bda860 /src
parent07e77936d535e58b0aeb4f2a11400c1050556739 (diff)
Chore: updated fs·walk to use new data structures
Completes the port to our standard library (up to malloc).
Diffstat (limited to 'src')
-rw-r--r--src/base/error/assert.c9
-rw-r--r--src/base/error/rules.mk7
-rw-r--r--src/base/fs/internal.h5
-rw-r--r--src/base/fs/openfd.c10
-rw-r--r--src/base/fs/read.c3
-rw-r--r--src/base/fs/rules.mk7
-rw-r--r--src/base/fs/walk.c43
-rw-r--r--src/cmd/walk/walk.c2
8 files changed, 48 insertions, 38 deletions
diff --git a/src/base/error/assert.c b/src/base/error/assert.c
new file mode 100644
index 0000000..5e04ff2
--- /dev/null
+++ b/src/base/error/assert.c
@@ -0,0 +1,9 @@
+#include <u.h>
+#include <base.h>
+
+noreturn void
+·failassert(const char *expr, const char *file, int line, const char *func)
+{
+ fmt·fprint(sys·Stderr, "assert failed: %s (%s : %s: %d)\n", expr, file, func, line);
+ abort();
+}
diff --git a/src/base/error/rules.mk b/src/base/error/rules.mk
index e3a9ce0..3cf7723 100644
--- a/src/base/error/rules.mk
+++ b/src/base/error/rules.mk
@@ -1,6 +1 @@
-SRCS_$(d)+=\
- $(d)/error/exits.c \
- $(d)/error/errorf.c \
- $(d)/error/panicf.c \
- $(d)/error/verrorf.c \
- $(d)/error/vpanicf.c \
+SRCS_$(d)+=$(wildcard $(d)/error/*.c)
diff --git a/src/base/fs/internal.h b/src/base/fs/internal.h
index 7fde093..7280238 100644
--- a/src/base/fs/internal.h
+++ b/src/base/fs/internal.h
@@ -1,15 +1,14 @@
#include <u.h>
#include <base.h>
#include <base/macro/map.h>
-#include <dirent.h>
/*
* path history
*/
struct Key
{
- ino_t ino;
- dev_t dev;
+ uint64 ino;
+ uint64 dev;
};
struct fs·History
diff --git a/src/base/fs/openfd.c b/src/base/fs/openfd.c
new file mode 100644
index 0000000..6a57b23
--- /dev/null
+++ b/src/base/fs/openfd.c
@@ -0,0 +1,10 @@
+#include <u.h>
+#include <base.h>
+
+int
+fs·openfd(int fd, fs·Directory *dir)
+{
+ mem·set(dir, 0, sizeof(*dir));
+ dir->fd = fd;
+ return 0;
+}
diff --git a/src/base/fs/read.c b/src/base/fs/read.c
index 7e60823..44b02a8 100644
--- a/src/base/fs/read.c
+++ b/src/base/fs/read.c
@@ -1,6 +1,5 @@
#include <u.h>
#include <base.h>
-#include <sys.h>
int
fs·read(fs·Directory *dir, fs·DirEntry **ent)
@@ -10,7 +9,7 @@ fs·read(fs·Directory *dir, fs·DirEntry **ent)
fs·DirEntry *de;
if(dir->pos >= dir->end){
- if((err=sys·direntry(dir->fd, arrlen(dir->buf), dir->buf, &n)))
+ if((err=sys·direntry(dir->fd, dir->buf, arrlen(dir->buf), &n)))
return err;
dir->pos = 0;
dir->end = n;
diff --git a/src/base/fs/rules.mk b/src/base/fs/rules.mk
index 663a80c..7350cdf 100644
--- a/src/base/fs/rules.mk
+++ b/src/base/fs/rules.mk
@@ -1,6 +1 @@
-SRCS_$(d)+=\
- $(d)/fs/basename.c\
- $(d)/fs/dirname.c\
- $(d)/fs/exists.c\
- $(d)/fs/walk.c\
- $(d)/fs/walker.c\
+SRCS_$(d)+=$(wildcard $(d)/fs/*.c)
diff --git a/src/base/fs/walk.c b/src/base/fs/walk.c
index 786a32a..14371f0 100644
--- a/src/base/fs/walk.c
+++ b/src/base/fs/walk.c
@@ -28,26 +28,25 @@ void
fs·walk(fs·Walker *fs)
{
char *e, *b;
- DIR *dir;
- int new, fd, ofd, flags;
+ sys·Info cwd;
fs·History *h;
- struct dirent *d;
- struct stat cwd;
- struct fs·Entry *it;
+ fs·DirEntry *f;
+ fs·Directory dir;
+ int new, fd, ofd, flags;
flags = 0;
if(fs->flags & fs·nolinks)
flags |= sys·AtNoFollowLink;
/* get info for base relative to current fd */
- if(fstatat(fs->fd, fs->base, &cwd, flags) < 0){
+ if(sys·infoat(fs->fd, fs->base, flags, 0, &cwd)){
if(fs->flags & fs·verbose)
errorf("stat: %s", fs->path);
return;
}
/* if we hit a file, finish! */
- if(!S_ISDIR(cwd.st_mode)) {
+ if(!sys·InfoIsFile(cwd.mode)) {
fs->func(fs->data, fs->base, fs->path, &cwd);
return;
}
@@ -55,11 +54,15 @@ fs·walk(fs·Walker *fs)
/* have we been here before? (cycle detection) */
/* if not, add to our path history */
if(!(fs->flags & fs·nolinks)){
- addentry(fs->hist, (struct Key){.dev=cwd.st_dev, .ino=cwd.st_ino}, &new);
+ addentry(fs->hist,
+ (struct Key){
+ .dev = ((uint64)cwd.device.major<<32)|((uint64)cwd.device.minor),
+ .ino = cwd.inode
+ }, &new
+ );
if (!new)
return;
}
-
/*
* operate on directory first if preorder traversal
* truncate recursion if callback returns an error code
@@ -70,11 +73,11 @@ fs·walk(fs·Walker *fs)
}
/* open directory */
- if(!fs->max || fs->lev + 1 < fs->max) {
+ if(!fs->max || fs->lev + 1 < fs->max){
if(sys·openat(fs->fd, fs->base, sys·ORead|sys·OCloseExec|sys·ODirectory, 0, &fd))
errorf("open %s:", fs->path);
- if (!(dir=fdopendir(fd))) {
+ if(fs·openfd(fd, &dir)){
if(fs->flags & fs·verbose)
errorf("fdopendir: %s", fs->path);
return;
@@ -88,13 +91,13 @@ fs·walk(fs·Walker *fs)
*fs->end++ = '/';
fs->base = fs->end;
- while((d = readdir(dir))) {
- if(*d->d_name == '.')
- if(d->d_name[1] == 0 || /* . */
- (d->d_name[1] == '.' && d->d_name[2] == 0)) /* .. */
- continue;
+ while(!fs·read(&dir,&f)){
+ if(f->name[0] == '.')
+ if(f->name[1] == 0 || /* . */
+ (f->name[1] == '.' && f->name[2] == 0)) /* .. */
+ continue;
- fs->end = str·ncopy(fs->base, arrend(fs->path) - fs->base, d->d_name);
+ fs->end = str·ncopy(fs->base, arrend(fs->path) - fs->base, f->name);
fs->lev++;
fs·walk(fs);
@@ -103,13 +106,13 @@ fs·walk(fs·Walker *fs)
*e = 0;
fs->fd = ofd;
fs->end = e, fs->base = b;
- closedir(dir);
+ fs·close(&dir);
}
/* operate on directory if postorder (default) traversal */
- if (!(fs->flags & fs·preorder))
+ if(!(fs->flags & fs·preorder))
fs->func(fs->data, fs->base, fs->path, &cwd);
- if (!fs->lev)
+ if(!fs->lev)
forget(fs->hist);
}
diff --git a/src/cmd/walk/walk.c b/src/cmd/walk/walk.c
index 8239587..f95cc83 100644
--- a/src/cmd/walk/walk.c
+++ b/src/cmd/walk/walk.c
@@ -13,7 +13,7 @@ flush(void)
}
static int
-print(void *data, char *rel, char *abs, struct stat *info)
+print(void *data, char *rel, char *abs, sys·Info *info)
{
copy:
while (*abs && c < (arrend(buf)-2))