[syslinux] [PATCH 1/2] lua: improve handling of files/initramfs
p.emmerich at first-colo.net
p.emmerich at first-colo.net
Fri Nov 4 06:19:29 PDT 2016
From: Paul Emmerich <p.emmerich at first-colo.net>
* add initramfs:load_file(), a wrapper for initramfs_load_file
* initramfs:add_file() now accepts files loaded via sl.loadfile()
* initramfs:add_file() sets mkdirs by default now
* add file:data() returning file contents as a string
---
com32/lua/src/syslinux.c | 52 ++++++++++++++++++++++++++++++++++++++----------
1 file changed, 42 insertions(+), 10 deletions(-)
diff --git a/com32/lua/src/syslinux.c b/com32/lua/src/syslinux.c
index 9a2998b..108081d 100644
--- a/com32/lua/src/syslinux.c
+++ b/com32/lua/src/syslinux.c
@@ -280,6 +280,15 @@ static int sl_filename(lua_State * L)
return 1;
}
+static int sl_filedata(lua_State * L)
+{
+ const syslinux_file *file = luaL_checkudata(L, 1, SYSLINUX_FILE);
+
+ lua_pushlstring(L, file->data, file->size);
+
+ return 1;
+}
+
static int sl_initramfs_init(lua_State * L)
{
struct initramfs *ir = lua_newuserdata (L, sizeof (*ir));
@@ -303,20 +312,41 @@ static int sl_initramfs_load_archive(lua_State * L)
static int sl_initramfs_add_file(lua_State * L)
{
const char *filename = luaL_checkstring(L, 2);
- size_t file_len;
- const char *file_data = luaL_optlstring (L, 3, NULL, &file_len);
void *data = NULL;
-
- if (file_len) {
- data = malloc (file_len);
+ size_t data_len = 0;
+ const char *string_data;
+ const syslinux_file *file_data;
+
+ if (lua_isstring(L, 3)) {
+ /* called with file contents as string */
+ string_data = lua_tolstring(L, 3, &data_len);
+ data = malloc (data_len);
if (!data) return luaL_error (L, "Out of memory");
- memcpy (data, file_data, file_len);
- }
+ memcpy(data, string_data, data_len);
+ } else if (lua_isuserdata(L, 3)) {
+ /* called with a SYSLINUX_FILE object */
+ file_data = luaL_checkudata(L, 3, SYSLINUX_FILE);
+ data = file_data->data;
+ data_len = file_data->size;
+ } /* else: nil, just create an empty file */
+
if (initramfs_add_file(luaL_checkudata(L, 1, SYSLINUX_INITRAMFS),
- data, file_len, file_len, filename,
- luaL_optint (L, 4, 0), luaL_optint (L, 5, 0755)))
+ data, data_len, data_len, filename,
+ luaL_optint (L, 5, 1), luaL_optint (L, 4, 0755)))
return luaL_error (L, "Adding file %s to initramfs failed", filename);
- lua_settop (L, 1);
+ lua_settop(L, 1);
+ return 1;
+}
+
+static int sl_initramfs_load_file(lua_State * L)
+{
+ const char *dst_filename = luaL_checkstring(L, 2);
+ const char *src_filename = luaL_checkstring(L, 3);
+ if (initramfs_load_file(luaL_checkudata(L, 1, SYSLINUX_INITRAMFS),
+ src_filename, dst_filename,
+ luaL_optint(L, 5, 1), luaL_optint(L, 4, 0755)))
+ return luaL_error (L, "Adding file %s to initramfs failed", dst_filename);
+ lua_settop(L, 1);
return 1;
}
@@ -461,6 +491,7 @@ static const luaL_Reg file_methods[] = {
{"__gc", sl_unloadfile},
{"name", sl_filename},
{"size", sl_filesize},
+ {"data", sl_filedata},
{NULL, NULL}
};
@@ -468,6 +499,7 @@ static const luaL_Reg initramfs_methods[] = {
{"__gc", sl_initramfs_purge},
{"load", sl_initramfs_load_archive},
{"add_file", sl_initramfs_add_file},
+ {"load_file", sl_initramfs_load_file},
{"size", sl_initramfs_size},
{NULL, NULL}
};
--
2.2.1
More information about the Syslinux
mailing list