sockets.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2002 Yuri Prokushev
  4. Copyright (c) 2005 Soren Ager
  5. Sockets implementation for OS/2
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$MODE ObjFPC}
  13. { $DEFINE notUnix} // To make ssockets.pp compile
  14. unit Sockets;
  15. Interface
  16. Uses
  17. so32dll,ctypes;
  18. Const
  19. // AF_LOCAL = so32dll.AF_LOCAL;
  20. AF_UNSPEC = so32dll.AF_UNSPEC;
  21. AF_LOCAL = so32dll.AF_LOCAL;
  22. AF_UNIX = so32dll.AF_UNIX;
  23. AF_OS2 = so32dll.AF_OS2;
  24. AF_IMPLINK = so32dll.AF_IMPLINK; // arpanet imp addresses
  25. AF_PUP = so32dll.AF_PUP; // pup protocols: e.g. BSP
  26. AF_CHAOS = so32dll.AF_CHAOS; // mit CHAOS protocols
  27. AF_NS = so32dll.AF_NS; // XEROX NS protocols
  28. AF_ISO = so32dll.AF_ISO; // ISO protocols
  29. AF_OSI = so32dll.AF_OSI;
  30. AF_ECMA = so32dll.AF_ECMA; // european computer manufacturers
  31. AF_DATAKIT = so32dll.AF_DATAKIT; // datakit protocols
  32. AF_CCITT = so32dll.AF_CCITT; // CCITT protocols, X.25 etc
  33. AF_SNA = so32dll.AF_SNA; // IBM SNA
  34. AF_DECnet = so32dll.AF_DECnet; // DECnet
  35. AF_DLI = so32dll.AF_DLI; // DEC Direct data link interface
  36. AF_LAT = so32dll.AF_LAT; // LAT
  37. AF_HYLINK = so32dll.AF_HYLINK; // NSC Hyperchannel
  38. AF_APPLETALK = so32dll.AF_APPLETALK; // Apple Talk
  39. AF_NB = so32dll.AF_NB; // Netbios
  40. AF_NETBIOS = so32dll.AF_NETBIOS; // Netbios
  41. AF_LINK = so32dll.AF_LINK; // Link layer interface
  42. pseudo_AF_XTP = so32dll.pseudo_AF_XTP; // eXpress Transfer Protocol (no AF)
  43. AF_COIP = so32dll.AF_COIP; // connection-oriented IP, aka ST II
  44. AF_CNT = so32dll.AF_CNT; // Computer Network Technology
  45. pseudo_AF_RTIP = so32dll.pseudo_AF_RTIP; // Help Identify RTIP packets
  46. AF_IPX = so32dll.AF_IPX; // Novell Internet Protocol
  47. AF_SIP = so32dll.AF_SIP; // Simple Internet Protocol
  48. AF_INET6 = so32dll.AF_INET6;
  49. pseudo_AF_PIP = so32dll.pseudo_AF_PIP; // Help Identify PIP packets
  50. AF_ROUTE = so32dll.AF_ROUTE; // Internal Routing Protocol
  51. AF_FWIP = so32dll.AF_FWIP; // firewall support
  52. AF_IPSEC = so32dll.AF_IPSEC; // IPSEC and encryption techniques
  53. AF_DES = so32dll.AF_DES; // DES
  54. AF_MD5 = so32dll.AF_MD5;
  55. AF_CDMF = so32dll.AF_CDMF;
  56. AF_MAX = so32dll.AF_MAX;
  57. // PF_LOCAL = so32dll.PF_LOCAL;
  58. PF_OS2 = so32dll.PF_OS2;
  59. PF_IMPLINK = so32dll.PF_IMPLINK;
  60. PF_PUP = so32dll.PF_PUP;
  61. PF_CHAOS = so32dll.PF_CHAOS;
  62. PF_NS = so32dll.PF_NS;
  63. PF_ISO = so32dll.PF_ISO;
  64. PF_OSI = so32dll.PF_OSI;
  65. PF_ECMA = so32dll.PF_ECMA;
  66. PF_DATAKIT = so32dll.PF_DATAKIT;
  67. PF_CCITT = so32dll.PF_CCITT;
  68. PF_SNA = so32dll.PF_SNA;
  69. PF_DECnet = so32dll.PF_DECnet;
  70. PF_DLI = so32dll.PF_DLI;
  71. PF_LAT = so32dll.PF_LAT;
  72. PF_HYLINK = so32dll.PF_HYLINK;
  73. PF_APPLETALK = so32dll.PF_APPLETALK;
  74. PF_NETBIOS = so32dll.PF_NB;
  75. PF_NB = so32dll.PF_NB;
  76. PF_ROUTE = so32dll.PF_ROUTE;
  77. PF_LINK = so32dll.PF_LINK;
  78. PF_XTP = so32dll.PF_XTP; // really just proto family, no AF
  79. PF_COIP = so32dll.PF_COIP;
  80. PF_CNT = so32dll.PF_CNT;
  81. PF_SIP = so32dll.PF_SIP;
  82. PF_INET6 = so32dll.PF_INET6;
  83. PF_IPX = so32dll.PF_IPX; // same format as AF_NS
  84. PF_RTIP = so32dll.PF_RTIP; // same format as AF_INET
  85. PF_PIP = so32dll.PF_PIP;
  86. PF_MAX = so32dll.PF_MAX;
  87. const EsockEINTR = SOCEINTR;
  88. EsockEBADF = SOCEBADF;
  89. EsockEFAULT = SOCEFAULT;
  90. EsockEINVAL = SOCEINVAL;
  91. EsockEACCESS = SOCEACCES;
  92. EsockEMFILE = SOCEMFILE;
  93. EsockEMSGSIZE = SOCEMSGSIZE;
  94. EsockENOBUFS = SOCENOBUFS;
  95. EsockENOTCONN = SOCENOTCONN;
  96. EsockENOTSOCK = SOCENOTSOCK;
  97. EsockEPROTONOSUPPORT = SOCEPROTONOSUPPORT;
  98. EsockEWOULDBLOCK = SOCEWOULDBLOCK;
  99. Type
  100. cushort=word;
  101. cuint16=word;
  102. cuint32=cardinal;
  103. size_t =cuint32;
  104. ssize_t=cuint16;
  105. cint =longint;
  106. pcint =^cint;
  107. tsocklen=cint;
  108. psocklen=^tsocklen;
  109. // OS/2 stack based on BSD stack
  110. {$DEFINE BSD}
  111. {$I socketsh.inc}
  112. INVALID_SOCKET = TSocket(not(0));
  113. SOCKET_ERROR = -1;
  114. Implementation
  115. {Include filerec and textrec structures}
  116. {$I filerec.inc}
  117. {$I textrec.inc}
  118. {******************************************************************************
  119. Basic Socket Functions
  120. ******************************************************************************}
  121. function SocketError: cint;
  122. begin
  123. SocketError := so32dll.Sock_ErrNo;
  124. end;
  125. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  126. begin
  127. Socket:=so32dll.Socket(Domain,SocketType,ProtoCol);
  128. end;
  129. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  130. begin
  131. Send:=fpSend(Sock,@Buf,BufLen,Flags);
  132. end;
  133. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  134. begin
  135. SendTo:=fpSendTo(Sock,@Buf,BufLen,Flags,@Addr,AddrLen);
  136. end;
  137. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  138. begin
  139. Recv:=so32dll.Recv(Sock,Buf,BufLen,Flags);
  140. end;
  141. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longInt) : longint;
  142. begin
  143. RecvFrom:=so32dll.RecvFrom(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
  144. end;
  145. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  146. begin
  147. Bind:=fpBind(Sock,@Addr,AddrLen)=0;
  148. end;
  149. Function Listen(Sock,MaxConnect:Longint):Boolean;
  150. begin
  151. Listen := so32dll.Listen(Sock,MaxConnect) = 0;
  152. end;
  153. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  154. begin
  155. Accept:=so32dll.Accept(Sock,so32dll.SockAddr(Addr), AddrLen);
  156. end;
  157. Function Connect(Sock:Longint;const Addr; Addrlen:Longint):Boolean;
  158. begin
  159. Connect:=fpConnect(Sock,@Addr,AddrLen)=0;
  160. end;
  161. Function Shutdown(Sock:Longint;How:Longint):Longint;
  162. begin
  163. ShutDown:=so32dll.ShutDown(Sock,How);
  164. end;
  165. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  166. begin
  167. GetSocketName:=so32dll.GetSockName(Sock, so32dll.SockAddr(Addr),AddrLen);
  168. end;
  169. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  170. begin
  171. GetPeerName:=so32dll.GetPeerName(Sock,so32dll.SockAddr(Addr),AddrLen);
  172. end;
  173. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  174. begin
  175. SetSocketOptions:=fpSetSockOpt(Sock,Level,OptName,@OptVal,OptLen);
  176. end;
  177. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  178. begin
  179. GetSocketOptions:=so32dll.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
  180. end;
  181. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  182. begin
  183. {!!TODO!!
  184. SocketPair:=so32dll.socketpair(Domain,SocketType,Protocol,Pair);}
  185. //SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  186. SocketPair:=-1;
  187. end;
  188. { mimic the linux fpWrite/fpRead calls for the file/text socket wrapper }
  189. function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
  190. begin
  191. fpWrite := dword(fpsend(handle, @bufptr, size, 0));
  192. if fpWrite = dword(-1) then
  193. fpWrite := 0;
  194. end;
  195. function fpRead(handle : longint;var bufptr;size : dword) : dword;
  196. var
  197. d : dword;
  198. begin
  199. d:=dword(so32dll.os2_ioctl(handle,FIONREAD,d,SizeOf(d)));
  200. if d=dword(-1) then
  201. fpRead:=0
  202. else
  203. begin
  204. if size>d then
  205. size:=d;
  206. fpRead := dword(so32dll.recv(handle, bufptr, size, 0));
  207. if fpRead = dword(-1) then
  208. fpRead := 0
  209. end;
  210. end;
  211. {$i sockets.inc}
  212. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  213. begin
  214. fpSocket:=so32dll.Socket(Domain,xtype,ProtoCol);
  215. end;
  216. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  217. begin
  218. fpSend:=so32dll.Send(S,msg^,len,flags);
  219. end;
  220. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  221. begin
  222. // Dubious construct, this should be checked. (IPV6 fails ?)
  223. fpSendTo:=so32dll.SendTo(S,msg^,Len,Flags,so32dll.SockAddr(tox^),toLen);
  224. end;
  225. function fprecv (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
  226. begin
  227. fpRecv:=so32dll.Recv(S,Buf,Len,Flags);
  228. end;
  229. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  230. begin
  231. fpRecvFrom:=so32dll.RecvFrom(S,Buf,Len,Flags,so32dll.SockAddr(from^),FromLen^);
  232. end;
  233. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  234. begin
  235. fpConnect:=so32dll.Connect(S,so32dll.SockAddr(name^),nameLen);
  236. end;
  237. function fpshutdown (s:cint; how:cint):cint;
  238. begin
  239. fpShutDown:=so32dll.ShutDown(S,How);
  240. end;
  241. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  242. begin
  243. fpbind:=so32dll.Bind(S,so32dll.SockAddr(Addrx^),AddrLen);
  244. end;
  245. function fplisten (s:cint; backlog : cint):cint;
  246. begin
  247. fplisten:=so32dll.Listen(S,backlog);
  248. end;
  249. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  250. begin
  251. fpAccept:=so32dll.Accept(S,so32dll.SockAddr(Addrx^),longint(@AddrLen));
  252. end;
  253. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  254. begin
  255. fpGetSockName:=so32dll.GetSockName(S,so32dll.SockAddr(name^),nameLen^);
  256. end;
  257. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  258. begin
  259. fpGetPeerName:=so32dll.GetPeerName(S,so32dll.SockAddr(name^),NameLen^);
  260. end;
  261. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  262. begin
  263. fpGetSockOpt:=so32dll.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
  264. end;
  265. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
  266. begin
  267. fpSetSockOpt:=so32dll.SetSockOpt(S,Level,OptName,OptVal,OptLen);
  268. end;
  269. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  270. begin
  271. fpsocketpair:=-1;
  272. end;
  273. Function CloseSocket(Sock:Longint):Longint;
  274. begin
  275. CloseSocket:=so32dll.soclose (Sock);
  276. end;
  277. Begin
  278. so32dll.sock_init;
  279. End.