From: Michael Tremer Date: Tue, 25 Apr 2017 11:52:29 +0000 (+0100) Subject: captive: Get MAC address of a device without calling arp X-Git-Tag: v2.19-core115~60^2~47 X-Git-Url: http://git.ipfire.org/?p=people%2Fpmueller%2Fipfire-2.x.git;a=commitdiff_plain;h=dbfd2622f58727f4b0f9bed8934a770a2050491f captive: Get MAC address of a device without calling arp Signed-off-by: Michael Tremer --- diff --git a/config/cfgroot/network-functions.pl b/config/cfgroot/network-functions.pl index 66f1ed554a..93b8190305 100644 --- a/config/cfgroot/network-functions.pl +++ b/config/cfgroot/network-functions.pl @@ -374,6 +374,26 @@ sub wifi_get_signal_level($) { return $signal_level; } + +sub get_hardware_address($) { + my $ip_address = shift; + my $ret; + + open(FILE, "/proc/net/arp") or die("Could not read ARP table"); + + while () { + my ($ip_addr, $hwtype, $flags, $hwaddr, $mask, $device) = split(/\s+/, $_); + if ($ip_addr eq $ip_address) { + $ret = $hwaddr; + last; + } + } + + close(FILE); + + return $ret; +} + 1; # Remove the next line to enable the testsuite diff --git a/html/cgi-bin/captive/index.cgi b/html/cgi-bin/captive/index.cgi index 05619b47c3..bcaf8561af 100755 --- a/html/cgi-bin/captive/index.cgi +++ b/html/cgi-bin/captive/index.cgi @@ -58,9 +58,8 @@ if ($cgiparams{'ACTION'} eq "SUBMIT") { #Get Clients IP-Address my $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} ||""; - #Ask arp to give the corresponding MAC-Address - my $mac_address = qx(arp -a|grep $ip_address|cut -d ' ' -f 4); - $mac_address =~ s/\n+\z//; + # Retrieve the MAC address from the ARP table + my $mac_address = &Network::get_hardware_address($ip_address); &General::readhasharray("$clients", \%clientshash); my $key = &General::findhasharraykey(\%clientshash); @@ -84,15 +83,13 @@ if ($cgiparams{'ACTION'} eq "SUBMIT") { if ($cgiparams{'ACTION'} eq "SUBMIT") { my $ip_address; - my $mac_address; my $granted=0; #Convert voucherinput to uppercase $cgiparams{'VOUCHER'} = uc $cgiparams{'VOUCHER'}; #Get Clients IP-Address $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} ||""; #Ask arp to give the corresponding MAC-Address - $mac_address = qx(arp -a|grep $ip_address|cut -d ' ' -f 4); - $mac_address =~ s/\n+\z//; + my $mac_address = &Network::get_hardware_address($ip_address); #Check if voucher is valid and write client to clients file, delete voucher from voucherout &General::readhasharray("$voucherout", \%voucherhash); &General::readhasharray("$clients", \%clientshash);