From b48327d357e0818d1a6ae2a064cfa7d1567e1242 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Sun, 5 Dec 2021 15:17:44 -0800 Subject: feat(huge): huge refactor (in progress). Commented out libc includes to uncover all explicit dependencies. A large fraction has now been ported over (no testing). I did not port over the command line tools, such as the rc shell. These will be done independently - as of now I just want the library to stand independent. Compilation currently fails due to the lack of math functions. --- src/base/fs/basename.c | 2 +- src/base/fs/close.c | 8 ++++++++ src/base/fs/dirname.c | 2 +- src/base/fs/exists.c | 4 ++-- src/base/fs/open.c | 14 ++++++++++++++ src/base/fs/read.c | 25 +++++++++++++++++++++++++ src/base/fs/walk.c | 5 ++--- src/base/fs/walker.c | 7 +++---- 8 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 src/base/fs/close.c create mode 100644 src/base/fs/open.c create mode 100644 src/base/fs/read.c (limited to 'src/base/fs') diff --git a/src/base/fs/basename.c b/src/base/fs/basename.c index 2f097da..d956ff1 100644 --- a/src/base/fs/basename.c +++ b/src/base/fs/basename.c @@ -5,6 +5,6 @@ fs·basename(char *path) { char *sep; - sep = strrchr(path, '/'); + sep = str·rfindc(path, '/'); return (sep == nil) ? path : sep+1; } diff --git a/src/base/fs/close.c b/src/base/fs/close.c new file mode 100644 index 0000000..da753dd --- /dev/null +++ b/src/base/fs/close.c @@ -0,0 +1,8 @@ +#include +#include + +int +fs·close(fs·Directory *dir) +{ + return sys·close(dir->fd); +} diff --git a/src/base/fs/dirname.c b/src/base/fs/dirname.c index f312f63..18348e6 100644 --- a/src/base/fs/dirname.c +++ b/src/base/fs/dirname.c @@ -5,7 +5,7 @@ fs·dirname(char *path) { char *sep; - if((sep = strrchr(path, '/'))) + if((sep = str·rfindc(path, '/'))) *sep = 0; return path; diff --git a/src/base/fs/exists.c b/src/base/fs/exists.c index 1841a41..f7077ea 100644 --- a/src/base/fs/exists.c +++ b/src/base/fs/exists.c @@ -1,7 +1,7 @@ #include "internal.h" int -fs·exists(byte *path, int flag) +fs·exists(byte *path) { - return access(path, flag) == 0; + return !sys·access(path, sys·FileExists); } diff --git a/src/base/fs/open.c b/src/base/fs/open.c new file mode 100644 index 0000000..698ac71 --- /dev/null +++ b/src/base/fs/open.c @@ -0,0 +1,14 @@ +#include +#include + +int +fs·open(char *path, fs·Directory *dir) +{ + int fd, err; + if((err=sys·open(path, sys·ORead|sys·ODirectory|sys·OCloseExec, 0, &fd))) + return err; + + 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 new file mode 100644 index 0000000..7e60823 --- /dev/null +++ b/src/base/fs/read.c @@ -0,0 +1,25 @@ +#include +#include +#include + +int +fs·read(fs·Directory *dir, fs·DirEntry **ent) +{ + int err; + uintptr n; + + fs·DirEntry *de; + if(dir->pos >= dir->end){ + if((err=sys·direntry(dir->fd, arrlen(dir->buf), dir->buf, &n))) + return err; + dir->pos = 0; + dir->end = n; + } + + de = (fs·DirEntry *)(dir->buf + dir->pos); + dir->pos += de->len; + dir->off = de->off; + + *ent = de; + return 0; +} diff --git a/src/base/fs/walk.c b/src/base/fs/walk.c index 612aca8..786a32a 100644 --- a/src/base/fs/walk.c +++ b/src/base/fs/walk.c @@ -37,7 +37,7 @@ fs·walk(fs·Walker *fs) flags = 0; if(fs->flags & fs·nolinks) - flags |= AT_SYMLINK_NOFOLLOW; + flags |= sys·AtNoFollowLink; /* get info for base relative to current fd */ if(fstatat(fs->fd, fs->base, &cwd, flags) < 0){ @@ -71,8 +71,7 @@ fs·walk(fs·Walker *fs) /* open directory */ if(!fs->max || fs->lev + 1 < fs->max) { - fd = openat(fs->fd, fs->base, O_RDONLY | O_CLOEXEC | O_DIRECTORY); - if(fd < 0) + if(sys·openat(fs->fd, fs->base, sys·ORead|sys·OCloseExec|sys·ODirectory, 0, &fd)) errorf("open %s:", fs->path); if (!(dir=fdopendir(fd))) { diff --git a/src/base/fs/walker.c b/src/base/fs/walker.c index 0a0f61e..0a88f8e 100644 --- a/src/base/fs/walker.c +++ b/src/base/fs/walker.c @@ -12,15 +12,14 @@ 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) + if(sys·cwd(fs->path, arrlen(fs->path))) return 1; - fs->end += strlen(path); + fs->end += str·len(path); }else fs->end = str·ncopy(fs->base, arrlen(fs->path), path); if(fs->path[0] != '/') - fs->fd = AT_FDCWD; + fs->fd = sys·FdCwd; if(!fs->hist && !(fs->flags & fs·nolinks)) fs->hist = calloc(1, sizeof(*fs->hist)); -- cgit v1.2.1