From 846c9163d5c79122abb3a3c9278fcb814615e7c6 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Mon, 6 Dec 2010 15:08:09 -0800 Subject: Add is_local_address to Misc.pm Commonly needed routine to check if IP address is local. --- lib/Vyatta/Misc.pm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'lib/Vyatta/Misc.pm') diff --git a/lib/Vyatta/Misc.pm b/lib/Vyatta/Misc.pm index 3e109f2..949c6a2 100755 --- a/lib/Vyatta/Misc.pm +++ b/lib/Vyatta/Misc.pm @@ -26,7 +26,8 @@ require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(getInterfaces getIP getNetAddIP get_sysfs_value is_address_enabled is_dhcp_enabled get_ipaddr_intf_hash - isIpAddress is_ip_v4_or_v6 interface_description); + isIpAddress is_ip_v4_or_v6 interface_description + is_local_addres); our @EXPORT_OK = qw(generate_dhclient_intf_files getInterfacesIPadresses getPortRuleString); @@ -34,7 +35,7 @@ our @EXPORT_OK = qw(generate_dhclient_intf_files use Vyatta::Config; use Vyatta::Interface; use NetAddr::IP; - +use Socket; # # returns a hash of ipaddrs => interface # @@ -125,6 +126,18 @@ sub getInterfaces { return @interfaces; } +# Test if IP address is local to the system. +# Implemented by doing bind since by default +# Linux will only allow binding to local addresses +sub is_local_address { + my $addr = shift; + + socket( my $sock, PF_INET, SOCK_STREAM, 0) + or die "socket failed\n"; + + return bind($sock, sockaddr_in(0, inet_aton($addr))); +} + # get list of IPv4 and IPv6 addresses # if name is defined then get the addresses on that interface # if type is defined then restrict to that type (inet, inet6) -- cgit v1.2.3