1use strict;
2use warnings;
3use FFI::Platypus 1.00;
4
5{
6  package FD;
7
8  use constant O_RDONLY => 0;
9  use constant O_WRONLY => 1;
10  use constant O_RDWR   => 2;
11
12  use constant IN  => bless \do { my $in=0  }, __PACKAGE__;
13  use constant OUT => bless \do { my $out=1 }, __PACKAGE__;
14  use constant ERR => bless \do { my $err=2 }, __PACKAGE__;
15
16  my $ffi = FFI::Platypus->new( api => 1, lib => [undef]);
17
18  $ffi->type('object(FD,int)' => 'fd');
19
20  $ffi->attach( [ 'open' => 'new' ] => [ 'string', 'int', 'mode_t' ] => 'fd' => sub {
21    my($xsub, $class, $fn, @rest) = @_;
22    my $fd = $xsub->($fn, @rest);
23    die "error opening $fn $!" if $$fd == -1;
24    $fd;
25  });
26
27  $ffi->attach( write => ['fd', 'string', 'size_t' ] => 'ssize_t' );
28  $ffi->attach( read  => ['fd', 'string', 'size_t' ] => 'ssize_t' );
29  $ffi->attach( close => ['fd'] => 'int' );
30}
31
32my $fd = FD->new("$0", FD::O_RDONLY);
33
34my $buffer = "\0" x 10;
35
36while(my $br = $fd->read($buffer, 10))
37{
38  FD::OUT->write($buffer, $br);
39}
40
41$fd->close;
42