aboutsummaryrefslogtreecommitdiff
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
parent07e77936d535e58b0aeb4f2a11400c1050556739 (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.h31
-rw-r--r--include/base/fs.h25
-rw-r--r--include/sys.h2
-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
-rw-r--r--sys/linux/src/direntry.c8
-rw-r--r--sys/linux/src/dirents.c8
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);
-}