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