From b4cb7c06f94e2e91b22b7d82efd7943a82331d86 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Sun, 5 Dec 2021 16:53:55 -0800 Subject: =?UTF-8?q?Chore:=20updated=20fs=C2=B7walk=20to=20use=20new=20data?= =?UTF-8?q?=20structures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Completes the port to our standard library (up to malloc). --- src/base/error/assert.c | 9 +++++++++ src/base/error/rules.mk | 7 +------ src/base/fs/internal.h | 5 ++--- src/base/fs/openfd.c | 10 ++++++++++ src/base/fs/read.c | 3 +-- src/base/fs/rules.mk | 7 +------ src/base/fs/walk.c | 43 +++++++++++++++++++++++-------------------- src/cmd/walk/walk.c | 2 +- 8 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 src/base/error/assert.c create mode 100644 src/base/fs/openfd.c (limited to 'src') 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 +#include + +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 #include #include -#include /* * 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 +#include + +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 #include -#include 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)) -- cgit v1.2.1