The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# ----------------------------------------------------------------------------
# "THE BEER-WARE LICENSE" (Revision 42)
# <tobez@catpipe.net> wrote this file.  As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return.   Anton Berezin
# ----------------------------------------------------------------------------
#
# $Id: Dirfd.pm,v 1.1.1.1 2001/11/21 17:30:15 tobez Exp $
#
package IO::Dir::Dirfd;

use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);

require Exporter;
require DynaLoader;

@ISA = qw(Exporter DynaLoader);
@EXPORT = qw(dirfd);
@EXPORT_OK = qw(fileno);
$VERSION = '0.01';

sub dirfd(*);

bootstrap IO::Dir::Dirfd $VERSION;

sub fileno(*)
{
	no strict "refs";
	my $no;
	eval { $no = CORE::fileno($_[0]) };
	return $no if defined $no;
	my $arg = $_[0];
	$! = 0;
	unless (ref($arg) || $arg =~ /(^\*)|(::)/) {
		my $caller = caller || 'main';
		$arg = "${caller}::$arg";
	}
	$no = dirfd($arg);
	use strict "refs";
	$no;
}

1;
__END__

=head1 NAME

IO::Dir::Dirfd - Perl extension to extract the file descriptor from a dirhandle

=head1 SYNOPSIS

  use IO::Dir::Dirfd;

  opendir D, "." or die $!;
  my $fd = dirfd(D);

  use IO::Dir::Dirfd qw(fileno);

  opendir D, "." or die $!;
  my $fd = fileno(D);

=head1 DESCRIPTION

The IO::Dir::Dirfd module provides the possibility to extract the file
descriptor from a directory handle on platforms where this functionality
is available.

It exports a single sub, dirfd(), by default.  If you specify that you
want to export fileno(), the core fileno() will be overrided.  After
this you can use fileno() for both file- and dirhandles.

=head1 BUGS

As of now, the module was only tested on FreeBSD 4.4 and FreeBSD 5.0;
there's no garantee it will work as advertised elsewehere (or even on
FreeBSD, for that matter).

It is possible that the fileno(HANDLE) form will not work under all
circumstances.  Use fileno(*HANDLE) instead if in doubt.

=head1 AUTHOR

Anton Berezin, tobez@catpipe.net

=head1 SEE ALSO

dirfd(3).

=cut