sockets.pas 8.1 KB

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