+  TLInetSockAddr4 = packed Record\r
+    family:Word;\r
+    port  :Word;\r
+    addr  :uint32;\r
+    pad   :array [0..7] of byte;   //zipplet 20170204 - originally this was 1..8 for some reason\r
+  end;\r
+  \r
+  {$ifdef ipv6}\r
+    TLInetSockAddr6 = packed record\r
+      sin6_family: word;\r
+      sin6_port: word;\r
+      sin6_flowinfo: uint32;\r
+      sin6_addr: tin6_addr;\r
+      sin6_scope_id: uint32;\r
+    end;\r
+  {$endif}\r
+\r
+  //zipplet 20170204: I did not rename the unioned record. We might want to rename this to TLinetSockAddrv\r
+  TinetSockAddrv = packed record\r
+    case integer of\r
+      0: (InAddr:TLInetSockAddr4);\r
+      {$ifdef ipv6}\r
+      1: (InAddr6:TLInetSockAddr6);\r
+      {$endif}\r
+  end;\r
+  Pinetsockaddrv = ^Tinetsockaddrv;\r
+\r
+  type\r
+    tsockaddrin=TLInetSockAddr4;\r
+\r
+{\r
+bin IP list code, by beware\r
+while this is really just a string, on the interface side it must be treated\r
+as an opaque var which is passed as "var" when it needs to be modified}\r
+\r
+  tbiniplist=tbufferstring;\r
+\r
+function biniplist_new:tbiniplist;\r
+procedure biniplist_add(var l:tbiniplist;ip:tbinip);\r
+function biniplist_getcount(const l:tbiniplist):integer;\r
+function biniplist_get(const l:tbiniplist;index:integer):tbinip;\r
+procedure biniplist_set(var l:tbiniplist;index:integer;ip:tbinip);\r
+procedure biniplist_setcount(var l:tbiniplist;newlen:integer);\r
+procedure biniplist_free(var l:tbiniplist);\r
+procedure biniplist_addlist(var l:tbiniplist;const l2:tbiniplist);\r
+function biniplist_tostr(const l:tbiniplist):thostname;\r
+function isbiniplist(const l:tbiniplist):boolean;\r
+\r