Browse Source

+ OS/2 implementation of unit sockets

git-svn-id: trunk@101 -
Tomas Hajny 20 years ago
parent
commit
8e19280c79
4 changed files with 382 additions and 139 deletions
  1. 35 33
      rtl/os2/Makefile
  2. 5 1
      rtl/os2/Makefile.fpc
  3. 156 42
      rtl/os2/so32dll.pas
  4. 186 63
      rtl/os2/sockets.pas

+ 35 - 33
rtl/os2/Makefile

@@ -249,103 +249,103 @@ endif
 OBJPASDIR=$(RTL)/objpas
 OBJPASDIR=$(RTL)/objpas
 GRAPHDIR=$(INC)/graph
 GRAPHDIR=$(INC)/graph
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil
+override TARGET_UNITS+=$(SYSTEMUNIT) ctypes objpas macpas strings ports os2def doscalls moncalls kbdcalls moucalls viocalls pmbitmap pmwin pmgpi pmstddlg pmhelp pmdev pmspl pmshl pmwp pmwsock pmbidi dos crt objects printer matrix sysutils classes math typinfo varutils winsock charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs video mouse keyboard variants types rtlconst sysconst dateutil strutils convutil so32dll sockets
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_LOADERS+=prt0
 override TARGET_LOADERS+=prt0
@@ -1980,6 +1980,8 @@ pmshl$(PPUEXT) : pmshl.pas os2def$(PPUEXT) pmwin$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 pmwp$(PPUEXT) : pmwp.pas os2def$(PPUEXT) pmwin$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 pmwp$(PPUEXT) : pmwp.pas os2def$(PPUEXT) pmwin$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 pmwsock$(PPUEXT) : pmwsock.pas os2def$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 pmwsock$(PPUEXT) : pmwsock.pas os2def$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 winsock$(PPUEXT) : winsock.pas pmwsock$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 winsock$(PPUEXT) : winsock.pas pmwsock$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+so32dll$(PPUEXT) : so32dll.pas $(SYSTEMUNIT)$(PPUEXT)
+sockets$(PPUEXT) : sockets.pas so32dll$(PPUEXT) ctypes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 pmbidi$(PPUEXT) : pmbidi.pas os2def$(PPUEXT) pmwin$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 pmbidi$(PPUEXT) : pmbidi.pas os2def$(PPUEXT) pmwin$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 dynlibs$(PPUEXT) : $(INC)/dynlibs.pp doscalls$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 dynlibs$(PPUEXT) : $(INC)/dynlibs.pp doscalls$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 dos$(PPUEXT) : dos.pas $(INC)/filerec.inc $(INC)/textrec.inc strings$(PPUEXT) \
 dos$(PPUEXT) : dos.pas $(INC)/filerec.inc $(INC)/textrec.inc strings$(PPUEXT) \

+ 5 - 1
rtl/os2/Makefile.fpc

@@ -14,7 +14,7 @@ units=$(SYSTEMUNIT) ctypes objpas macpas strings \
       sysutils classes math typinfo varutils winsock \
       sysutils classes math typinfo varutils winsock \
       charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs \
       charset ucomplex cpu mmx getopts heaptrc lineinfo dynlibs \
       video mouse keyboard variants types rtlconst sysconst dateutil \
       video mouse keyboard variants types rtlconst sysconst dateutil \
-      strutils convutil
+      strutils convutil so32dll sockets
 rsts=math varutils typinfo variants pmhelp classes sysconst dateutil
 rsts=math varutils typinfo variants pmhelp classes sysconst dateutil
 
 
 [require]
 [require]
@@ -133,6 +133,10 @@ pmwsock$(PPUEXT) : pmwsock.pas os2def$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 
 
 winsock$(PPUEXT) : winsock.pas pmwsock$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 winsock$(PPUEXT) : winsock.pas pmwsock$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 
 
+so32dll$(PPUEXT) : so32dll.pas $(SYSTEMUNIT)$(PPUEXT)
+
+sockets$(PPUEXT) : sockets.pas so32dll$(PPUEXT) ctypes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+
 pmbidi$(PPUEXT) : pmbidi.pas os2def$(PPUEXT) pmwin$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 pmbidi$(PPUEXT) : pmbidi.pas os2def$(PPUEXT) pmwin$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 
 
 dynlibs$(PPUEXT) : $(INC)/dynlibs.pp doscalls$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 dynlibs$(PPUEXT) : $(INC)/dynlibs.pp doscalls$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)

+ 156 - 42
rtl/os2/so32dll.pas

@@ -2,6 +2,7 @@
     This file is part of the Free Pascal run time library.
     This file is part of the Free Pascal run time library.
     Copyright (c) 2000, 2001 by madded2 ([email protected]).
     Copyright (c) 2000, 2001 by madded2 ([email protected]).
     Copyright (c) 2002, 2004 Yuri Prokushev ([email protected]).
     Copyright (c) 2002, 2004 Yuri Prokushev ([email protected]).
+    Copyright (c) 2005 Soren Ager
 
 
     Interface to OS/2 32-bit sockets library
     Interface to OS/2 32-bit sockets library
 
 
@@ -37,6 +38,7 @@ interface
 
 
 {$MODE ObjFPC}
 {$MODE ObjFPC}
 {$ASMMODE Intel}
 {$ASMMODE Intel}
+{$PACKRECORDS 1}
 
 
 (***************************************************************************)
 (***************************************************************************)
 (*                                                                         *)
 (*                                                                         *)
@@ -1030,7 +1032,140 @@ type
     tv_usec  :  Longint; // Number of microseconds
     tv_usec  :  Longint; // Number of microseconds
   end;
   end;
 
 
+{
+ * ioctl & ip trace support
+}
+const
+  FIONREAD      = (Ord('f') SHL 8) OR 127;
+  FIONBIO       = (Ord('f') SHL 8) OR 126;
+
+  FIOASYNC      = (Ord('f') SHL 8) OR 125;
+  FIOTCPCKSUM   = (Ord('f') SHL 8) OR 128;
+  FIONSTATUS    = (Ord('f') SHL 8) OR 120;
+  FIONURG       = (Ord('f') SHL 8) OR 121;
+
+  SIOCSHIWAT    = (Ord('s') SHL 8) OR  0;
+  SIOCGHIWAT    = (Ord('s') SHL 8) OR  1;
+  SIOCSLOWAT    = (Ord('s') SHL 8) OR  2;
+  SIOCGLOWAT    = (Ord('s') SHL 8) OR  3;
+  SIOCATMARK    = (Ord('s') SHL 8) OR  7;
+  SIOCSPGRP     = (Ord('s') SHL 8) OR  8;
+  SIOCGPGRP     = (Ord('s') SHL 8) OR  9;
+  SIOCSHOSTID   = (Ord('s') SHL 8) OR 10;
+
+  SIOCADDRT     = (Ord('r') SHL 8) OR 10;
+  SIOCDELRT     = (Ord('r') SHL 8) OR 11;
+  SIOMETRIC1RT  = (Ord('r') SHL 8) OR 12;
+  SIOMETRIC2RT  = (Ord('r') SHL 8) OR 13;
+  SIOMETRIC3RT  = (Ord('r') SHL 8) OR 14;
+  SIOMETRIC4RT  = (Ord('r') SHL 8) OR 15;
+
+  SIOCREGADDNET = (Ord('r') SHL 8) OR 12;
+  SIOCREGDELNET = (Ord('r') SHL 8) OR 13;
+  SIOCREGROUTES = (Ord('r') SHL 8) OR 14;
+  SIOCFLUSHROUTES=(Ord('r') SHL 8) OR 15;
+
+  SIOCSIFADDR   = (Ord('i') SHL 8) OR 12;
+  SIOCGIFADDR   = (Ord('i') SHL 8) OR 13;
+  SIOCSIFDSTADDR= (Ord('i') SHL 8) OR 14;
+  SIOCGIFDSTADDR= (Ord('i') SHL 8) OR 15;
+  SIOCSIFFLAGS  = (Ord('i') SHL 8) OR 16;
+  SIOCGIFFLAGS  = (Ord('i') SHL 8) OR 17;
+  SIOCGIFBRDADDR= (Ord('i') SHL 8) OR 18;
+  SIOCSIFBRDADDR= (Ord('i') SHL 8) OR 19;
+  SIOCGIFCONF   = (Ord('i') SHL 8) OR 20;
+  SIOCGIFNETMASK= (Ord('i') SHL 8) OR 21;
+  SIOCSIFNETMASK= (Ord('i') SHL 8) OR 22;
+  SIOCGIFMETRIC = (Ord('i') SHL 8) OR 23;
+  SIOCSIFMETRIC = (Ord('i') SHL 8) OR 24;
+  SIOCSIFSETSIG = (Ord('i') SHL 8) OR 25;
+  SIOCSIFCLRSIG = (Ord('i') SHL 8) OR 26;
+  SIOCSIFBRD    = (Ord('i') SHL 8) OR 27; { SINGLE-rt bcst. using old # for bkw cmpt }
+  SIOCSIFALLRTB = (Ord('i') SHL 8) OR 63; { added to configure all-route broadcst }
+
+  SIOCGIFLOAD     =(Ord('i') SHL 8) OR 27;
+  SIOCSIFFILTERSRC=(Ord('i') SHL 8) OR 28;
+  SIOCGIFFILTERSRC=(Ord('i') SHL 8) OR 29;
+
+  SIOCSARP      = (Ord('i') SHL 8) OR 30;
+  SIOCGARP      = (Ord('i') SHL 8) OR 31;
+  SIOCDARP      = (Ord('i') SHL 8) OR 32;
+  SIOCSIFSNMPSIG= (Ord('i') SHL 8) OR 33;
+  SIOCSIFSNMPCLR= (Ord('i') SHL 8) OR 34;
+  SIOCSIFSNMPCRC= (Ord('i') SHL 8) OR 35;
+  SIOCSIFPRIORITY=(Ord('i') SHL 8) OR 36;
+  SIOCGIFPRIORITY=(Ord('i') SHL 8) OR 37;
+  SIOCSIFFILTERDST=(Ord('i') SHL 8) OR 38;
+  SIOCGIFFILTERDST=(Ord('i') SHL 8) OR 39;
+  SIOCSIF802_3  =  (Ord('i') SHL 8) OR 40;
+  SIOCSIFNO802_3=  (Ord('i') SHL 8) OR 41;
+  SIOCSIFNOREDIR=  (Ord('i') SHL 8) OR 42;
+  SIOCSIFYESREDIR= (Ord('i') SHL 8) OR 43;
+
+  SIOCSIFMTU    = (Ord('i') SHL 8) OR 45;
+  SIOCSIFFDDI   = (Ord('i') SHL 8) OR 46;
+  SIOCSIFNOFDDI = (Ord('i') SHL 8) OR 47;
+  SIOCSRDBRD    = (Ord('i') SHL 8) OR 48;
+  SIOCSARP_TR   = (Ord('i') SHL 8) OR 49;
+  SIOCGARP_TR   = (Ord('i') SHL 8) OR 50;
+
+{ multicast ioctls }
+  SIOCADDMULTI  = (Ord('i') SHL 8) OR 51;    { add m'cast addr }
+  SIOCDELMULTI  = (Ord('i') SHL 8) OR 52;    { del m'cast addr }
+  SIOCMULTISBC  = (Ord('i') SHL 8) OR 61;    { use broadcast to send IP multicast }
+  SIOCMULTISFA  = (Ord('i') SHL 8) OR 62;    { use functional addr to send IP multicast }
+
+
+{$IFDEF SLBOOTP}
+  SIOCGUNIT     = (Ord('i') SHL 8) OR 70;    { Used to retreive unit number on }
+                                             { serial interface }
+{$ENDIF}
+
+  SIOCSIFSPIPE   = (Ord('i') SHL 8) OR 71;   { used to set pipe size on interface }
+                                             { this is used as tcp send buffer size }
+  SIOCSIFRPIPE   = (Ord('i') SHL 8) OR 72;   { used to set pipe size on interface }
+                                             { this is used as tcp recv buffer size }
+  SIOCSIFTCPSEG = (Ord('i') SHL 8) OR 73;    { set the TCP segment size on interface }
+  SIOCSIFUSE576 = (Ord('i') SHL 8) OR 74;    { enable/disable the automatic change of mss to 576 }
+                                             { if going through a router }
+  SIOCGIFVALID  = (Ord('i') SHL 8) OR 75;    { to check if the interface is Valid or not }
+                                             { sk June 14 1995 }
+  SIOCGIFBOUND  = (Ord('i') SHL 8) OR 76;    { ioctl to return bound/shld bind ifs }
+{ Interface Tracing Support }
+  SIOCGIFEFLAGS = (Ord('i') SHL 8) OR 150;
+  SIOCSIFEFLAGS = (Ord('i') SHL 8) OR 151;
+  SIOCGIFTRACE  = (Ord('i') SHL 8) OR 152;
+  SIOCSIFTRACE  = (Ord('i') SHL 8) OR 153;
+
+{$IFDEF SLSTATS}
+  SIOCSSTAT    = (Ord('i') SHL 8) OR 154;
+  SIOCGSTAT    = (Ord('i') SHL 8) OR 155;
+{$ENDIF}
+
+{ NETSTAT stuff }
+  SIOSTATMBUF   = (Ord('n') SHL 8) OR 40;
+  SIOSTATTCP    = (Ord('n') SHL 8) OR 41;
+  SIOSTATUDP    = (Ord('n') SHL 8) OR 42;
+  SIOSTATIP     = (Ord('n') SHL 8) OR 43;
+  SIOSTATSO     = (Ord('n') SHL 8) OR 44;
+  SIOSTATRT     = (Ord('n') SHL 8) OR 45;
+  SIOFLUSHRT    = (Ord('n') SHL 8) OR 46;
+  SIOSTATICMP   = (Ord('n') SHL 8) OR 47;
+  SIOSTATIF     = (Ord('n') SHL 8) OR 48;
+  SIOSTATAT     = (Ord('n') SHL 8) OR 49;
+  SIOSTATARP    = (Ord('n') SHL 8) OR 50;
+  SIOSTATIF42   = (Ord('n') SHL 8) OR 51;
+
+(* From fpc 2.0.0
+  SIOCGIFFLAGS          =  $6900 + 17;  // get interface flags
 
 
+  { Interface Tracing Support }
+  SIOCGIFEFLAGS         =  $6900 + 150; // get interface enhanced flags
+  SIOCSIFEFLAGS         =  $6900 + 151; // set interface enhanced flags
+  SIOCGIFTRACE          =  $6900 + 152; // get interface trace data
+  SIOCSIFTRACE          =  $6900 + 153; // set interface trace data
+  { sorry, i skip other ioctl commands, see SYS\ioctl.h from toolkit for it.. }
+*)
 
 
 
 
 (* !!TODO Check all macros from sys/itypes.h
 (* !!TODO Check all macros from sys/itypes.h
@@ -1066,7 +1201,7 @@ function  getinetversion(var version):Longint; cdecl;
 function  sock_errno:Longint; cdecl;
 function  sock_errno:Longint; cdecl;
 
 
 { print last err string + str if not NIL }
 { print last err string + str if not NIL }
-procedure psock_errno(const str:PChar); cdecl;
+procedure psock_errno(var str:PChar); cdecl;
 
 
 
 
 { * sockets creation / close funcs }
 { * sockets creation / close funcs }
@@ -1096,10 +1231,10 @@ function  soabort(sock:Longint):Longint; cdecl;
 function accept(sock:Longint; var s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl;
 function accept(sock:Longint; var s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl;
 
 
 { bind a local name to the socket }
 { bind a local name to the socket }
-function bind(sock:Longint; const s_addr: sockaddr; s_addr_len:Longint):Longint; cdecl;
+function bind(sock:Longint; var s_addr: sockaddr; s_addr_len:Longint):Longint; cdecl;
 
 
 { connect socket to remote host }
 { connect socket to remote host }
-function connect(sock:Longint; const s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl;
+function connect(sock:Longint; var s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl;
 
 
 { listen on socket. max_conn - queue size of listen. }
 { listen on socket. max_conn - queue size of listen. }
 function listen(sock,max_conn:Longint):Longint; cdecl;
 function listen(sock,max_conn:Longint):Longint; cdecl;
@@ -1114,13 +1249,13 @@ function listen(sock,max_conn:Longint):Longint; cdecl;
 function recv(sock:Longint; var buf; buf_len,flags:Longint):Longint; cdecl;
 function recv(sock:Longint; var buf; buf_len,flags:Longint):Longint; cdecl;
 
 
 { send data to socket. ! return N of sent bytes. -1 - err }
 { send data to socket. ! return N of sent bytes. -1 - err }
-function  send(sock:Longint; const buf; buf_len,flags:Longint):Longint; cdecl;
+function  send(sock:Longint; var buf; buf_len,flags:Longint):Longint; cdecl;
 
 
 { read data from socket. ! return N of readed bytes, or 0 (closed) or -1 }
 { read data from socket. ! return N of readed bytes, or 0 (closed) or -1 }
 function  recvfrom(sock:Longint; var buf; buf_len,flags:Longint; var s_addr:sockaddr; var s_addr_len:Longint):Longint; cdecl;
 function  recvfrom(sock:Longint; var buf; buf_len,flags:Longint; var s_addr:sockaddr; var s_addr_len:Longint):Longint; cdecl;
 
 
 { send data to socket. ! return N of sent bytes. -1 - err }
 { send data to socket. ! return N of sent bytes. -1 - err }
-function  sendto(sock:Longint; const buf; buf_len,flags:Longint; var s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl;
+function  sendto(sock:Longint; var buf; buf_len,flags:Longint; var s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl;
 
 
 { read data into iov_count number of buffers iov.
 { read data into iov_count number of buffers iov.
   ! return N of readed bytes, or 0 (closed) or -1 }
   ! return N of readed bytes, or 0 (closed) or -1 }
@@ -1148,7 +1283,7 @@ function  sendmsg(sock:Longint; var msgbuf:msghdr; flags:Longint):Longint; cdecl
 function  os2_select(var sockets; N_reads, N_writes, N_exepts, timeout:Longint):Longint; cdecl;
 function  os2_select(var sockets; N_reads, N_writes, N_exepts, timeout:Longint):Longint; cdecl;
 
 
 { bsd select here. heavy voodoo.. }
 { bsd select here. heavy voodoo.. }
-function  select(nfds:Longint; const readfds,writefds,exceptfds:fd_set; const timeout:timeval):Longint; cdecl;
+function  select(nfds:Longint; var readfds,writefds,exceptfds:fd_set; var timeout:timeval):Longint; cdecl;
 
 
 (***************************************************************************)
 (***************************************************************************)
 (*                                                                         *)
 (*                                                                         *)
@@ -1175,7 +1310,7 @@ function getsockname(sock:Longint; var s_addr:sockaddr; var s_addr_len:Longint):
 function getsockopt(sock,level,optname:Longint; var buf; var buf_len:Longint):Longint; cdecl;
 function getsockopt(sock,level,optname:Longint; var buf; var buf_len:Longint):Longint; cdecl;
 
 
 { set socket options }
 { set socket options }
-function  setsockopt(sock,level,optname:Longint; const buf; buf_len:Longint):Longint; cdecl;
+function  setsockopt(sock,level,optname:Longint; var buf; buf_len:Longint):Longint; cdecl;
 
 
 { f@$king ioctl. use sys/ioctl.h }
 { f@$king ioctl. use sys/ioctl.h }
 function os2_ioctl(sock,cmd:Longint; var data; data_len:Longint):Longint; cdecl;
 function os2_ioctl(sock,cmd:Longint; var data; data_len:Longint):Longint; cdecl;
@@ -1208,8 +1343,8 @@ asm
 end;
 end;
 
 
 function accept(sock:Longint; var s_addr: sockaddr; s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 1;
 function accept(sock:Longint; var s_addr: sockaddr; s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 1;
-function bind(sock:Longint; const s_addr: sockaddr; s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 2;
-function connect(sock:Longint; const s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 3;
+function bind(sock:Longint; var s_addr: sockaddr; s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 2;
+function connect(sock:Longint; var s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 3;
 function gethostid: Longint; cdecl; external 'SO32DLL' index 4;
 function gethostid: Longint; cdecl; external 'SO32DLL' index 4;
 function getpeername(sock:Longint; var s_addr:sockaddr; var s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 5;
 function getpeername(sock:Longint; var s_addr:sockaddr; var s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 5;
 function getsockname(sock:Longint; var s_addr:sockaddr; var s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 6;
 function getsockname(sock:Longint; var s_addr:sockaddr; var s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 6;
@@ -1219,9 +1354,9 @@ function listen(sock,max_conn:Longint):Longint; cdecl; external 'SO32DLL' index
 function recv(sock:Longint; var buf; buf_len,flags:Longint):Longint; cdecl; external 'SO32DLL' index 10;
 function recv(sock:Longint; var buf; buf_len,flags:Longint):Longint; cdecl; external 'SO32DLL' index 10;
 function  recvfrom(sock:Longint; var buf; buf_len,flags:Longint;var s_addr:sockaddr; var s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 11;
 function  recvfrom(sock:Longint; var buf; buf_len,flags:Longint;var s_addr:sockaddr; var s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 11;
 function  os2_select(var sockets; N_reads, N_writes, N_exepts, timeout:Longint):Longint; cdecl; external 'SO32DLL' index 12;
 function  os2_select(var sockets; N_reads, N_writes, N_exepts, timeout:Longint):Longint; cdecl; external 'SO32DLL' index 12;
-function  send(sock:Longint; const buf; buf_len,flags:Longint):Longint; cdecl; external 'SO32DLL' index 13;
-function  sendto(sock:Longint; const buf; buf_len,flags:Longint;var s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 14;
-function  setsockopt(sock,level,optname:Longint; const buf; buf_len:Longint):Longint; cdecl; external 'SO32DLL' index 15;
+function  send(sock:Longint; var buf; buf_len,flags:Longint):Longint; cdecl; external 'SO32DLL' index 13;
+function  sendto(sock:Longint; var buf; buf_len,flags:Longint;var s_addr:sockaddr; s_addr_len:Longint):Longint; cdecl; external 'SO32DLL' index 14;
+function  setsockopt(sock,level,optname:Longint; var buf; buf_len:Longint):Longint; cdecl; external 'SO32DLL' index 15;
 function  socket(domain,stype,protocol:Longint):Longint; cdecl; external 'SO32DLL' index 16;
 function  socket(domain,stype,protocol:Longint):Longint; cdecl; external 'SO32DLL' index 16;
 function  soclose(sock:Longint):Longint; cdecl; external 'SO32DLL' index 17;
 function  soclose(sock:Longint):Longint; cdecl; external 'SO32DLL' index 17;
 function  so_cancel(sock:Longint):Longint; cdecl; external 'SO32DLL' index 18;
 function  so_cancel(sock:Longint):Longint; cdecl; external 'SO32DLL' index 18;
@@ -1236,31 +1371,33 @@ function  sock_init:Longint; cdecl; external 'SO32DLL' index 26;
 function  addsockettolist(sock:Longint):Longint; cdecl; external 'SO32DLL' index 27;
 function  addsockettolist(sock:Longint):Longint; cdecl; external 'SO32DLL' index 27;
 function  removesocketfromlist(sock:Longint):Longint; cdecl; external 'SO32DLL' index 28;
 function  removesocketfromlist(sock:Longint):Longint; cdecl; external 'SO32DLL' index 28;
 { entry 29 not used }
 { entry 29 not used }
-procedure psock_errno(const str:PChar); cdecl; external 'SO32DLL' index 30;
+procedure psock_errno(var str:PChar); cdecl; external 'SO32DLL' index 30;
 function  getinetversion(var version):Longint; cdecl; external 'SO32DLL' index 31;
 function  getinetversion(var version):Longint; cdecl; external 'SO32DLL' index 31;
 function  select(nfds:Longint;
 function  select(nfds:Longint;
-                 const readfds,writefds,exceptfds:fd_set;
-                 const timeout:timeval):Longint; cdecl; external 'SO32DLL' index 32;
+                 var readfds,writefds,exceptfds:fd_set;
+                 var timeout:timeval):Longint; cdecl; external 'SO32DLL' index 32;
 
 
 
 
 function  htonl(a:Longint):Longint;
 function  htonl(a:Longint):Longint;
-begin   Result:=LSwap(a);   end;
+begin   htonl:=LSwap(a);   end;
 { host -> network for long (4 bytes) }
 { host -> network for long (4 bytes) }
 
 
 function  ntohl(a:Longint):Longint;
 function  ntohl(a:Longint):Longint;
-begin   Result:=LSwap(a);   end;
+begin   ntohl:=LSwap(a);   end;
 { network -> host for long (4 bytes) }
 { network -> host for long (4 bytes) }
 
 
 function  htons(a:Word):Word;
 function  htons(a:Word):Word;
-begin   Result:=WSwap(a);   end;
+begin   htons:=WSwap(a);   end;
 { host -> network for small (2 bytes) }
 { host -> network for small (2 bytes) }
 
 
 function  ntohs(a:Word):Word;
 function  ntohs(a:Word):Word;
-begin   Result:=WSwap(a);   end;
+begin   ntohs:=WSwap(a);   end;
 { network -> host for small (2 bytes) }
 { network -> host for small (2 bytes) }
 
 
 end.
 end.
+
 (* !!TODO   Following code not revised as yet
 (* !!TODO   Following code not revised as yet
+
 {*
 {*
  * User-settable options (used with setsockopt).
  * User-settable options (used with setsockopt).
  *}
  *}
@@ -1272,10 +1409,6 @@ end.
   TCP_CC         = $06;    // RFC 1644 (Connection Count)
   TCP_CC         = $06;    // RFC 1644 (Connection Count)
 
 
 
 
-
-
-
-
 {
 {
  * Structures returned by network data base library.  All addresses are
  * Structures returned by network data base library.  All addresses are
  * supplied in host order, and returned in network order (suitable for
  * supplied in host order, and returned in network order (suitable for
@@ -1335,19 +1468,7 @@ type
 
 
   pservent = ^servent;
   pservent = ^servent;
 
 
-{
- * ioctl & ip trace support
-}
 const
 const
-  SIOCGIFFLAGS          =  $6900 + 17;  // get interface flags
-
-  { Interface Tracing Support }
-  SIOCGIFEFLAGS         =  $6900 + 150; // get interface enhanced flags
-  SIOCSIFEFLAGS         =  $6900 + 151; // set interface enhanced flags
-  SIOCGIFTRACE          =  $6900 + 152; // get interface trace data
-  SIOCSIFTRACE          =  $6900 + 153; // set interface trace data
-  { sorry, i skip other ioctl commands, see SYS\ioctl.h from toolkit for it.. }
-
   IFF_UP                =  $1;          // interface is up
   IFF_UP                =  $1;          // interface is up
   IFF_BROADCAST         =  $2;          // broadcast address valid
   IFF_BROADCAST         =  $2;          // broadcast address valid
   IFF_DEBUG             =  $4;          // turn on debugging
   IFF_DEBUG             =  $4;          // turn on debugging
@@ -1575,10 +1696,3 @@ const
 ³ 00039 ³ GETSOCKETFROMLIST
 ³ 00039 ³ GETSOCKETFROMLIST
 À´Done
 À´Done
 *)
 *)
-
-{
-  $Log: so32dll.pas,v $
-  Revision 1.3  2005/02/14 17:13:31  peter
-    * truncate log
-
-}

+ 186 - 63
rtl/os2/sockets.pas

@@ -1,6 +1,7 @@
 {
 {
     This file is part of the Free Pascal run time library.
     This file is part of the Free Pascal run time library.
     Copyright (c) 2002 Yuri Prokushev
     Copyright (c) 2002 Yuri Prokushev
+    Copyright (c) 2005 Soren Ager
 
 
     Sockets implementation for OS/2
     Sockets implementation for OS/2
 
 
@@ -14,15 +15,16 @@
  **********************************************************************}
  **********************************************************************}
 
 
 {$MODE ObjFPC}
 {$MODE ObjFPC}
+{ $DEFINE notUnix}      // To make ssockets.pp compile
 unit Sockets;
 unit Sockets;
 
 
 Interface
 Interface
 
 
 Uses
 Uses
-  so32dll;
+  so32dll,ctypes;
 
 
 Const
 Const
-  AF_LOCAL       = so32dll.AF_LOCAL;
+//  AF_LOCAL       = so32dll.AF_LOCAL;
   AF_OS2         = so32dll.AF_OS2;
   AF_OS2         = so32dll.AF_OS2;
   AF_IMPLINK     = so32dll.AF_IMPLINK;     // arpanet imp addresses
   AF_IMPLINK     = so32dll.AF_IMPLINK;     // arpanet imp addresses
   AF_PUP         = so32dll.AF_PUP;         // pup protocols: e.g. BSP
   AF_PUP         = so32dll.AF_PUP;         // pup protocols: e.g. BSP
@@ -59,7 +61,7 @@ Const
 
 
   AF_MAX         = so32dll.AF_MAX;
   AF_MAX         = so32dll.AF_MAX;
 
 
-  PF_LOCAL     = so32dll.PF_LOCAL;
+//  PF_LOCAL     = so32dll.PF_LOCAL;
   PF_OS2       = so32dll.PF_OS2;
   PF_OS2       = so32dll.PF_OS2;
   PF_IMPLINK   = so32dll.PF_IMPLINK;
   PF_IMPLINK   = so32dll.PF_IMPLINK;
   PF_PUP       = so32dll.PF_PUP;
   PF_PUP       = so32dll.PF_PUP;
@@ -92,6 +94,17 @@ Const
   PF_MAX       = so32dll.PF_MAX;
   PF_MAX       = so32dll.PF_MAX;
 
 
 
 
+Type
+  cushort=word;
+  cuint16=word;
+  cuint32=cardinal;
+  size_t =cuint32;
+  ssize_t=cuint16;
+  cint   =longint;
+  pcint  =^cint;
+  tsocklen=cint;
+  psocklen=^tsocklen;
+
 // OS/2 stack based on BSD stack
 // OS/2 stack based on BSD stack
 {$DEFINE BSD}
 {$DEFINE BSD}
 {$I socketsh.inc}
 {$I socketsh.inc}
@@ -117,20 +130,12 @@ end;
 
 
 Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
 Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
 begin
 begin
-  Send:=so32dll.Send(Sock,Buf,BufLen,Flags);
-  if Send<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
+  Send:=fpSend(Sock,@Buf,BufLen,Flags);
 end;
 end;
 
 
 Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
 Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
 begin
 begin
-  SendTo:=so32dll.SendTo(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
-  if SendTo<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
+  SendTo:=fpSendTo(Sock,@Buf,BufLen,Flags,@Addr,AddrLen);
 end;
 end;
 
 
 Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
 Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
@@ -142,9 +147,7 @@ begin
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-
-Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; AddrLen : Integer) : longint;
-
+Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longInt) : longint;
 begin
 begin
   RecvFrom:=so32dll.RecvFrom(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
   RecvFrom:=so32dll.RecvFrom(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
   if RecvFrom<0 then
   if RecvFrom<0 then
@@ -154,20 +157,8 @@ begin
 end;
 end;
 
 
 Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
 Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
-var
-  l : longint;
 begin
 begin
-  l:=so32dll.Bind(Sock,so32dll.sockaddr(Addr),AddrLen);
-  if l<0 then
-    begin
-       SocketError:=so32dll.sock_errno;
-       Bind:=false;
-    end
-  else
-    begin
-       SocketError:=0;
-       Bind:=true;
-    end;
+  Bind:=fpBind(Sock,@Addr,AddrLen)=0;
 end;
 end;
 
 
 Function Listen(Sock,MaxConnect:Longint):Boolean;
 Function Listen(Sock,MaxConnect:Longint):Boolean;
@@ -176,15 +167,14 @@ var
 begin
 begin
   l:=so32dll.Listen(Sock,MaxConnect);
   l:=so32dll.Listen(Sock,MaxConnect);
   if l<0 then
   if l<0 then
-    begin
-       SocketError:=so32dll.sock_errno;
-       Listen:=false;
-    end
-  else
-    begin
-       SocketError:=0;
-       Listen:=true;
-    end;
+  begin
+    SocketError:=so32dll.sock_errno;
+    Listen:=false;
+  end else
+  begin
+    SocketError:=0;
+    Listen:=true;
+  end;
 end;
 end;
 
 
 Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
 Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
@@ -196,13 +186,9 @@ begin
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
+Function Connect(Sock:Longint;const Addr; Addrlen:Longint):Boolean;
 begin
 begin
-  Connect:=so32dll.Connect(Sock,so32dll.SockAddr(Addr),AddrLen)=0;
-  if not Connect then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
+  Connect:=fpConnect(Sock,@Addr,AddrLen)=0;
 end;
 end;
 
 
 Function Shutdown(Sock:Longint;How:Longint):Longint;
 Function Shutdown(Sock:Longint;How:Longint):Longint;
@@ -234,11 +220,7 @@ end;
 
 
 Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
 Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
 begin
 begin
-  SetSocketOptions:=so32dll.SetSockOpt(Sock,Level,OptName,OptVal,OptLen);
-  if SetSocketOptions<0 then
-    SocketError:=so32dll.sock_errno
-  else
-    SocketError:=0;
+  SetSocketOptions:=fpSetSockOpt(Sock,Level,OptName,@OptVal,OptLen);
 end;
 end;
 
 
 Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
 Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
@@ -252,17 +234,17 @@ end;
 
 
 Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
 Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
 begin
 begin
-
 {!!TODO!!
 {!!TODO!!
   SocketPair:=so32dll.socketpair(Domain,SocketType,Protocol,Pair);}
   SocketPair:=so32dll.socketpair(Domain,SocketType,Protocol,Pair);}
   //SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
   //SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
+  SocketPair:=-1;
 end;
 end;
 
 
 { mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
 { mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
 function fdWrite(handle : longint;Const bufptr;size : dword) : dword;
 function fdWrite(handle : longint;Const bufptr;size : dword) : dword;
 begin
 begin
-  fdWrite := so32dll.send(handle, bufptr, size, 0);
-  if fdWrite = -1 then
+  fdWrite := dword(fpsend(handle, @bufptr, size, 0));
+  if fdWrite = dword(-1) then
   begin
   begin
     SocketError := so32dll.sock_errno;
     SocketError := so32dll.sock_errno;
     fdWrite := 0;
     fdWrite := 0;
@@ -275,31 +257,172 @@ function fdRead(handle : longint;var bufptr;size : dword) : dword;
 var
 var
   d : dword;
   d : dword;
 begin
 begin
-{!!TODO!!
-  if so32dll.ioctlsocket(handle,FIONREAD,@d) = -1 then
+  d:=dword(so32dll.os2_ioctl(handle,FIONREAD,d,SizeOf(d)));
+  if d=dword(-1) then
   begin
   begin
     SocketError:=so32dll.sock_errno;
     SocketError:=so32dll.sock_errno;
     fdRead:=0;
     fdRead:=0;
-    exit;
-  end;
-}
-  if d>0 then
+  end else
   begin
   begin
     if size>d then
     if size>d then
-    size:=d;
-    fdRead := so32dll.recv(handle, bufptr, size, 0);
-    if fdRead = -1 then
+      size:=d;
+    fdRead := dword(so32dll.recv(handle, bufptr, size, 0));
+    if fdRead = dword(-1) then
     begin
     begin
       SocketError:= so32dll.sock_errno;
       SocketError:= so32dll.sock_errno;
       fdRead := 0;
       fdRead := 0;
     end else
     end else
       SocketError:=0;
       SocketError:=0;
-  end
+  end;
+end;
+
+{$i sockets.inc}
+
+function fpsocket       (domain:cint; xtype:cint; protocol: cint):cint;
+begin
+  fpSocket:=so32dll.Socket(Domain,xtype,ProtoCol);
+  if fpSocket<0 then
+    SocketError:=so32dll.sock_errno
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-{$i sockets.inc}
+function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
+begin
+  fpSend:=so32dll.Send(S,msg^,len,flags);
+  if fpSend<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
+begin
+  // Dubious construct, this should be checked. (IPV6 fails ?)
+  fpSendTo:=so32dll.SendTo(S,msg^,Len,Flags,so32dll.SockAddr(tox^),toLen);
+  if fpSendTo<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fprecv         (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
+begin
+  fpRecv:=so32dll.Recv(S,Buf,Len,Flags);
+  if fpRecv<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
+begin
+  fpRecvFrom:=so32dll.RecvFrom(S,Buf,Len,Flags,so32dll.SockAddr(from^),FromLen^);
+  if fpRecvFrom<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
+begin
+  fpConnect:=so32dll.Connect(S,so32dll.SockAddr(name^),nameLen);
+  if fpConnect<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpshutdown     (s:cint; how:cint):cint;
+begin
+  fpShutDown:=so32dll.ShutDown(S,How);
+  if fpShutDown<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
+begin
+  fpbind:=so32dll.Bind(S,so32dll.SockAddr(Addrx^),AddrLen);
+  if fpbind<0 then
+       SocketError:=so32dll.sock_errno
+  else
+       SocketError:=0;
+end;
+
+function fplisten      (s:cint; backlog : cint):cint;
+begin
+  fplisten:=so32dll.Listen(S,backlog);
+  if fplisten<0 then
+       SocketError:=so32dll.sock_errno
+  else
+       SocketError:=0;
+end;
+
+function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
+begin
+  fpAccept:=so32dll.Accept(S,so32dll.SockAddr(Addrx^),longint(@AddrLen));
+  if fpAccept<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
+begin
+  fpGetSockName:=so32dll.GetSockName(S,so32dll.SockAddr(name^),nameLen^);
+  if fpGetSockName<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
+begin
+  fpGetPeerName:=so32dll.GetPeerName(S,so32dll.SockAddr(name^),NameLen^);
+  if fpGetPeerName<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
+begin
+  fpGetSockOpt:=so32dll.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
+  if fpGetSockOpt<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
+begin
+  fpSetSockOpt:=so32dll.SetSockOpt(S,Level,OptName,OptVal,OptLen);
+  if fpSetSockOpt<0 then
+    SocketError:=so32dll.sock_errno
+  else
+    SocketError:=0;
+end;
+
+function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
+begin
+  fpsocketpair:=-1;
+end;
+
+Function CloseSocket(Sock:Longint):Longint;
+begin
+  CloseSocket:=so32dll.soclose (Sock);
+  if CloseSocket<>0 then
+  begin
+    SocketError:=so32dll.sock_errno;
+  end else
+  begin
+    CloseSocket := 0;
+    SocketError := 0;
+  end;
+end;
+
 
 
 Begin
 Begin
   so32dll.sock_init;
   so32dll.sock_init;