diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-12-05 16:53:55 -0800 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-12-05 16:53:55 -0800 |
commit | b4cb7c06f94e2e91b22b7d82efd7943a82331d86 (patch) | |
tree | 99fa7085855875efa7422ee58f322f8c94bda860 | |
parent | 07e77936d535e58b0aeb4f2a11400c1050556739 (diff) |
Chore: updated fs·walk to use new data structures
Completes the port to our standard library (up to malloc).
-rw-r--r-- | include/base.h | 31 | ||||
-rw-r--r-- | include/base/fs.h | 25 | ||||
-rw-r--r-- | include/sys.h | 2 | ||||
-rw-r--r-- | src/base/error/assert.c | 9 | ||||
-rw-r--r-- | src/base/error/rules.mk | 7 | ||||
-rw-r--r-- | src/base/fs/internal.h | 5 | ||||
-rw-r--r-- | src/base/fs/openfd.c | 10 | ||||
-rw-r--r-- | src/base/fs/read.c | 3 | ||||
-rw-r--r-- | src/base/fs/rules.mk | 7 | ||||
-rw-r--r-- | src/base/fs/walk.c | 43 | ||||
-rw-r--r-- | src/cmd/walk/walk.c | 2 | ||||
-rw-r--r-- | sys/linux/src/direntry.c | 8 | ||||
-rw-r--r-- | sys/linux/src/dirents.c | 8 |
13 files changed, 84 insertions, 76 deletions
diff --git a/include/base.h b/include/base.h index 99cd40b..7c8afbb 100644 --- a/include/base.h +++ b/include/base.h @@ -6,30 +6,14 @@ #include <rt.h> #include <sys.h> -// TODO: remove dependency system headers -#include <assert.h> -/* remaining libc functions we depend upon */ +// TODO: remove dependency on malloc + +/* all libc functions we depend upon */ void *malloc(uintptr size); void *calloc(uintptr n, uintptr size); void *realloc(void *ptr, uintptr size); void free(void *ptr); -void abort(void); -#if 0 -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <ctype.h> -#include <stdio.h> -#include <wchar.h> -#include <errno.h> -#include <pwd.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> - -typedef wchar_t wchar; -#endif -#include <sys/stat.h> +noreturn void abort(void); /* must be included first */ #include <base/memory.h> @@ -52,6 +36,13 @@ typedef wchar_t wchar; // ----------------------------------------------------------------------------- // variable arguments +noreturn void ·failassert(const char *, const char *, int, const char *); +#ifdef NDEBUG +# define assert(x) (void)0; +#else +# define assert(x) ((void)((x) || (·failassert(#x, __FILE__, __LINE__, __func__),0))) +#endif + /* from plan9 libc */ #define ERRMAX 128 /* max length of error string */ diff --git a/include/base/fs.h b/include/base/fs.h index 0c77f3a..bc639f8 100644 --- a/include/base/fs.h +++ b/include/base/fs.h @@ -1,5 +1,20 @@ #pragma once +/* directories */ +typedef sys·DirEntry fs·DirEntry; +typedef sys·Directory fs·Directory; + +int fs·open(char *path, fs·Directory *dir); +int fs·openfd(int fd, fs·Directory *dir); +int fs·close(fs·Directory *dir); + +int fs·read(fs·Directory *, fs·DirEntry **); + +/* small utilities */ +int fs·access(byte *path, int flag); +byte *fs·dirname(byte *path); +byte *fs·basename(byte *path); + #define iota(x) 1 << (x) enum { @@ -12,9 +27,6 @@ enum typedef struct fs·Walker fs·Walker; typedef struct fs·History fs·History; -typedef sys·DirEntry fs·DirEntry; -typedef sys·Directory fs·Directory; - /* node in filesystem */ // XXX: simplify with our newer code @@ -26,7 +38,7 @@ struct fs·Walker fs·History *hist; struct { void *data; - int (*func)(void *data, char *relp, char *absp, struct stat *info); + int (*func)(void *data, char *relp, char *absp, sys·Info *info); }; char *base, *end, path[4096]; }; @@ -34,8 +46,3 @@ struct fs·Walker int fs·init(fs·Walker *, char *path); void fs·fini(fs·Walker *); void fs·walk(fs·Walker *); - -/* small utilities */ -int fs·access(byte *path, int flag); -byte *fs·dirname(byte *path); -byte *fs·basename(byte *path); diff --git a/include/sys.h b/include/sys.h index 95ed93c..20dafa9 100644 --- a/include/sys.h +++ b/include/sys.h @@ -58,7 +58,7 @@ int sys·chdirfd(int fd); int sys·mkdir(char *path, uint mode); int sys·mkdirat(int fd, char *path, uint mode); -int sys·direntry(int fd, int len, void *buffer, uintptr *size); +int sys·direntry(int fd, void *buffer, uintptr len, uintptr *size); /* file node */ int sys·mknode(char *path, uint mode, uint64 dev); 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)) diff --git a/sys/linux/src/direntry.c b/sys/linux/src/direntry.c new file mode 100644 index 0000000..cd737ae --- /dev/null +++ b/sys/linux/src/direntry.c @@ -0,0 +1,8 @@ +#include "internal.h" + +int +sys·direntry(int fd, void *buffer, uintptr len, uintptr *size) +{ + intptr ret = *size = syscall(·GetDents, fd, buffer, len); + return error(ret); +} diff --git a/sys/linux/src/dirents.c b/sys/linux/src/dirents.c deleted file mode 100644 index c00ce15..0000000 --- a/sys/linux/src/dirents.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "internal.h" - -int -sys·dirents(int fd, int len, void *buffer, int *size) -{ - long ret = *size = syscall(·GetDents, fd, buffer, len); - return error(ret); -} |