sockets.pas 12 KB

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