sockets.pas 10 KB

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