projects
/
perl-fuse.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Cast the 'cmd' argument as unsigned.
[perl-fuse.git]
/
examples
/
fioc.pl
diff --git
a/examples/fioc.pl
b/examples/fioc.pl
index
bcf1e3e
..
811cb80
100755
(executable)
--- a/
examples/fioc.pl
+++ b/
examples/fioc.pl
@@
-3,17
+3,19
@@
use strict;
no strict qw(refs);
use strict;
no strict qw(refs);
-use Carp ();
+use threads;
+use threads::shared;
+
+use Carp;
local $SIG{'__WARN__'} = \&Carp::cluck;
use Fuse;
use Fcntl qw(:mode);
local $SIG{'__WARN__'} = \&Carp::cluck;
use Fuse;
use Fcntl qw(:mode);
-use Errno qw(:POSIX);
use POSIX;
use POSIX;
-my $fioc_size = 0;
+my $fioc_size
:shared
= 0;
use constant FIOC_NAME => 'fioc';
use constant FIOC_NAME => 'fioc';
-my $fioc_buf = '';
+my $fioc_buf
:shared
= '';
use constant FIOC_NONE => 0;
use constant FIOC_ROOT => 1;
use constant FIOC_FILE => 2;
use constant FIOC_NONE => 0;
use constant FIOC_ROOT => 1;
use constant FIOC_FILE => 2;
@@
-28,7
+30,7
@@
sub fioc_resize {
my ($size) = @_;
print 'called ', (caller(0))[3], "\n";
return 0 if $size == $fioc_size;
my ($size) = @_;
print 'called ', (caller(0))[3], "\n";
return 0 if $size == $fioc_size;
-
+
if ($size < $fioc_size) {
$fioc_buf = substr($fioc_buf, 0, $size);
}
if ($size < $fioc_size) {
$fioc_buf = substr($fioc_buf, 0, $size);
}
@@
-111,6
+113,7
@@
sub fioc_read {
sub fioc_write {
my ($path, $data, $offset) = @_;
print 'called ', (caller(0))[3], "\n";
sub fioc_write {
my ($path, $data, $offset) = @_;
print 'called ', (caller(0))[3], "\n";
+ lock($fioc_buf);
return -&EINVAL if fioc_file_type($path) != FIOC_FILE;
return -&EINVAL if fioc_file_type($path) != FIOC_FILE;
@@
-125,6
+128,7
@@
sub fioc_write {
sub fioc_truncate {
my ($path, $size) = @_;
print 'called ', (caller(0))[3], "\n";
sub fioc_truncate {
my ($path, $size) = @_;
print 'called ', (caller(0))[3], "\n";
+ lock($fioc_buf);
return -&EINVAL if fioc_file_type($path) != FIOC_FILE;
return -&EINVAL if fioc_file_type($path) != FIOC_FILE;
@@
-143,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;
@@
-153,6
+156,7
@@
sub fioc_ioctl {
return(0, pack('L', $fioc_size));
}
elsif ($cmd == FIOC_SET_SIZE) {
return(0, pack('L', $fioc_size));
}
elsif ($cmd == FIOC_SET_SIZE) {
+ lock($fioc_buf);
fioc_resize(unpack('L', $data));
return 0;
}
fioc_resize(unpack('L', $data));
return 0;
}
@@
-170,4
+174,5
@@
Fuse::main(
'open' => 'main::fioc_open',
'read' => 'main::fioc_read',
'write' => 'main::fioc_write',
'open' => 'main::fioc_open',
'read' => 'main::fioc_read',
'write' => 'main::fioc_write',
- 'ioctl' => 'main::fioc_ioctl');
+ 'ioctl' => 'main::fioc_ioctl',
+ 'threaded' => 1);