aboutsummaryrefslogtreecommitdiff
path: root/src/sysbin/lx/lxsyslib.c
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2017-04-19 15:34:04 +0200
committerAlex Auvolat <alex@adnab.me>2017-04-19 15:34:04 +0200
commite53a39d9ec28b24ea0d408f1500e987d005cd651 (patch)
tree639c93f2a17aabee7759cd16645b4d7da693ae4c /src/sysbin/lx/lxsyslib.c
parentd4a89538d381bb62b4c7c864b09d3d8274cf0bdb (diff)
downloadkogata-e53a39d9ec28b24ea0d408f1500e987d005cd651.tar.gz
kogata-e53a39d9ec28b24ea0d408f1500e987d005cd651.zip
Lua shell :)
Diffstat (limited to 'src/sysbin/lx/lxsyslib.c')
-rw-r--r--src/sysbin/lx/lxsyslib.c221
1 files changed, 221 insertions, 0 deletions
diff --git a/src/sysbin/lx/lxsyslib.c b/src/sysbin/lx/lxsyslib.c
new file mode 100644
index 0000000..5bfec3e
--- /dev/null
+++ b/src/sysbin/lx/lxsyslib.c
@@ -0,0 +1,221 @@
+/*
+** Lua eXtended system library
+*/
+
+#define lxsyslib_c
+#define LUA_LIB
+
+#include <lua/lprefix.h>
+
+
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <lua/lua.h>
+
+#include <lua/lauxlib.h>
+#include <lua/lualib.h>
+
+#include "lxlib.h"
+
+
+
+static void setintfield (lua_State *L, const char *key, int value) {
+ lua_pushinteger(L, value);
+ lua_setfield(L, -2, key);
+}
+
+static void setstrfield (lua_State *L, const char *key, const char* value) {
+ lua_pushstring(L, value);
+ lua_setfield(L, -2, key);
+}
+
+
+static int sys_dbg_print(lua_State *L) {
+ const char *str = luaL_checkstring(L, 1);
+ sc_dbg_print(str);
+ return 0;
+}
+
+static int sys_yield(lua_State *L) {
+ sc_yield();
+ return 0;
+}
+
+static int sys_exit(lua_State *L) {
+ int code = luaL_checkinteger(L, 1);
+ sc_exit(code);
+ return 0;
+}
+
+static int sys_usleep(lua_State *L) {
+ int usecs = luaL_checkinteger(L, 1);
+ sc_usleep(usecs);
+ return 0;
+}
+
+/*
+ Missing syscalls :
+ - sys_new_thread, exit_thread -> into specific threading library
+ - mmap, mmap_file, mchmap, munmap -> into specific memory-related library ??
+*/
+
+static int sys_create(lua_State *L) {
+ const char *name = luaL_checkstring(L, 1);
+ int type = luaL_checkinteger(L, 2);
+ lua_pushboolean(L, sc_create(name, type));
+ return 1;
+}
+
+static int sys_delete(lua_State *L) {
+ const char *name = luaL_checkstring(L, 1);
+ lua_pushboolean(L, sc_delete(name));
+ return 1;
+}
+
+static int sys_move(lua_State *L) {
+ const char *oldname = luaL_checkstring(L, 1);
+ const char *newname = luaL_checkstring(L, 2);
+ lua_pushboolean(L, sc_move(oldname, newname));
+ return 1;
+}
+
+static int sys_stat(lua_State *L) {
+ const char* name = luaL_checkstring(L, 1);
+ stat_t s;
+ if (sc_stat(name, &s)) {
+ lua_createtable(L, 0, 3);
+ setintfield(L, "type", s.type);
+ setintfield(L, "access", s.access);
+ setintfield(L, "size", s.size);
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+
+static int sys_open(lua_State *L) {
+ const char* name = luaL_checkstring(L, 1);
+ int mode = luaL_checkinteger(L, 2);
+ fd_t fh = sc_open(name, mode);
+ if (fh) {
+ lua_pushinteger(L, fh);
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+static int sys_close(lua_State *L) {
+ int fd = luaL_checkinteger(L, 1);
+ sc_close(fd);
+ return 0;
+}
+
+static int sys_read(lua_State *L) {
+ int fd = luaL_checkinteger(L, 1);
+ int offset = luaL_checkinteger(L, 2);
+ int len = luaL_checkinteger(L, 3);
+
+ luaL_Buffer b;
+ char* bufptr = luaL_buffinitsize(L, &b, len);
+ int ret = sc_read(fd, offset, len, bufptr);
+
+ luaL_pushresultsize(&b, ret);
+ lua_pushinteger(L, ret);
+ return 2;
+}
+
+static int sys_write(lua_State *L) {
+ int fd = luaL_checkinteger(L, 1);
+ int offset = luaL_checkinteger(L, 2);
+ const char* str = luaL_checkstring(L, 3);
+ int len = luaL_len(L, 3);
+
+ int ret = sc_write(fd, offset, len, str);
+ lua_pushinteger(L, ret);
+ return 1;
+}
+
+static int sys_readdir(lua_State *L) {
+ int fd = luaL_checkinteger(L, 1);
+ int ent_no = luaL_checkinteger(L, 2);
+
+ dirent_t d;
+ bool ret = sc_readdir(fd, ent_no, &d);
+ if (ret) {
+ lua_createtable(L, 0, 4);
+ setstrfield(L, "name", d.name);
+ setintfield(L, "type", d.st.type);
+ setintfield(L, "access", d.st.access);
+ setintfield(L, "size", d.st.size);
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+static int sys_stat_open(lua_State *L) {
+ int fd = luaL_checkinteger(L, 1);
+ stat_t s;
+ if (sc_stat_open(fd, &s)) {
+ lua_createtable(L, 0, 3);
+ setintfield(L, "type", s.type);
+ setintfield(L, "access", s.access);
+ setintfield(L, "size", s.size);
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+static int sys_ioctl(lua_State *L) {
+ // TODO
+ return 0;
+}
+
+static int sys_fctl(lua_State *L) {
+ // TODO
+ return 0;
+}
+
+static int sys_select(lua_State *L) {
+ // TODO
+ return 0;
+}
+
+
+static const luaL_Reg syslib[] = {
+ {"dbg_print", sys_dbg_print},
+ {"yield", sys_yield},
+ {"exit", sys_exit},
+ {"usleep", sys_usleep},
+ {"create", sys_create},
+ {"delete", sys_delete},
+ {"move", sys_move},
+ {"stat", sys_stat},
+ {"open", sys_open},
+ {"close", sys_close},
+ {"read", sys_read},
+ {"write", sys_write},
+ {"readdir", sys_readdir},
+ {"stat_open", sys_stat_open},
+
+ {NULL, NULL}
+};
+
+/* }====================================================== */
+
+
+
+LUAMOD_API int lx_open_sys (lua_State *L) {
+ luaL_newlib(L, syslib);
+ return 1;
+}
+
+
+/* vim: set sts=2 ts=2 sw=2 tw=0 et :*/