socsvn commit: r268635 - soc2014/pedrosouza/lua_loader/head/sys/boot/common
pedrosouza at FreeBSD.org
pedrosouza at FreeBSD.org
Mon May 26 13:37:35 UTC 2014
Author: pedrosouza
Date: Mon May 26 13:37:34 2014
New Revision: 268635
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=268635
Log:
Added missing file intep_lua.c
Added:
soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c
Added: soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c Mon May 26 13:37:34 2014 (r268635)
@@ -0,0 +1,203 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h> /* to pick up __FreeBSD_version */
+#include <machine/stdarg.h>
+
+
+#include "bootstrap.h"
+#include "interp.h"
+
+#define lua_c
+
+#include "../lua/src/lua.h"
+#include "../lua/src/ldebug.h"
+
+struct interp_lua_softc {
+ lua_State *luap;
+};
+struct interp_lua_softc lua_softc = { 0 };
+
+#define LDBG(...) do { \
+ printf("%s(%d): ", __func__, __LINE__); \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+} while (0)
+
+
+int lua_print(lua_State *L)
+{
+ int i;
+ int n = lua_gettop(L);
+ for (i = 1; i <= n; ++i)
+ printf("%s", lua_tostring(L, i));
+ return 0;
+}
+
+int lua_perform(lua_State *L)
+{
+
+ int argc, ret;
+ char **argv;
+ int res = -1;
+ int n = lua_gettop(L);
+
+ if (n >= 1)
+ {
+ parse(&argc, &argv, lua_tostring(L, 1));
+ res = perform(argc, argv);
+ }
+ lua_pushnumber(L, res);
+
+ return 1;
+}
+
+void * lua_realloc(void *ud, void *ptr, size_t osize, size_t nsize)
+{
+ (void)ud; (void)osize; /* not used */
+ if (nsize == 0) {
+ free(ptr);
+ return NULL;
+ }
+ else
+ return realloc(ptr, nsize);
+}
+
+typedef struct data_chunk
+{
+ void * data;
+ size_t size;
+} data_chunk;
+
+const char * read_chunk(lua_State *L, void * chunk, size_t *sz)
+{
+ data_chunk * ds = (data_chunk *)chunk;
+ if (ds->size == 0) return NULL;
+ *sz = ds->size;
+ ds->size = 0;
+ return (const char*)ds->data;
+}
+
+
+int do_string(lua_State *L, const char * str, size_t size)
+{
+ int res;
+ data_chunk ds;
+ ds.data = (void*)str;
+ ds.size = size;
+ res = lua_load(L, read_chunk, &ds, "do_string___", 0);
+ res = lua_pcall(L, 0, LUA_MULTRET, 0);
+ return res;
+}
+
+
+void
+interp_lua_init(void *ctx)
+{
+ lua_State *luap;
+ struct bootblk_command **cmdp;
+ struct interp_lua_softc *softc;
+ struct env_var *ev;
+ const char *name_str, *val_str;
+ char buf[16];
+
+ softc = ctx;
+ luap = lua_newstate(lua_realloc, NULL);
+ if (luap == NULL) {
+ LDBG("problem with initializing Lua interpreter\n");
+ }
+ softc->luap = luap;
+ lua_register(luap, "print", lua_print);
+ lua_register(luap, "perform", lua_perform);
+
+}
+
+int
+interp_lua_run(void *data, const char *line)
+{
+ lua_State *luap;
+ struct interp_lua_softc *softc;
+ int argc, ret;
+ char **argv;
+
+ softc = data;
+ luap = softc->luap;
+
+ if (do_string(luap, line, strlen(line)) != 0)
+ printf("[LUA]Failed to execure \'%s\'\n", line);
+
+ return (0);
+}
+
+int
+interp_lua_incl(void *ctx, const char *filename)
+{
+ lua_State *luap;
+ struct interp_lua_softc *softc;
+ struct stat st;
+ char *filebuf, *errstr;
+ int fd, filebufoff, i, rleft, rread;
+
+ printf("[Lua] Including file %s.\n", filename);
+ /*
+ if ((strcmp(filename, "/boot/loader.rc") == 0) ||
+ (strcmp(filename, "/boot/boot.conf") == 0)) {
+ printf("Skipping loader.rc and boot.conf");
+ return (0);
+ }
+ */
+ softc = ctx;
+ luap = softc->luap;
+ /*
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0) {
+ printf("Couldn't open file %s\n", filename);
+ return (1);
+ }
+ i = stat(filename, &st);
+ assert(i == 0);
+ filebuf = malloc(st.st_size);
+ assert(filebuf != NULL);
+ memset(filebuf, 0, st.st_size);
+ */
+ /*
+ * XX: Investigate stat() vs logic problem. I'm getting
+ * more bytes that the file really has.
+ */
+
+ /*
+ rleft = st.st_size - 1;
+ filebufoff = 0;
+ for (;;) {
+ rread = read(fd, filebuf + filebufoff, rleft);
+ assert(rread >= 0);
+ rleft -= rread;
+ filebufoff += rread;
+ if (rread == 0 || rleft <= 0) {
+ break;
+ }
+ }
+ close(fd);
+ i = LUA_DOSTRING(luap, filebuf);
+ free(filebuf);
+ if ((i != 0) && (lua_isnil(luap, -1) == 0)) {
+ errstr = lua_tostring(luap, -1);
+ if (errstr == NULL) {
+ errstr = "internal error; errstr must be string";
+ }
+ printf("Problem with script execution:\n\n");
+ printf("\t'%s'\n\n", errstr);
+ lua_pop(luap, 1);
+ }
+ */
+ return (0);
+}
+
+
+struct interp boot_interp_lua = {
+ .init = interp_lua_init,
+ .run = interp_lua_run,
+ .incl = interp_lua_incl,
+ .context = &lua_softc,
+};
More information about the svn-soc-all
mailing list