ref: cc43a4edaba3e332a975ed4df82cf5e919cd0c39
parent: 5ec928da062ba2fe97c3f7f0e9aed7473bbfa90e
author: kvik <kvik@a-b.xyz>
date: Sun Apr 18 19:43:39 EDT 2021
fs: implement p9.access()
--- a/fs.c
+++ b/fs.c
@@ -356,3 +356,43 @@
filenew(L, fd[1]);
return 2;
}
+
+static int
+accessmode(lua_State *L, const char *s)
+{
+ int i, n, mode;
+ char buf[64], *f[10], *p;
+
+ snprint(buf, sizeof buf, "%s", s);
+ n = getfields(buf, f, sizeof f, 1, " \t\n");
+ mode = 0;
+ for(i = 0; p = f[i], i < n; i++){
+ if(strcmp(p, "exist") == 0 || strcmp(p, "exists") == 0)
+ mode |= AEXIST;
+ else if(strcmp(p, "r") == 0 || strcmp(p, "read") == 0)
+ mode |= AREAD;
+ else if(strcmp(p, "w") == 0 || strcmp(p, "write") == 0)
+ mode |= AWRITE;
+ else if(strcmp(p, "rw") == 0 || strcmp(p, "rdwr") == 0)
+ mode |= AREAD|AWRITE;
+ else if(strcmp(p, "x") == 0 || strcmp(p, "exec") == 0)
+ mode |= AEXEC;
+ else
+ return luaL_error(L, "unknown access flag '%s'", p);
+ }
+ return mode;
+}
+
+static int
+p9_access(lua_State *L)
+{
+ const char *path;
+ int mode;
+
+ path = luaL_checkstring(L, 1);
+ mode = accessmode(L, luaL_optstring(L, 2, "exists"));
+ lua_pushboolean(L,
+ access(path, mode) == 0 ? 1 : 0
+ );
+ return 1;
+}
--- a/p9.c
+++ b/p9.c
@@ -156,6 +156,7 @@
{"file", p9_file},
{"pipe", p9_pipe},
{"remove", p9_remove},
+ {"access", p9_access},
{"stat", p9_stat},
{"walk", p9_walk},
--- a/test.lua
+++ b/test.lua
@@ -99,6 +99,13 @@
b:seek(0)
assert(b:read() == buf)
end
+
+-- access
+do
+ assert(p9.access("/dev/null"))
+ assert(p9.access("/dev/null", "read write"))
+ assert(p9.access("/bin/rc", "exec"))
+end
-- pipe
do