sockets.pas 8.6 KB

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