/usr/lib/perl5/IO/Interface.pm is in libio-interface-perl 1.06-1build2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 | package IO::Interface;
require 5.005;
use strict;
use Carp;
use vars qw(@EXPORT @EXPORT_OK @ISA %EXPORT_TAGS $VERSION $AUTOLOAD);
use IO::Socket;
require Exporter;
require DynaLoader;
use AutoLoader;
my @functions = qw(if_addr if_broadcast if_netmask if_dstaddr if_hwaddr if_flags if_list if_mtu if_metric
addr_to_interface if_index if_indextoname );
my @flags = qw(IFF_ALLMULTI IFF_AUTOMEDIA IFF_BROADCAST
IFF_DEBUG IFF_LOOPBACK IFF_MASTER
IFF_MULTICAST IFF_NOARP IFF_NOTRAILERS
IFF_POINTOPOINT IFF_PORTSEL IFF_PROMISC
IFF_RUNNING IFF_SLAVE IFF_UP);
%EXPORT_TAGS = ( 'all' => [@functions,@flags],
'functions' => \@functions,
'flags' => \@flags,
);
@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
@EXPORT = qw( );
@ISA = qw(Exporter DynaLoader);
$VERSION = '1.06';
sub AUTOLOAD {
# This AUTOLOAD is used to 'autoload' constants from the constant()
# XS function. If a constant is not found then control is passed
# to the AUTOLOAD in AutoLoader.
my $constname;
($constname = $AUTOLOAD) =~ s/.*:://;
croak "&constant not defined" if $constname eq 'constant';
my $val = constant($constname, @_ ? $_[0] : 0);
if ($! != 0) {
if ($! =~ /Invalid/ || $!{EINVAL}) {
$AutoLoader::AUTOLOAD = $AUTOLOAD;
goto &AutoLoader::AUTOLOAD;
}
else {
croak "Your vendor has not defined IO::Interface macro $constname";
}
}
{
no strict 'refs';
*$AUTOLOAD = sub { $val }; # *$AUTOLOAD = sub() { $val };
}
goto &$AUTOLOAD;
}
bootstrap IO::Interface $VERSION;
# copy routines into IO::Socket
{
no strict 'refs';
*{"IO\:\:Socket\:\:$_"} = \&$_ foreach @functions;
}
# Preloaded methods go here.
sub if_list {
my %hash = map {$_=>undef} &_if_list;
sort keys %hash;
}
sub addr_to_interface {
my ($sock,$addr) = @_;
return "any" if $addr eq '0.0.0.0';
my @interfaces = $sock->if_list;
foreach (@interfaces) {
my $if_addr = $sock->if_addr($_) or next;
return $_ if $if_addr eq $addr;
}
return; # couldn't find it
}
# Autoload methods go after =cut, and are processed by the autosplit program.
1;
__END__
=head1 NAME
IO::Interface - Perl extension for access to network card configuration information
=head1 SYNOPSIS
# ======================
# the new, preferred API
# ======================
use IO::Interface::Simple;
my $if1 = IO::Interface::Simple->new('eth0');
my $if2 = IO::Interface::Simple->new_from_address('127.0.0.1');
my $if3 = IO::Interface::Simple->new_from_index(1);
my @interfaces = IO::Interface::Simple->interfaces;
for my $if (@interfaces) {
print "interface = $if\n";
print "addr = ",$if->address,"\n",
"broadcast = ",$if->broadcast,"\n",
"netmask = ",$if->netmask,"\n",
"dstaddr = ",$if->dstaddr,"\n",
"hwaddr = ",$if->hwaddr,"\n",
"mtu = ",$if->mtu,"\n",
"metric = ",$if->metric,"\n",
"index = ",$if->index,"\n";
print "is running\n" if $if->is_running;
print "is broadcast\n" if $if->is_broadcast;
print "is p-to-p\n" if $if->is_pt2pt;
print "is loopback\n" if $if->is_loopback;
print "is promiscuous\n" if $if->is_promiscuous;
print "is multicast\n" if $if->is_multicast;
print "is notrailers\n" if $if->is_notrailers;
print "is noarp\n" if $if->is_noarp;
}
# ===========
# the old API
# ===========
use IO::Socket;
use IO::Interface qw(:flags);
my $s = IO::Socket::INET->new(Proto => 'udp');
my @interfaces = $s->if_list;
for my $if (@interfaces) {
print "interface = $if\n";
my $flags = $s->if_flags($if);
print "addr = ",$s->if_addr($if),"\n",
"broadcast = ",$s->if_broadcast($if),"\n",
"netmask = ",$s->if_netmask($if),"\n",
"dstaddr = ",$s->if_dstaddr($if),"\n",
"hwaddr = ",$s->if_hwaddr($if),"\n";
print "is running\n" if $flags & IFF_RUNNING;
print "is broadcast\n" if $flags & IFF_BROADCAST;
print "is p-to-p\n" if $flags & IFF_POINTOPOINT;
print "is loopback\n" if $flags & IFF_LOOPBACK;
print "is promiscuous\n" if $flags & IFF_PROMISC;
print "is multicast\n" if $flags & IFF_MULTICAST;
print "is notrailers\n" if $flags & IFF_NOTRAILERS;
print "is noarp\n" if $flags & IFF_NOARP;
}
my $interface = $s->addr_to_interface('127.0.0.1');
=head1 DESCRIPTION
IO::Interface adds methods to IO::Socket objects that allows them to
be used to retrieve and change information about the network
interfaces on your system. In addition to the object-oriented access
methods, you can use a function-oriented style.
THIS API IS DEPRECATED. Please see L<IO::Interface::Simple> for the
preferred way to get and set interface configuration information.
=head2 Creating a Socket to Access Interface Information
You must create a socket before you can access interface
information. The socket does not have to be connected to a remote
site, or even used for communication. The simplest procedure is to
create a UDP protocol socket:
my $s = IO::Socket::INET->new(Proto => 'udp');
The various IO::Interface functions will now be available as methods
on this socket.
=head2 Methods
=over 4
=item @iflist = $s->if_list
The if_list() method will return a list of active interface names, for
example "eth0" or "tu0". If no interfaces are configured and running,
returns an empty list.
=item $addr = $s->if_addr($ifname [,$newaddr])
if_addr() gets or sets the interface address. Call with the interface
name to retrieve the address (in dotted decimal format). Call with a
new address to set the interface. In the latter case, the routine
will return a true value if the operation was successful.
my $oldaddr = $s->if_addr('eth0');
$s->if_addr('eth0','192.168.8.10') || die "couldn't set address: $!";
Special case: the address of the pseudo-device "any" will return the
IP address "0.0.0.0", which corresponds to the INADDR_ANY constant.
=item $broadcast = $s->if_broadcast($ifname [,$newbroadcast]
Get or set the interface broadcast address. If the interface does not
have a broadcast address, returns undef.
=item $mask = $s->if_netmask($ifname [,$newmask])
Get or set the interface netmask.
=item $dstaddr = $s->if_dstaddr($ifname [,$newdest])
Get or set the destination address for point-to-point interfaces.
=item $hwaddr = $s->if_hwaddr($ifname [,$newhwaddr])
Get or set the hardware address for the interface. Currently only
ethernet addresses in the form "00:60:2D:2D:51:70" are accepted.
=item $flags = $s->if_flags($ifname [,$newflags])
Get or set the flags for the interface. The flags are a bitmask
formed from a series of constants. See L<Exportable constants> below.
=item $ifname = $s->addr_to_interface($ifaddr)
Given an interface address in dotted form, returns the name of the
interface associated with it. Special case: the INADDR_ANY address,
0.0.0.0 will return a pseudo-interface name of "any".
=back
=head2 EXPORT
IO::Interface exports nothing by default. However, you can import the
following symbol groups into your namespace:
:functions Function-oriented interface (see below)
:flags Flag constants (see below)
:all All of the above
=head2 Function-Oriented Interface
By importing the ":functions" set, you can access IO::Interface in a
function-oriented manner. This imports all the methods described
above into your namespace. Example:
use IO::Socket;
use IO::Interface ':functions';
my $sock = IO::Socket::INET->new(Proto=>'udp');
my @interfaces = if_list($sock);
print "address = ",if_addr($sock,$interfaces[0]);
=head2 Exportable constants
The ":flags" constant imports the following constants for use with the
flags returned by if_flags():
IFF_ALLMULTI
IFF_AUTOMEDIA
IFF_BROADCAST
IFF_DEBUG
IFF_LOOPBACK
IFF_MASTER
IFF_MULTICAST
IFF_NOARP
IFF_NOTRAILERS
IFF_POINTOPOINT
IFF_PORTSEL
IFF_PROMISC
IFF_RUNNING
IFF_SLAVE
IFF_UP
This example determines whether interface 'tu0' supports multicasting:
use IO::Socket;
use IO::Interface ':flags';
my $sock = IO::Socket::INET->new(Proto=>'udp');
print "can multicast!\n" if $sock->if_flags & IFF_MULTICAST.
=head1 AUTHOR
Lincoln Stein E<lt>lstein@cshl.orgE<gt>
This module is distributed under the same license as Perl itself.
=head1 SEE ALSO
perl(1), IO::Socket(3), IO::Multicast(3), L<IO::Interface::Simple>
=cut
|