ioctl call.
Original Reporter info from Mantis: mrdebug
-
Reporter name: Denis Gottardello
Original Reporter info from Mantis: mrdebug
- Reporter name: Denis Gottardello
Description:
On Linux this call retur only configured card. The unconfigured card are non listened.
I can not parse /proc/net/dev file because I must know if an interface is wire or wireless.
Excusme for my bad English.
Additional information:
program LanInterfaceList;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, libc, SysUtils;
function GetMacAddress(Interfaccia: String): String;
var
ifr : ifreq;
sock: Integer;
begin
GetMacAddress:= '';
strncpy(ifr.ifr_ifrn.ifrn_name, pChar(Interfaccia), IF_NAMESIZE- 1);
sock:= socket(AF_INET, SOCK_DGRAM, 0);
if sock>= 0 then begin
if ioctl(sock, SIOCGIFHWADDR, @ifr)>= 0 then begin
GetMacAddress:= IntToHex(ifr.ifr_ifru.ifru_hwaddr.sa_data[0], 2)+ ':'+
IntToHex(ifr.ifr_ifru.ifru_hwaddr.sa_data[1], 2)+ ':'+
IntToHex(ifr.ifr_ifru.ifru_hwaddr.sa_data[2], 2)+ ':'+
IntToHex(ifr.ifr_ifru.ifru_hwaddr.sa_data[3], 2)+ ':'+
IntToHex(ifr.ifr_ifru.ifru_hwaddr.sa_data[4], 2)+ ':'+
IntToHex(ifr.ifr_ifru.ifru_hwaddr.sa_data[5], 2);
end;
libc.__close(sock);
end;
end;
function GetFlags(Interfaccia: String): Integer;
var
ifr : ifreq;
sock: Integer;
begin
GetFlags:= 0;
strncpy(ifr.ifr_ifrn.ifrn_name, pChar(Interfaccia), IF_NAMESIZE- 1);
sock:= socket(AF_INET, SOCK_DGRAM, 0);
if sock>= 0 then begin
if ioctl(sock, SIOCGIFFLAGS, @ifr)>= 0 then begin
GetFlags:= ifr.ifr_ifru.ifru_flags;
end;
libc.__close(sock);
end;
end;
function InterfacesList(): String;
const SIOCGIWNAME= 35585;
var
ifc: ifconf;
ifr: array[0..1023] of ifreq;
sock, I: Integer;
RigaOut: String;
begin
InterfacesList:= '';
sock:= socket(AF_INET, SOCK_DGRAM, 0);
if sock>= 0 then begin
ifc.ifc_len:= SizeOf(ifr);
ifc.ifc_ifcu.ifcu_req:= ifr;
if ioctl(sock, SIOCGIFCONF, @ifc)= 0 then begin
for I:= 0 to ifc.ifc_len div SizeOf(ifreq)- 1 do begin
RigaOut:= ifr[I].ifr_ifrn.ifrn_name+ ', '+ GetMacAddress(ifr[I].ifr_ifrn.ifrn_name);
if (GetFlags(ifr[I].ifr_ifrn.ifrn_name) and IFF_LOOPBACK)<> 0 then RigaOut:= RigaOut+ ', Loopbak';
if ioctl(sock, SIOCGIWNAME, @ifr[I])= 0 then RigaOut:= RigaOut+ ', Wireless.';
if (GetFlags(ifr[I].ifr_ifrn.ifrn_name) and IFF_UP)<> 0 then RigaOut:= RigaOut+ ', Up.' else RigaOut:= RigaOut+ ', Down.';
InterfacesList:= InterfacesList+ Chr(13)+ Chr(10)+ RigaOut;
end;
end;
libc.__close(sock);
end;
end;
begin
WriteLn(InterfacesList());
end.
Mantis conversion info:
- Mantis ID: 11346
- Version: 0.9.24