Remove more unnecessary lines.
[perl-fuse.git] / examples / fioclient.pl
1 #!/usr/bin/env perl
2
3 use strict;
4 no strict qw(refs);
5
6 use Carp;
7 local $SIG{'__WARN__'} = \&Carp::cluck;
8
9 use Fcntl qw(:mode);
10 use Errno qw(:POSIX);
11 use POSIX;
12
13 require 'asm/ioctl.ph';
14
15 our %sizeof = ('int' => 4);
16 sub FIOC_GET_SIZE { _IOR(ord 'E', 0, 'int'); }
17 sub FIOC_SET_SIZE { _IOW(ord 'E', 1, 'int'); }
18
19 sub usage {
20     print <<'_EOT_';
21 Usage: fioclient.pl FIOC_FILE COMMAND
22
23 COMMANDS
24   s [SIZE]     : get size if SIZE is omitted, set size otherwise
25   r SIZE [OFF] : read SIZE bytes @ OFF (default 0) and output to stdout
26   w SIZE [OFF] : write SIZE bytes @ OFF (default 0) from stdin
27
28 _EOT_
29     exit(1);
30 }
31
32
33 usage() if scalar(@ARGV) < 2;
34
35 open(my $file, '+<', $ARGV[0]) or usage();
36
37 if ($ARGV[1] eq 's') {
38     if (!defined $ARGV[2]) {
39         my $size;
40         my $rv = ioctl($file, FIOC_GET_SIZE, $size);
41         if (!defined($rv) || $rv != 0) {
42             croak($!);
43         }
44         printf("\%u\n", unpack('L', $size));
45     }
46     else {
47         my $rv = ioctl($file, FIOC_SET_SIZE, pack('L', $ARGV[2]));
48         if (!defined($rv) || $rv != 0) {
49             croak($!);
50         }
51     }
52 }
53 elsif ($ARGV[1] eq 'r' || $ARGV[1] eq 'w') {
54     usage() unless defined $ARGV[2];
55     my $size = $ARGV[2];
56     my $off = 0;
57     if (defined $ARGV[3]) {
58         $off = $ARGV[3];
59     }
60     seek($file, SEEK_SET, $off);
61     if ($ARGV[1] eq 'r') {
62         read($file, my $data, $size);
63         print $data;
64     }
65     else {
66         read(STDIN, my $data, $size);
67         print $file $data;
68     }
69 }
70 else {
71     usage();
72 }
73
74 close($file);