ref: cc882f7cb96fb0e481aba49bfcad199bb56392db
parent: afb18ac80f88ac730d95fb6f6e442c77b90f47ea
author: kvik <kvik@a-b.xyz>
date: Mon Apr 19 12:54:07 EDT 2021
proc: implement p9.exec()
--- a/p9.c
+++ b/p9.c
@@ -176,6 +176,7 @@
{"sleep", p9_sleep}, {"alarm", p9_alarm}, {"rfork", p9_rfork},+ {"exec", p9_exec}, {"wdir", p9_wdir}, {"pid", p9_pid}, {"ppid", p9_ppid},--- a/proc.c
+++ b/proc.c
@@ -141,3 +141,27 @@
lua_pushinteger(L, r);
return 1;
}
+
+static int
+p9_exec(lua_State *L)
+{+ int argc, i;
+ const char **argv, *p;
+ char buf[Smallbuf];
+
+ argc = lua_gettop(L);
+ if(argc < 1)
+ luaL_argerror(L, 1, "string arguments expected");
+ argv = lalloc(L, nil, (argc+1) * sizeof(char*));
+ for(i = 1; i <= argc; i++)
+ argv[i-1] = luaL_checkstring(L, i);
+ argv[argc] = nil;
+ p = argv[0];
+ if(p[0] != '/' && (p[0] != '.' && p[1] != '/')){+ snprint(buf, sizeof buf, "/bin/%s", argv[0]);
+ argv[0] = buf;
+ }
+ exec(argv[0], argv);
+ free(argv);
+ return error(L, "exec: %r");
+}
--- a/test.lua
+++ b/test.lua
@@ -242,6 +242,29 @@
assert(p9.pid() and p9.ppid())
end
+-- Fork & Exec
+do
+ local us, them = p9.pipe()
+ if p9.rfork("proc nowait fd") == 0 then+ them:dup(p9.file(0))
+ them:dup(p9.file(1))
+ them:close()
+ p9.exec("cat")+ else
+ them:close()
+ us:write("HELLO CAT")+ us:write("")+ assert(us:slurp() == "HELLO CAT")
+ us:close()
+ end
+
+ local ok = p9.exec("/dev/mordor")+ assert(not ok)
+end
+
+
+
+
-- Environment variables
do
local e
--
⑨