+{$endif} //linux\r
+\r
+{$ifdef bsd}\r
+\r
+type\r
+ pifaddrs = ^Tifaddrs;\r
+ Tifaddrs = record\r
+ ifa_next: pifaddrs;\r
+ ifa_name: pansichar;\r
+ ifa_flags: cuint; // Interface flags (IFF_UP, IFF_BROADCAST, etc.)\r
+ ifa_addr: Pinetsockaddrv;\r
+ ifa_netmask: psockaddr;\r
+ ifa_dstaddr: psockaddr; // union: Destination address (P-t-P) or broadcast address\r
+ ifa_data: Pointer;\r
+ end;\r
+\r
+const\r
+ IFF_UP=1; //interface is administratively enabled\r
+\r
+function getifaddrs(var ifap: pifaddrs): cint; cdecl; external 'c' name 'getifaddrs';\r
+function freeifaddrs(ifap: pifaddrs): cint; cdecl; external 'c' name 'freeifaddrs';\r
+\r
+\r
+function getlocalips_internal(wantfamily:integer):tbiniplist;\r
+var\r
+ IfList: pifaddrs;\r
+ IfPtr: pifaddrs;\r
+ sa: PinetSockAddrV;\r
+begin\r
+ result := biniplist_new;\r
+\r
+ if getifaddrs(IfList) <> 0 then raise exception.create('getlocalips getifaddrs failed');\r
+\r
+ IfPtr := IfList;\r
+ while IfPtr <> nil do begin\r
+ if ((IfPtr^.ifa_flags and IFF_UP) <> 0) then begin\r
+ sa := IfPtr^.ifa_addr;\r
+ //if (sa <> nil) then writeln(sa^.inaddr.len,' ',sa^.inaddr.family);\r
+\r
+ if (sa <> nil) and (sa^.inaddr.family = wantfamily) then begin\r
+ biniplist_add(result, inaddrvtobinip(sa^));\r
+ end;\r
+ end;\r
+ IfPtr := IfPtr^.ifa_next;\r
+ end;\r
+\r
+ freeifaddrs(IfList);\r
+end;\r
+\r
+{$endif} //bsd\r
+\r
+\r