[Libguestfs] [nbdkit PATCH v3 1/3] perl: Allow use of modules

Eric Blake eblake at redhat.com
Tue Jan 31 04:24:45 UTC 2017


Trying something as simple as 'use POSIX ();' causes the perl
plugin to croak:

$ ./src/nbdkit -e foo -fv plugins/perl/.libs/nbdkit-perl-plugin.so \
  script=plugins/perl/example.pl
nbdkit: debug: registering plugins/perl/.libs/nbdkit-perl-plugin.so
nbdkit: debug: registered plugins/perl/.libs/nbdkit-perl-plugin.so (name perl)
nbdkit: debug: plugins/perl/.libs/nbdkit-perl-plugin.so: load
nbdkit: debug: plugins/perl/.libs/nbdkit-perl-plugin.so: config key=script, value=plugins/perl/example.pl
Can't load module Fcntl, dynamic loading not available in this perl.
  (You may need to build a new perl executable which either supports
  dynamic loading or has the Fcntl module statically linked into it.)
 at /usr/lib64/perl5/POSIX.pm line 17.
Compilation failed in require at /usr/lib64/perl5/POSIX.pm line 17.
BEGIN failed--compilation aborted at /usr/lib64/perl5/POSIX.pm line 17.
Compilation failed in require at plugins/perl/example.pl line 2.
BEGIN failed--compilation aborted at plugins/perl/example.pl line 2.
nbdkit: error: plugins/perl/example.pl: one of the required callbacks 'open', 'get_size' or 'pread' is not defined by this Perl script.  nbdkit requires these callbacks.

Per 'perldoc perlembed', the solution is simple: statically incorporate
the DynaLoader module into the embedded interpreter.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 plugins/perl/perl.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/plugins/perl/perl.c b/plugins/perl/perl.c
index ec82ecb..64d9d17 100644
--- a/plugins/perl/perl.c
+++ b/plugins/perl/perl.c
@@ -140,6 +140,16 @@ check_perl_failure (void)
   return 0;
 }

+
+EXTERN_C void boot_DynaLoader (pTHX_ CV *cv);
+
+static void
+xs_init(pTHX)
+{
+  char *file = __FILE__;
+  newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
+}
+
 static int
 perl_config (const char *key, const char *value)
 {
@@ -158,7 +168,7 @@ perl_config (const char *key, const char *value)

     /* Load the Perl script. */
     argv[1] = (char *) script;
-    if (perl_parse (my_perl, NULL, argc, argv, NULL) == -1) {
+    if (perl_parse (my_perl, xs_init, argc, argv, NULL) == -1) {
       nbdkit_error ("%s: error parsing this script", script);
       return -1;
     }
-- 
2.9.3




More information about the Libguestfs mailing list