summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-11-20 16:20:12 +0000
committerRichard W.M. Jones <rjones@redhat.com>2012-11-20 16:34:23 +0000
commitca488a6d7b6f5701b63249d5a0c73eada09c432c (patch)
tree85eba69be93a141a99b040a27e74ac61ba54c6c8
parent8f80f9fdae13a320da978dffa2c9d94e7b68a810 (diff)
downloadlibguestfs-ca488a6d7b6f5701b63249d5a0c73eada09c432c.tar.gz
libguestfs-ca488a6d7b6f5701b63249d5a0c73eada09c432c.tar.xz
libguestfs-ca488a6d7b6f5701b63249d5a0c73eada09c432c.zip
lua: Various fixes to the bindings (thanks Jerome Vuarand).
See http://article.gmane.org/gmane.comp.lang.lua.general/95065 Note that this is incompatible with existing code. You have to do: local G = require "guestfs" local g = G.create () ie. give the module your own name ("G" in that example).
-rw-r--r--generator/bindtests.ml4
-rw-r--r--generator/lua.ml48
-rw-r--r--lua/examples/create_disk.lua6
-rw-r--r--lua/examples/guestfs-lua.pod20
-rw-r--r--lua/examples/inspect_vm.lua6
-rwxr-xr-xlua/tests/015-globals.lua14
-rwxr-xr-xlua/tests/020-create.lua4
-rwxr-xr-xlua/tests/025-create-flags.lua4
-rwxr-xr-xlua/tests/027-create-multiple.lua8
-rwxr-xr-xlua/tests/030-config.lua4
-rwxr-xr-xlua/tests/050-lvcreate.lua4
-rwxr-xr-xlua/tests/060-readdir.lua4
-rwxr-xr-xlua/tests/070-optargs.lua4
-rwxr-xr-xlua/tests/400-events.lua6
-rwxr-xr-xlua/tests/400-progress.lua4
15 files changed, 88 insertions, 52 deletions
diff --git a/generator/bindtests.ml b/generator/bindtests.ml
index 11094d18..b707427b 100644
--- a/generator/bindtests.ml
+++ b/generator/bindtests.ml
@@ -742,9 +742,9 @@ and generate_erlang_bindtests () =
and generate_lua_bindtests () =
generate_header LuaStyle GPLv2plus;
- pr "require \"guestfs\"\n";
+ pr "local G = require \"guestfs\"\n";
pr "\n";
- pr "g = Guestfs.create ()\n";
+ pr "local g = G.create ()\n";
pr "\n";
generate_lang_bindtests (
diff --git a/generator/lua.ml b/generator/lua.ml
index fc4cb0fa..1f50cf35 100644
--- a/generator/lua.ml
+++ b/generator/lua.ml
@@ -42,6 +42,7 @@ let generate_lua_c () =
#include <inttypes.h>
#include <string.h>
#include <errno.h>
+#include <assert.h>
/*#define LUA_LIB*/
#include <lua.h>
@@ -148,6 +149,7 @@ lua_guestfs_create (lua_State *L)
u = lua_newuserdata (L, sizeof (struct userdata));
luaL_getmetatable (L, LUA_GUESTFS_HANDLE);
+ assert (lua_type (L, -1) == LUA_TTABLE);
lua_setmetatable (L, -2);
u->g = g;
@@ -818,9 +820,22 @@ push_event (lua_State *L, uint64_t event)
pr "\
-static luaL_Reg handle_methods[] = {
+/* Metamethods.
+ * See: http://article.gmane.org/gmane.comp.lang.lua.general/95065
+ */
+static luaL_Reg metamethods[] = {
{ \"__gc\", lua_guestfs_finalizer },
+ { NULL, NULL }
+};
+
+/* Module functions. */
+static luaL_Reg functions[] = {
{ \"create\", lua_guestfs_create },
+ { NULL, NULL }
+};
+
+/* Methods. */
+static luaL_Reg methods[] = {
{ \"close\", lua_guestfs_close },
{ \"user_cancel\", lua_guestfs_user_cancel },
{ \"set_event_callback\", lua_guestfs_set_event_callback },
@@ -859,20 +874,30 @@ luaopen_guestfs (lua_State *L)
{
char v[256];
- /* Create metatable and register methods into it. */
+ /* Create metatable. */
luaL_newmetatable (L, LUA_GUESTFS_HANDLE);
- luaL_register (L, NULL /* \"guestfs\" ? XXX */, handle_methods);
+ luaL_register (L, NULL, metamethods);
- /* Set __index field of metatable to point to itself. */
- lua_pushvalue (L, -1);
- lua_setfield (L, -1, \"__index\");
+ /* Create methods table. */
+ lua_newtable (L);
+ luaL_register (L, NULL, methods);
- /* Globals in the Guestfs.* namespace. */
+ /* Set __index field of metatable to point to methods table. */
+ lua_setfield (L, -2, \"__index\");
+
+ /* Pop metatable, it is no longer needed. */
+ lua_pop (L, 1);
+
+ /* Create module functions table. */
+ lua_newtable (L);
+ luaL_register (L, NULL, functions);
+
+ /* Globals in the module namespace. */
lua_pushliteral (L, \"event_all\");
push_string_list (L, (char **) event_all);
lua_settable (L, -3);
- /* Add _COPYRIGHT, etc. fields to the metatable. */
+ /* Add _COPYRIGHT, etc. fields to the module namespace. */
lua_pushliteral (L, \"_COPYRIGHT\");
lua_pushliteral (L, \"Copyright (C) %s Red Hat Inc.\");
lua_settable (L, -3);
@@ -886,9 +911,10 @@ luaopen_guestfs (lua_State *L)
lua_pushlstring (L, v, strlen (v));
lua_settable (L, -3);
- /* Expose metatable to lua as \"Guestfs\". */
- lua_setglobal (L, \"Guestfs\");
-
+ /* Return module table, so users choose their own name for the module:
+ * local G = require \"guestfs\"
+ * g = G.create ()
+ */
return 1;
}
diff --git a/lua/examples/create_disk.lua b/lua/examples/create_disk.lua
index 2dfc1fc2..c662a2c5 100644
--- a/lua/examples/create_disk.lua
+++ b/lua/examples/create_disk.lua
@@ -1,10 +1,10 @@
-- Example showing how to create a disk image.
-require "guestfs"
+local G = require "guestfs"
-output = "disk.img"
+local output = "disk.img"
-g = Guestfs.create ()
+local g = G.create ()
-- Create a raw-format sparse disk image, 512 MB in size.
file = io.open (output, "w")
diff --git a/lua/examples/guestfs-lua.pod b/lua/examples/guestfs-lua.pod
index 18d427b5..193a9a97 100644
--- a/lua/examples/guestfs-lua.pod
+++ b/lua/examples/guestfs-lua.pod
@@ -6,8 +6,8 @@ guestfs-lua - How to use libguestfs from Lua
=head1 SYNOPSIS
- require "guestfs"
- g = Guestfs.create ()
+ local G = require "guestfs"
+ g = G.create ()
g:add_drive ("test.img", { format = "raw", readonly = true })
g:launch ()
devices = g:list_devices ()
@@ -20,15 +20,25 @@ programming language. This page just documents the differences from
the C API and gives some examples. If you are not familiar with using
libguestfs, you also need to read L<guestfs(3)>.
+=head2 REQUIRING THE MODULE
+
+C<require "guestfs"> returns the module, so you have to assign it
+to a local variable. Typical usage is:
+
+ local G = require "guestfs"
+
+(you can use any name you want instead of C<G>, but in the examples
+in this man page we always use C<G>).
+
=head2 OPENING AND CLOSING THE HANDLE
To create a new handle, call:
- g = Guestfs.create ()
+ g = G.create ()
You can also use the optional arguments:
- g = Guestfs.create { environment = 0, close_on_exit = 0 }
+ g = G.create { environment = 0, close_on_exit = 0 }
to set the flags C<GUESTFS_CREATE_NO_ENVIRONMENT>
and/or C<GUESTFS_CREATE_NO_CLOSE_ON_EXIT>.
@@ -95,7 +105,7 @@ second argument a list:
eh = g:set_event_callback (cb, { "appliance", "library", "trace" })
A list of all valid event types (strings) is in the global variable
-C<Guestfs.event_all>.
+C<G.event_all>.
The callback (C<cb>) is called with the following parameters:
diff --git a/lua/examples/inspect_vm.lua b/lua/examples/inspect_vm.lua
index 1bee10b3..e35b4631 100644
--- a/lua/examples/inspect_vm.lua
+++ b/lua/examples/inspect_vm.lua
@@ -1,6 +1,6 @@
-- Example showing how to inspect a virtual machine disk.
-require "guestfs"
+local G = require "guestfs"
if table.getn (arg) == 1 then
disk = arg[1]
@@ -8,7 +8,7 @@ else
error ("usage: inspect_vm disk.img")
end
-g = Guestfs.create ()
+local g = G.create ()
-- Attach the disk image read-only to libguestfs.
g:add_drive (disk, { -- format:"raw"
@@ -18,7 +18,7 @@ g:add_drive (disk, { -- format:"raw"
g:launch ()
-- Ask libguestfs to inspect for operating systems.
-roots = g:inspect_os ()
+local roots = g:inspect_os ()
if table.getn (roots) == 0 then
error ("inspect_vm: no operating systems found")
end
diff --git a/lua/tests/015-globals.lua b/lua/tests/015-globals.lua
index ee69f40c..9733ef5c 100755
--- a/lua/tests/015-globals.lua
+++ b/lua/tests/015-globals.lua
@@ -16,11 +16,11 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-assert (Guestfs._COPYRIGHT)
-print ("_COPYRIGHT = ", Guestfs._COPYRIGHT)
-assert (Guestfs._DESCRIPTION)
-print ("_DESCRIPTION = ", Guestfs._DESCRIPTION)
-assert (Guestfs._VERSION)
-print ("_VERSION = ", Guestfs._VERSION)
+assert (G._COPYRIGHT)
+print ("_COPYRIGHT = ", G._COPYRIGHT)
+assert (G._DESCRIPTION)
+print ("_DESCRIPTION = ", G._DESCRIPTION)
+assert (G._VERSION)
+print ("_VERSION = ", G._VERSION)
diff --git a/lua/tests/020-create.lua b/lua/tests/020-create.lua
index 527aa0bc..b7e748d6 100755
--- a/lua/tests/020-create.lua
+++ b/lua/tests/020-create.lua
@@ -16,6 +16,6 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-local g = Guestfs.create ()
+local g = G.create ()
diff --git a/lua/tests/025-create-flags.lua b/lua/tests/025-create-flags.lua
index 881b1834..08865c70 100755
--- a/lua/tests/025-create-flags.lua
+++ b/lua/tests/025-create-flags.lua
@@ -16,6 +16,6 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-local g = Guestfs.create { environment = 0 }
+local g = G.create { environment = 0 }
diff --git a/lua/tests/027-create-multiple.lua b/lua/tests/027-create-multiple.lua
index bd6cae56..a3f8c8cf 100755
--- a/lua/tests/027-create-multiple.lua
+++ b/lua/tests/027-create-multiple.lua
@@ -16,11 +16,11 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-g1 = Guestfs.create ()
-g2 = Guestfs.create ()
-g3 = Guestfs.create ()
+local g1 = G.create ()
+local g2 = G.create ()
+local g3 = G.create ()
-- Check that each handle is independent.
g1:set_path ("1")
diff --git a/lua/tests/030-config.lua b/lua/tests/030-config.lua
index 53e47fc8..d70528c0 100755
--- a/lua/tests/030-config.lua
+++ b/lua/tests/030-config.lua
@@ -16,9 +16,9 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-local g = Guestfs.create ()
+local g = G.create ()
local verbose = g:get_verbose ()
g:set_verbose (true)
diff --git a/lua/tests/050-lvcreate.lua b/lua/tests/050-lvcreate.lua
index 3bd95c23..9fd5bec7 100755
--- a/lua/tests/050-lvcreate.lua
+++ b/lua/tests/050-lvcreate.lua
@@ -16,9 +16,9 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-local g = Guestfs.create ()
+local g = G.create ()
file = io.open ("test.img", "w")
file:seek ("set", 500 * 1024 * 1024)
diff --git a/lua/tests/060-readdir.lua b/lua/tests/060-readdir.lua
index 07e8e3ba..b1481370 100755
--- a/lua/tests/060-readdir.lua
+++ b/lua/tests/060-readdir.lua
@@ -16,9 +16,9 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-local g = Guestfs.create ()
+local g = G.create ()
file = io.open ("test.img", "w")
file:seek ("set", 10 * 1024 * 1024)
diff --git a/lua/tests/070-optargs.lua b/lua/tests/070-optargs.lua
index fe0ec753..00559a1b 100755
--- a/lua/tests/070-optargs.lua
+++ b/lua/tests/070-optargs.lua
@@ -16,9 +16,9 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-local g = Guestfs.create ()
+local g = G.create ()
g:add_drive ("/dev/null")
g:add_drive ("/dev/null", { readonly = true })
diff --git a/lua/tests/400-events.lua b/lua/tests/400-events.lua
index 47a86a5e..c17bdc27 100755
--- a/lua/tests/400-events.lua
+++ b/lua/tests/400-events.lua
@@ -16,13 +16,13 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-for i, v in ipairs (Guestfs.event_all) do
+for i, v in ipairs (G.event_all) do
print (i, v)
end
-g = Guestfs.create ()
+local g = G.create ()
function log_callback (g, event, eh, flags, buf, array)
io.write (string.format ("lua event logged: event=%s eh=%d buf='%s'\n",
diff --git a/lua/tests/400-progress.lua b/lua/tests/400-progress.lua
index e0e17ac8..293a4631 100755
--- a/lua/tests/400-progress.lua
+++ b/lua/tests/400-progress.lua
@@ -16,9 +16,9 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require "guestfs"
+local G = require "guestfs"
-g = Guestfs.create ()
+local g = G.create ()
g:add_drive ("/dev/null")
g:launch ()