summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--Makefile23
-rw-r--r--README3
-rw-r--r--lib/e.lua18
-rw-r--r--rc.d/example23
-rw-r--r--runlscript.c70
6 files changed, 139 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7701b0c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+runlscript
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..613bb9d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,23 @@
+
+LIBS=-llua
+
+scriptdir=/etc/rc.d
+sbindir=/sbin
+rcluadir=/lib/rc/lua
+
+INSTALL=install
+
+rcscripts=rc.d/example
+rclualibs=lib/e.lua
+
+runlscript: runlscript.c
+ $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $< -o $@
+
+
+install: runlscript $(rcscripts)
+ $(INSTALL) -d $(DESTDIR)$(scriptdir) $(DESTDIR)$(sbindir) \
+ $(DESTDIR)$(rcluadir)
+ $(INSTALL) -m 755 runlscript $(DESTDIR)$(sbindir)
+ $(INSTALL) -m 755 $(rcscripts) $(DESTDIR)$(scriptdir)
+ $(INSTALL) -m 644 $(rclualibs) $(DESTDIR)$(rcluadir)
+
diff --git a/README b/README
new file mode 100644
index 0000000..9526132
--- /dev/null
+++ b/README
@@ -0,0 +1,3 @@
+This is a proof of concept of a openrc rewrite in Lua
+
+The idea is that all boot scripts are written in lua.
diff --git a/lib/e.lua b/lib/e.lua
new file mode 100644
index 0000000..738a519
--- /dev/null
+++ b/lib/e.lua
@@ -0,0 +1,18 @@
+module(..., package.seeall)
+
+function ebegin(msg)
+ io.write(" * "..msg..": ")
+end
+
+
+function eend(status, msg)
+ local msg
+ if status then
+ msg = "ok"
+ else
+ msg = "failed"
+ end
+ io.write(msg.."\n")
+ return status
+end
+
diff --git a/rc.d/example b/rc.d/example
new file mode 100644
index 0000000..308d904
--- /dev/null
+++ b/rc.d/example
@@ -0,0 +1,23 @@
+#!/sbin/runlscript
+
+svcname = "example"
+
+function depend()
+ return {
+ need = { "localmount" }
+ keyword = { "-prefix", "-vserver" }
+ }
+end
+
+function start()
+ e.ebegin("starting "..svcname)
+ -- start something
+ return e.eend(true)
+end
+
+
+function stop()
+ e.ebegin("Stopping "..svcname)
+ return e.eend(true)
+end
+
diff --git a/runlscript.c b/runlscript.c
new file mode 100644
index 0000000..5eaef8a
--- /dev/null
+++ b/runlscript.c
@@ -0,0 +1,70 @@
+
+#include <sys/mman.h>
+#include <sys/stat.h>
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <lua.h>
+#include <lauxlib.h>
+#include <lualib.h>
+
+#define RCLUAPATH "/lib/rc/lua"
+
+int load_rclibs(lua_State *L)
+{
+ int err = luaL_loadstring(L, "package.path = package.path..\";" RCLUAPATH "/?.lua\"\n"
+ "require(\"e\")\n")
+ || lua_pcall(L, 0, 0, 0);
+ if (err) {
+ fprintf(stderr, "error loading libs: %s\n",
+ lua_tostring(L, -1));
+ lua_pop(L, 1);
+ return -1;
+ }
+}
+
+int runfile(lua_State *L, const char *filename)
+{
+ int err;
+ err = luaL_loadfile(L, filename)
+ || lua_pcall(L, 0, 0, 0);
+ if (err) {
+ fprintf(stderr, "%s", lua_tostring(L, -1));
+ lua_pop(L, 1);
+ }
+ return(err);
+}
+
+int main(int argc, char *argv[])
+{
+ int err;
+ lua_State *L = lua_open();
+ char *filename = NULL;
+ char *func = NULL;
+
+ luaL_openlibs(L);
+ if (argc > 1)
+ filename = argv[1];
+ if (argc > 2)
+ func = argv[2];
+
+ if (load_rclibs(L) != 0)
+ return 1;
+
+ err = runfile(L, filename);
+ if (err || func == NULL)
+ return err;
+
+ lua_getglobal(L, func);
+ if (lua_pcall(L, 0, 1, 0) != 0) {
+ fprintf(stderr, "error running function '%s': %s\n", func,
+ lua_tostring(L, -1));
+ return -1;
+ }
+ err = lua_toboolean(L, -1);
+ lua_close(L);
+ return !err;
+}
+