7 local $SIG{'__WARN__'} = \&Carp::cluck;
13 use constant FIOC_NAME => 'fioc';
14 use constant FIOC_NONE => 0;
15 use constant FIOC_ROOT => 1;
16 use constant FIOC_FILE => 2;
18 require 'asm/ioctl.ph';
20 our %sizeof = ('int' => 4);
21 sub FIOC_GET_SIZE { _IOR(ord 'E', 0, 'int'); }
22 sub FIOC_SET_SIZE { _IOW(ord 'E', 1, 'int'); }
26 Usage: fioclient.pl FIOC_FILE COMMAND
29 s [SIZE] : get size if SIZE is omitted, set size otherwise
30 r SIZE [OFF] : read SIZE bytes @ OFF (default 0) and output to stdout
31 w SIZE [OFF] : write SIZE bytes @ OFF (default 0) from stdin
38 usage() if scalar(@ARGV) < 2;
40 open(my $file, '+<', $ARGV[0]) or usage();
42 if ($ARGV[1] eq 's') {
43 if (!defined $ARGV[2]) {
45 my $rv = ioctl($file, FIOC_GET_SIZE, $size);
46 if (!defined($rv) || $rv != 0) {
49 printf("\%u\n", unpack('L', $size));
52 my $rv = ioctl($file, FIOC_SET_SIZE, pack('L', $ARGV[2]));
53 if (!defined($rv) || $rv != 0) {
58 elsif ($ARGV[1] eq 'r' || $ARGV[1] eq 'w') {
59 usage() unless defined $ARGV[2];
62 if (defined $ARGV[3]) {
65 seek($file, SEEK_SET, $off);
66 if ($ARGV[1] eq 'r') {
67 read($file, my $data, $size);
71 read(STDIN, my $data, $size);