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