aboutsummaryrefslogtreecommitdiff
path: root/src/base/fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/fs')
-rw-r--r--src/base/fs/basename.c2
-rw-r--r--src/base/fs/close.c8
-rw-r--r--src/base/fs/dirname.c2
-rw-r--r--src/base/fs/exists.c4
-rw-r--r--src/base/fs/open.c14
-rw-r--r--src/base/fs/read.c25
-rw-r--r--src/base/fs/walk.c5
-rw-r--r--src/base/fs/walker.c7
8 files changed, 56 insertions, 11 deletions
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 <u.h>
+#include <base.h>
+
+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 <u.h>
+#include <base.h>
+
+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 <u.h>
+#include <base.h>
+#include <sys.h>
+
+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));