sub open_fd { my ($fd, $flags)=@_; use Fcntl qw/O_APPEND O_RDONLY O_WRONLY O_RDWR O_ACCMODE/; use POSIX (); use IO::Handle (); if( ($flags & O_ACCMODE) == O_RDONLY ) { $flags='<'; } elsif( ($flags & O_ACCMODE) == O_WRONLY ) { if( $flags & O_APPEND ) { $flags='>>'; } else { $flags='>'; } } elsif( ($flags & O_ACCMODE) == O_RDWR ) { if( $flags & O_APPEND ) { $flags='+>>'; } else { $flags='+>'; } } else { POSIX::close($fd); return undef; } return IO::Handle->new_from_fd($fd, $flags); }