Your code is somewhat confusing as to whether you want to return the unsigned char[16] as a Perl array/list (16 individual values), or as a scalar (Perl string of length 16).
Assuming the latter, I think you're approaching things in a much too complicated way. Simply create a char[16] buffer in C, let XSessionID() fill it, and place a copy of it in an SV, which you then return:
#!/usr/bin/perl -wl use strict; use Inline C => <<'END_C'; SV* GenerateSessionID() { char uuid[16]; // buffer // fill buffer, i.e. mimic your XSessionID() int i; for (i=0; i<16; i++) { uuid[i] = 0xA0 + i; } return newSVpvn(uuid, 16); } END_C my $uuid = GenerateSessionID(); print join ' ', unpack("(H2)*", $uuid);
Output:
$ ./962624.pl a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af
Not using Inline::C (i.e. using a normal XSUB instead), this should translate to something like
SV * GenerateSessionID() PREINIT: char uuid[16]; CODE: XSessionID((uuid_t*)uuid); RETVAL = newSVpvn(uuid, 16); OUTPUT: RETVAL
Or, if you want to use PPCODE:
void GenerateSessionID() PREINIT: char uuid[16]; PPCODE: XSessionID((uuid_t*)uuid); ST(0) = newSVpvn(uuid, 16); sv_2mortal(ST(0)); XSRETURN(1);
In reply to Re: Need to pass an unsigned char array from an xsub back to Perl
by Eliya
in thread Need to pass an unsigned char array from an xsub back to Perl
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |