use strict;
use Carp;
require Exporter;
require AutoLoader;
our $VERSION;
our $host;
BEGIN {
$VERSION = '1.11';
{
eval {
require XSLoader;
};
warn $@ if $@;
}
}
sub hostname {
# method 1 - we already know it
# method 1' - try to ask the system
if ($^O eq 'VMS') {
# method 2 - no sockets ==> return DECnet node name
# method 3 - has someone else done the job already? It's common for the
# method 4 - does hostname happen to work?
# rats!
$host = '';
croak "Cannot get host name of local machine";
}
elsif ($^O eq 'MSWin32') {
($host) = gethostbyname('localhost');
return $host;
}
elsif ($^O eq 'epoc') {
$host = 'localhost';
return $host;
}
else { # Unix
# is anyone going to make it here?
# method 2 - syscall is preferred since it avoids tainting problems
# XXX: is it such a good idea to return hostname untainted?
eval {
require "syscall.ph";
}
# method 2a - syscall using systeminfo instead of gethostname
# -- needed on systems like Solaris
|| eval {
require "sys/syscall.ph";
require "sys/systeminfo.ph";
}
# method 3 - trusty old hostname command
|| eval {
}
# method 4 - use POSIX::uname(), which strictly can't be expected to be
# correct
|| eval {
require POSIX;
}
# method 5 - sysV uname command (may truncate)
|| eval {
}
# method 6 - Apollo pre-SR10
|| eval {
my($a,$b,$c,$d);
}
# bummer
|| croak "Cannot get host name of local machine";
# remove garbage
$host =~ tr/\0\r\n//d;
$host;
}
}
1;
=head1 NAME
Sys::Hostname - Try every conceivable way to get hostname
=head1 SYNOPSIS
use Sys::Hostname;
$host = hostname;
=head1 DESCRIPTION
Attempts several methods of getting the system hostname and
then caches the result. It tries the first available of the C
library's gethostname(), C<`$Config{aphostname}`>, uname(2),
C<syscall(SYS_gethostname)>, C<`hostname`>, C<`uname -n`>,
All NULs, returns, and newlines are removed from the result.
=head1 AUTHOR
David Sundstrom E<lt>F<sunds@asictest.sc.ti.com>E<gt>
Texas Instruments
XS code added by Greg Bacon E<lt>F<gbacon@cs.uah.edu>E<gt>
=cut