summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-08-29 10:31:09 +0100
committerRichard W.M. Jones <rjones@redhat.com>2012-08-30 22:39:48 +0100
commit372f2888606ee6873955b864beec56e00e607ef7 (patch)
tree25e244af31b2aab24e07e0f1aa3bdd0c9b0cf369
parent4a812fc77f7431e6b9c4eae1bc2ab22dd70b67f8 (diff)
downloadlibguestfs-372f2888606ee6873955b864beec56e00e607ef7.tar.gz
libguestfs-372f2888606ee6873955b864beec56e00e607ef7.tar.xz
libguestfs-372f2888606ee6873955b864beec56e00e607ef7.zip
perl: bindtests: Fix 64 bit integers on input on 32 bit Perl interpreter.
(cherry picked from commit 15cd9dde5e0e4a7d510de71ef8991750971cf6d1)
-rw-r--r--generator/generator_bindtests.ml4
-rw-r--r--generator/generator_perl.ml26
-rw-r--r--perl/typemap5
3 files changed, 30 insertions, 5 deletions
diff --git a/generator/generator_bindtests.ml b/generator/generator_bindtests.ml
index bc0e846d..38614282 100644
--- a/generator/generator_bindtests.ml
+++ b/generator/generator_bindtests.ml
@@ -307,7 +307,7 @@ my $g = Sys::Guestfs->new ();
| CallStringList xs ->
"[" ^ String.concat "," (List.map (sprintf "\"%s\"") xs) ^ "]"
| CallInt i -> string_of_int i
- | CallInt64 i -> Int64.to_string i
+ | CallInt64 i -> "\"" ^ Int64.to_string i ^ "\""
| CallBool b -> if b then "1" else "0"
| CallBuffer s -> "\"" ^ c_quote s ^ "\""
) args
@@ -316,7 +316,7 @@ my $g = Sys::Guestfs->new ();
function
| CallOBool (n, v) -> "'" ^ n ^ "' => " ^ if v then "1" else "0"
| CallOInt (n, v) -> "'" ^ n ^ "' => " ^ string_of_int v
- | CallOInt64 (n, v) -> "'" ^ n ^ "' => " ^ Int64.to_string v
+ | CallOInt64 (n, v) -> "'" ^ n ^ "' => \"" ^ Int64.to_string v ^ "\""
| CallOString (n, v) -> "'" ^ n ^ "' => '" ^ v ^ "'"
) optargs
)
diff --git a/generator/generator_perl.ml b/generator/generator_perl.ml
index 80ea1201..5cef7029 100644
--- a/generator/generator_perl.ml
+++ b/generator/generator_perl.ml
@@ -75,6 +75,28 @@ my_newSVull(unsigned long long val) {
#endif
}
+/* Convert a 64 bit int on input. To cope with the case of having
+ * a 32 bit Perl interpreter, we allow the user to pass a string
+ * here which is scanned as a 64 bit integer.
+ */
+static int64_t
+my_SvIV64 (SV *sv)
+{
+#ifdef USE_64_BIT_ALL
+ return SvIV (sv);
+#else
+ if (SvTYPE (sv) == SVt_PV) {
+ const char *str = SvPV_nolen (sv);
+ int64_t r;
+
+ sscanf (str, \"%%\" SCNi64, &r);
+ return r;
+ }
+ else
+ return SvIV (sv);
+#endif
+}
+
/* http://www.perlmonks.org/?node_id=680842 */
static char **
XS_unpack_charPtrPtr (SV *arg) {
@@ -420,8 +442,8 @@ user_cancel (g)
pr " optargs_s.%s = " n;
(match argt with
| OBool _
- | OInt _
- | OInt64 _ -> pr "SvIV (ST (items_i+1))"
+ | OInt _ -> pr "SvIV (ST (items_i+1))"
+ | OInt64 _ -> pr "my_SvIV64 (ST (items_i+1))"
| OString _ -> pr "SvPV_nolen (ST (items_i+1))"
);
pr ";\n";
diff --git a/perl/typemap b/perl/typemap
index d978e601..43e79485 100644
--- a/perl/typemap
+++ b/perl/typemap
@@ -2,7 +2,7 @@ TYPEMAP
char * T_PV
const char * T_PV
guestfs_h * O_OBJECT_guestfs_h
-int64_t T_IV
+int64_t O_OBJECT_int64
INPUT
O_OBJECT_guestfs_h
@@ -18,6 +18,9 @@ O_OBJECT_guestfs_h
croak (\"${Package}::$func_name(): $var is not a blessed HV reference\");
}
+O_OBJECT_int64
+ $var = my_SvIV64 ($arg);
+
OUTPUT
O_OBJECT_guestfs_h
sv_setiv ($arg, PTR2IV ($var));