+{$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