sockets.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  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. Type
  92. cushort=word;
  93. cuint16=word;
  94. cuint32=cardinal;
  95. size_t =cuint32;
  96. ssize_t=cuint16;
  97. cint =longint;
  98. pcint =^cint;
  99. tsocklen=cint;
  100. psocklen=^tsocklen;
  101. // OS/2 stack based on BSD stack
  102. {$DEFINE BSD}
  103. {$I socketsh.inc}
  104. Implementation
  105. {Include filerec and textrec structures}
  106. {$I filerec.inc}
  107. {$I textrec.inc}
  108. {******************************************************************************
  109. Basic Socket Functions
  110. ******************************************************************************}
  111. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  112. begin
  113. Socket:=so32dll.Socket(Domain,SocketType,ProtoCol);
  114. if Socket<0 then
  115. SocketError:=so32dll.sock_errno
  116. else
  117. SocketError:=0;
  118. end;
  119. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  120. begin
  121. Send:=fpSend(Sock,@Buf,BufLen,Flags);
  122. end;
  123. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  124. begin
  125. SendTo:=fpSendTo(Sock,@Buf,BufLen,Flags,@Addr,AddrLen);
  126. end;
  127. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  128. begin
  129. Recv:=so32dll.Recv(Sock,Buf,BufLen,Flags);
  130. if Recv<0 then
  131. SocketError:=so32dll.sock_errno
  132. else
  133. SocketError:=0;
  134. end;
  135. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longInt) : longint;
  136. begin
  137. RecvFrom:=so32dll.RecvFrom(Sock,Buf,BufLen,Flags,so32dll.SockAddr(Addr),AddrLen);
  138. if RecvFrom<0 then
  139. SocketError:=so32dll.sock_errno
  140. else
  141. SocketError:=0;
  142. end;
  143. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  144. begin
  145. Bind:=fpBind(Sock,@Addr,AddrLen)=0;
  146. end;
  147. Function Listen(Sock,MaxConnect:Longint):Boolean;
  148. var
  149. l : longint;
  150. begin
  151. l:=so32dll.Listen(Sock,MaxConnect);
  152. if l<0 then
  153. begin
  154. SocketError:=so32dll.sock_errno;
  155. Listen:=false;
  156. end else
  157. begin
  158. SocketError:=0;
  159. Listen:=true;
  160. end;
  161. end;
  162. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  163. begin
  164. Accept:=so32dll.Accept(Sock,so32dll.SockAddr(Addr), AddrLen);
  165. if Accept<0 then
  166. SocketError:=so32dll.sock_errno
  167. else
  168. SocketError:=0;
  169. end;
  170. Function Connect(Sock:Longint;const Addr; Addrlen:Longint):Boolean;
  171. begin
  172. Connect:=fpConnect(Sock,@Addr,AddrLen)=0;
  173. end;
  174. Function Shutdown(Sock:Longint;How:Longint):Longint;
  175. begin
  176. ShutDown:=so32dll.ShutDown(Sock,How);
  177. if ShutDown<0 then
  178. SocketError:=so32dll.sock_errno
  179. else
  180. SocketError:=0;
  181. end;
  182. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  183. begin
  184. GetSocketName:=so32dll.GetSockName(Sock, so32dll.SockAddr(Addr),AddrLen);
  185. if GetSocketName<0 then
  186. SocketError:=so32dll.sock_errno
  187. else
  188. SocketError:=0;
  189. end;
  190. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  191. begin
  192. GetPeerName:=so32dll.GetPeerName(Sock,so32dll.SockAddr(Addr),AddrLen);
  193. if GetPeerName<0 then
  194. SocketError:=so32dll.sock_errno
  195. else
  196. SocketError:=0;
  197. end;
  198. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  199. begin
  200. SetSocketOptions:=fpSetSockOpt(Sock,Level,OptName,@OptVal,OptLen);
  201. end;
  202. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  203. begin
  204. GetSocketOptions:=so32dll.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
  205. if GetSocketOptions<0 then
  206. SocketError:=so32dll.sock_errno
  207. else
  208. SocketError:=0;
  209. end;
  210. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  211. begin
  212. {!!TODO!!
  213. SocketPair:=so32dll.socketpair(Domain,SocketType,Protocol,Pair);}
  214. //SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  215. SocketPair:=-1;
  216. end;
  217. { mimic the linux fpWrite/fpRead calls for the file/text socket wrapper }
  218. function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
  219. begin
  220. fpWrite := dword(fpsend(handle, @bufptr, size, 0));
  221. if fpWrite = dword(-1) then
  222. begin
  223. SocketError := so32dll.sock_errno;
  224. fpWrite := 0;
  225. end
  226. else
  227. SocketError := 0;
  228. end;
  229. function fpRead(handle : longint;var bufptr;size : dword) : dword;
  230. var
  231. d : dword;
  232. begin
  233. d:=dword(so32dll.os2_ioctl(handle,FIONREAD,d,SizeOf(d)));
  234. if d=dword(-1) then
  235. begin
  236. SocketError:=so32dll.sock_errno;
  237. fpRead:=0;
  238. end else
  239. begin
  240. if size>d then
  241. size:=d;
  242. fpRead := dword(so32dll.recv(handle, bufptr, size, 0));
  243. if fpRead = dword(-1) then
  244. begin
  245. SocketError:= so32dll.sock_errno;
  246. fpRead := 0;
  247. end else
  248. SocketError:=0;
  249. end;
  250. end;
  251. {$i sockets.inc}
  252. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  253. begin
  254. fpSocket:=so32dll.Socket(Domain,xtype,ProtoCol);
  255. if fpSocket<0 then
  256. SocketError:=so32dll.sock_errno
  257. else
  258. SocketError:=0;
  259. end;
  260. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  261. begin
  262. fpSend:=so32dll.Send(S,msg^,len,flags);
  263. if fpSend<0 then
  264. SocketError:=so32dll.sock_errno
  265. else
  266. SocketError:=0;
  267. end;
  268. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  269. begin
  270. // Dubious construct, this should be checked. (IPV6 fails ?)
  271. fpSendTo:=so32dll.SendTo(S,msg^,Len,Flags,so32dll.SockAddr(tox^),toLen);
  272. if fpSendTo<0 then
  273. SocketError:=so32dll.sock_errno
  274. else
  275. SocketError:=0;
  276. end;
  277. function fprecv (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
  278. begin
  279. fpRecv:=so32dll.Recv(S,Buf,Len,Flags);
  280. if fpRecv<0 then
  281. SocketError:=so32dll.sock_errno
  282. else
  283. SocketError:=0;
  284. end;
  285. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  286. begin
  287. fpRecvFrom:=so32dll.RecvFrom(S,Buf,Len,Flags,so32dll.SockAddr(from^),FromLen^);
  288. if fpRecvFrom<0 then
  289. SocketError:=so32dll.sock_errno
  290. else
  291. SocketError:=0;
  292. end;
  293. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  294. begin
  295. fpConnect:=so32dll.Connect(S,so32dll.SockAddr(name^),nameLen);
  296. if fpConnect<0 then
  297. SocketError:=so32dll.sock_errno
  298. else
  299. SocketError:=0;
  300. end;
  301. function fpshutdown (s:cint; how:cint):cint;
  302. begin
  303. fpShutDown:=so32dll.ShutDown(S,How);
  304. if fpShutDown<0 then
  305. SocketError:=so32dll.sock_errno
  306. else
  307. SocketError:=0;
  308. end;
  309. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  310. begin
  311. fpbind:=so32dll.Bind(S,so32dll.SockAddr(Addrx^),AddrLen);
  312. if fpbind<0 then
  313. SocketError:=so32dll.sock_errno
  314. else
  315. SocketError:=0;
  316. end;
  317. function fplisten (s:cint; backlog : cint):cint;
  318. begin
  319. fplisten:=so32dll.Listen(S,backlog);
  320. if fplisten<0 then
  321. SocketError:=so32dll.sock_errno
  322. else
  323. SocketError:=0;
  324. end;
  325. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  326. begin
  327. fpAccept:=so32dll.Accept(S,so32dll.SockAddr(Addrx^),longint(@AddrLen));
  328. if fpAccept<0 then
  329. SocketError:=so32dll.sock_errno
  330. else
  331. SocketError:=0;
  332. end;
  333. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  334. begin
  335. fpGetSockName:=so32dll.GetSockName(S,so32dll.SockAddr(name^),nameLen^);
  336. if fpGetSockName<0 then
  337. SocketError:=so32dll.sock_errno
  338. else
  339. SocketError:=0;
  340. end;
  341. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  342. begin
  343. fpGetPeerName:=so32dll.GetPeerName(S,so32dll.SockAddr(name^),NameLen^);
  344. if fpGetPeerName<0 then
  345. SocketError:=so32dll.sock_errno
  346. else
  347. SocketError:=0;
  348. end;
  349. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  350. begin
  351. fpGetSockOpt:=so32dll.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
  352. if fpGetSockOpt<0 then
  353. SocketError:=so32dll.sock_errno
  354. else
  355. SocketError:=0;
  356. end;
  357. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
  358. begin
  359. fpSetSockOpt:=so32dll.SetSockOpt(S,Level,OptName,OptVal,OptLen);
  360. if fpSetSockOpt<0 then
  361. SocketError:=so32dll.sock_errno
  362. else
  363. SocketError:=0;
  364. end;
  365. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  366. begin
  367. fpsocketpair:=-1;
  368. end;
  369. Function CloseSocket(Sock:Longint):Longint;
  370. begin
  371. CloseSocket:=so32dll.soclose (Sock);
  372. if CloseSocket<>0 then
  373. begin
  374. SocketError:=so32dll.sock_errno;
  375. end else
  376. begin
  377. CloseSocket := 0;
  378. SocketError := 0;
  379. end;
  380. end;
  381. Begin
  382. so32dll.sock_init;
  383. End.