Cast the 'cmd' argument as unsigned.
authorDerrik Pates <demon@now.ai>
Tue, 2 Aug 2011 19:33:42 +0000 (13:33 -0600)
committerDerrik Pates <demon@now.ai>
Tue, 2 Aug 2011 19:33:42 +0000 (13:33 -0600)
Fuse.xs
examples/fioc.pl

diff --git a/Fuse.xs b/Fuse.xs
index 8d609fa..893f1a0 100755 (executable)
--- a/Fuse.xs
+++ b/Fuse.xs
@@ -1430,7 +1430,10 @@ int _PLfuse_ioctl(const char *file, int cmd, void *arg,
        SAVETMPS;
        PUSHMARK(SP);
        XPUSHs(sv_2mortal(newSVpv(file,0)));
        SAVETMPS;
        PUSHMARK(SP);
        XPUSHs(sv_2mortal(newSVpv(file,0)));
-       XPUSHs(sv_2mortal(newSViv(cmd)));
+       /* I don't know why cmd is a signed int in the first place;
+        * casting as unsigned so stupid tricks don't have to be done on
+        * the perl side */
+       XPUSHs(sv_2mortal(newSViv((unsigned int)cmd)));
        XPUSHs(sv_2mortal(newSViv(flags)));
        if (_IOC_DIR(cmd) & _IOC_WRITE)
                XPUSHs(sv_2mortal(newSVpvn(data, _IOC_SIZE(cmd))));
        XPUSHs(sv_2mortal(newSViv(flags)));
        if (_IOC_DIR(cmd) & _IOC_WRITE)
                XPUSHs(sv_2mortal(newSVpvn(data, _IOC_SIZE(cmd))));
index 3461180..811cb80 100755 (executable)
@@ -147,7 +147,6 @@ sub fioc_readdir {
 sub fioc_ioctl {
     my ($path, $cmd, $flags, $data) = @_;
     print 'called ', (caller(0))[3], "\n";
 sub fioc_ioctl {
     my ($path, $cmd, $flags, $data) = @_;
     print 'called ', (caller(0))[3], "\n";
-    $cmd = unpack('L', pack('l', $cmd));
 
     return -&EINVAL if fioc_file_type($path) != FIOC_FILE;
 
 
     return -&EINVAL if fioc_file_type($path) != FIOC_FILE;