sockets.pas 12 KB

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