sockets.pas 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 2002 Yuri Prokushev
  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. unit Sockets;
  14. Interface
  15. Uses
  16. so32dll;
  17. Const
  18. AF_LOCAL = so32dll.AF_LOCAL;
  19. AF_OS2 = so32dll.AF_OS2;
  20. AF_IMPLINK = so32dll.AF_IMPLINK; // arpanet imp addresses
  21. AF_PUP = so32dll.AF_PUP; // pup protocols: e.g. BSP
  22. AF_CHAOS = so32dll.AF_CHAOS; // mit CHAOS protocols
  23. AF_NS = so32dll.AF_NS; // XEROX NS protocols
  24. AF_ISO = so32dll.AF_ISO; // ISO protocols
  25. AF_OSI = so32dll.AF_OSI;
  26. AF_ECMA = so32dll.AF_ECMA; // european computer manufacturers
  27. AF_DATAKIT = so32dll.AF_DATAKIT; // datakit protocols
  28. AF_CCITT = so32dll.AF_CCITT; // CCITT protocols, X.25 etc
  29. AF_SNA = so32dll.AF_SNA; // IBM SNA
  30. AF_DECnet = so32dll.AF_DECnet; // DECnet
  31. AF_DLI = so32dll.AF_DLI; // DEC Direct data link interface
  32. AF_LAT = so32dll.AF_LAT; // LAT
  33. AF_HYLINK = so32dll.AF_HYLINK; // NSC Hyperchannel
  34. AF_APPLETALK = so32dll.AF_APPLETALK; // Apple Talk
  35. AF_NB = so32dll.AF_NB; // Netbios
  36. AF_NETBIOS = so32dll.AF_NETBIOS; // Netbios
  37. AF_LINK = so32dll.AF_LINK; // Link layer interface
  38. pseudo_AF_XTP = so32dll.pseudo_AF_XTP; // eXpress Transfer Protocol (no AF)
  39. AF_COIP = so32dll.AF_COIP; // connection-oriented IP, aka ST II
  40. AF_CNT = so32dll.AF_CNT; // Computer Network Technology
  41. pseudo_AF_RTIP = so32dll.pseudo_AF_RTIP; // Help Identify RTIP packets
  42. AF_IPX = so32dll.AF_IPX; // Novell Internet Protocol
  43. AF_SIP = so32dll.AF_SIP; // Simple Internet Protocol
  44. AF_INET6 = so32dll.AF_INET6;
  45. pseudo_AF_PIP = so32dll.pseudo_AF_PIP; // Help Identify PIP packets
  46. AF_ROUTE = so32dll.AF_ROUTE; // Internal Routing Protocol
  47. AF_FWIP = so32dll.AF_FWIP; // firewall support
  48. AF_IPSEC = so32dll.AF_IPSEC; // IPSEC and encryption techniques
  49. AF_DES = so32dll.AF_DES; // DES
  50. AF_MD5 = so32dll.AF_MD5;
  51. AF_CDMF = so32dll.AF_CDMF;
  52. AF_MAX = so32dll.AF_MAX;
  53. PF_LOCAL = so32dll.PF_LOCAL;
  54. PF_OS2 = so32dll.PF_OS2;
  55. PF_IMPLINK = so32dll.PF_IMPLINK;
  56. PF_PUP = so32dll.PF_PUP;
  57. PF_CHAOS = so32dll.PF_CHAOS;
  58. PF_NS = so32dll.PF_NS;
  59. PF_ISO = so32dll.PF_ISO;
  60. PF_OSI = so32dll.PF_OSI;
  61. PF_ECMA = so32dll.PF_ECMA;
  62. PF_DATAKIT = so32dll.PF_DATAKIT;
  63. PF_CCITT = so32dll.PF_CCITT;
  64. PF_SNA = so32dll.PF_SNA;
  65. PF_DECnet = so32dll.PF_DECnet;
  66. PF_DLI = so32dll.PF_DLI;
  67. PF_LAT = so32dll.PF_LAT;
  68. PF_HYLINK = so32dll.PF_HYLINK;
  69. PF_APPLETALK = so32dll.PF_APPLETALK;
  70. PF_NETBIOS = so32dll.PF_NB;
  71. PF_NB = so32dll.PF_NB;
  72. PF_ROUTE = so32dll.PF_ROUTE;
  73. PF_LINK = so32dll.PF_LINK;
  74. PF_XTP = so32dll.PF_XTP; // really just proto family, no AF
  75. PF_COIP = so32dll.PF_COIP;
  76. PF_CNT = so32dll.PF_CNT;
  77. PF_SIP = so32dll.PF_SIP;
  78. PF_INET6 = so32dll.PF_INET6;
  79. PF_IPX = so32dll.PF_IPX; // same format as AF_NS
  80. PF_RTIP = so32dll.PF_RTIP; // same format as AF_INET
  81. PF_PIP = so32dll.PF_PIP;
  82. PF_MAX = so32dll.PF_MAX;
  83. // OS/2 stack based on BSD stack
  84. {$DEFINE BSD}
  85. {$I socketsh.inc}
  86. Implementation
  87. {Include filerec and textrec structures}
  88. {$I filerec.inc}
  89. {$I textrec.inc}
  90. {******************************************************************************
  91. Basic Socket Functions
  92. ******************************************************************************}
  93. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  94. begin
  95. Socket:=so32dll.Socket(Domain,SocketType,ProtoCol);
  96. if Socket<0 then
  97. SocketError:=so32dll.sock_errno
  98. else
  99. SocketError:=0;
  100. end;
  101. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  102. begin
  103. Send:=so32dll.Send(Sock,Buf,BufLen,Flags);
  104. if Send<0 then
  105. SocketError:=so32dll.sock_errno
  106. else
  107. SocketError:=0;
  108. end;
  109. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  110. begin
  111. SendTo:=so32dll.SendTo(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
  112. if SendTo<0 then
  113. SocketError:=so32dll.sock_errno
  114. else
  115. SocketError:=0;
  116. end;
  117. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  118. begin
  119. Recv:=so32dll.Recv(Sock,Buf,BufLen,Flags);
  120. if Recv<0 then
  121. SocketError:=so32dll.sock_errno
  122. else
  123. SocketError:=0;
  124. end;
  125. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; AddrLen : Integer) : longint;
  126. begin
  127. RecvFrom:=so32dll.RecvFrom(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
  128. if RecvFrom<0 then
  129. SocketError:=so32dll.sock_errno
  130. else
  131. SocketError:=0;
  132. end;
  133. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  134. var
  135. l : longint;
  136. begin
  137. l:=so32dll.Bind(Sock,so32dll.sockaddr(Addr),AddrLen);
  138. if l<0 then
  139. begin
  140. SocketError:=so32dll.sock_errno;
  141. Bind:=false;
  142. end
  143. else
  144. begin
  145. SocketError:=0;
  146. Bind:=true;
  147. end;
  148. end;
  149. Function Listen(Sock,MaxConnect:Longint):Boolean;
  150. var
  151. l : longint;
  152. begin
  153. l:=so32dll.Listen(Sock,MaxConnect);
  154. if l<0 then
  155. begin
  156. SocketError:=so32dll.sock_errno;
  157. Listen:=false;
  158. end
  159. else
  160. begin
  161. SocketError:=0;
  162. Listen:=true;
  163. end;
  164. end;
  165. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  166. begin
  167. Accept:=so32dll.Accept(Sock,so32dll.SockAddr(Addr), AddrLen);
  168. if Accept<0 then
  169. SocketError:=so32dll.sock_errno
  170. else
  171. SocketError:=0;
  172. end;
  173. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
  174. begin
  175. Connect:=so32dll.Connect(Sock,so32dll.SockAddr(Addr),AddrLen)=0;
  176. if not Connect then
  177. SocketError:=so32dll.sock_errno
  178. else
  179. SocketError:=0;
  180. end;
  181. Function Shutdown(Sock:Longint;How:Longint):Longint;
  182. begin
  183. ShutDown:=so32dll.ShutDown(Sock,How);
  184. if ShutDown<0 then
  185. SocketError:=so32dll.sock_errno
  186. else
  187. SocketError:=0;
  188. end;
  189. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  190. begin
  191. GetSocketName:=so32dll.GetSockName(Sock, so32dll.SockAddr(Addr),AddrLen);
  192. if GetSocketName<0 then
  193. SocketError:=so32dll.sock_errno
  194. else
  195. SocketError:=0;
  196. end;
  197. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  198. begin
  199. GetPeerName:=so32dll.GetPeerName(Sock,so32dll.SockAddr(Addr),AddrLen);
  200. if GetPeerName<0 then
  201. SocketError:=so32dll.sock_errno
  202. else
  203. SocketError:=0;
  204. end;
  205. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  206. begin
  207. SetSocketOptions:=so32dll.SetSockOpt(Sock,Level,OptName,OptVal,OptLen);
  208. if SetSocketOptions<0 then
  209. SocketError:=so32dll.sock_errno
  210. else
  211. SocketError:=0;
  212. end;
  213. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  214. begin
  215. GetSocketOptions:=so32dll.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
  216. if GetSocketOptions<0 then
  217. SocketError:=so32dll.sock_errno
  218. else
  219. SocketError:=0;
  220. end;
  221. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  222. begin
  223. {!!TODO!!
  224. SocketPair:=so32dll.socketpair(Domain,SocketType,Protocol,Pair);}
  225. //SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  226. end;
  227. { mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
  228. function fdWrite(handle : longint;Const bufptr;size : dword) : dword;
  229. begin
  230. fdWrite := so32dll.send(handle, bufptr, size, 0);
  231. if fdWrite = -1 then
  232. begin
  233. SocketError := so32dll.sock_errno;
  234. fdWrite := 0;
  235. end
  236. else
  237. SocketError := 0;
  238. end;
  239. function fdRead(handle : longint;var bufptr;size : dword) : dword;
  240. var
  241. d : dword;
  242. begin
  243. {!!TODO!!
  244. if so32dll.ioctlsocket(handle,FIONREAD,@d) = -1 then
  245. begin
  246. SocketError:=so32dll.sock_errno;
  247. fdRead:=0;
  248. exit;
  249. end;
  250. }
  251. if d>0 then
  252. begin
  253. if size>d then
  254. size:=d;
  255. fdRead := so32dll.recv(handle, bufptr, size, 0);
  256. if fdRead = -1 then
  257. begin
  258. SocketError:= so32dll.sock_errno;
  259. fdRead := 0;
  260. end else
  261. SocketError:=0;
  262. end
  263. else
  264. SocketError:=0;
  265. end;
  266. {$i sockets.inc}
  267. Begin
  268. so32dll.sock_init;
  269. End.
  270. {
  271. $Log$
  272. Revision 1.2 2004-07-17 10:13:09 hajny
  273. + missing CVS logs added
  274. }