summaryrefslogtreecommitdiffstats
path: root/runlscript.c
diff options
context:
space:
mode:
Diffstat (limited to 'runlscript.c')
-rw-r--r--runlscript.c70
1 files changed, 70 insertions, 0 deletions
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;
+}
+