unixsock.inc 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. {
  2. This file is part of the Free Pascal run time library.
  3. (c) 2000-2003 by Marco van de Voort
  4. member of the Free Pascal development team.
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. socket call implementations for FreeBSD
  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. {******************************************************************************
  13. Basic Socket Functions
  14. ******************************************************************************}
  15. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  16. Begin
  17. fpSocket:=Do_Syscall(syscall_nr_socket,Domain,xtype,Protocol);
  18. internal_socketerror:=fpgeterrno;
  19. End;
  20. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  21. begin
  22. fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
  23. internal_socketerror:=fpgeterrno;
  24. end;
  25. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  26. begin
  27. fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
  28. internal_socketerror:=fpgeterrno;
  29. end;
  30. function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
  31. begin
  32. fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
  33. internal_socketerror:=fpgeterrno;
  34. end;
  35. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  36. begin
  37. fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
  38. internal_socketerror:=fpgeterrno;
  39. end;
  40. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  41. begin
  42. fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
  43. internal_socketerror:=fpgeterrno;
  44. end;
  45. function fplisten (s:cint; backlog : cint):cint;
  46. begin
  47. fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
  48. internal_socketerror:=fpgeterrno;
  49. end;
  50. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  51. begin
  52. fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
  53. internal_socketerror:=fpgeterrno;
  54. end;
  55. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  56. begin
  57. fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
  58. internal_socketerror:=fpgeterrno;
  59. end;
  60. function fpshutdown (s:cint; how:cint):cint;
  61. begin
  62. fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
  63. internal_socketerror:=fpgeterrno;
  64. end;
  65. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  66. begin
  67. fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
  68. internal_socketerror:=fpgeterrno;
  69. end;
  70. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  71. begin
  72. fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
  73. internal_socketerror:=fpgeterrno;
  74. end;
  75. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
  76. begin
  77. fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
  78. internal_socketerror:=fpgeterrno;
  79. end;
  80. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  81. begin
  82. fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
  83. internal_socketerror:=fpgeterrno;
  84. end;
  85. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  86. begin
  87. fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
  88. internal_socketerror:=fpgeterrno;
  89. end;
  90. (*
  91. {******************************************************************************
  92. Basic Socket Functions
  93. ******************************************************************************}
  94. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  95. begin
  96. Socket:=Do_Syscall(syscall_nr_socket,Domain,SocketType,Protocol);
  97. end;
  98. Function CloseSocket (Sock:Longint):Longint;
  99. begin
  100. if fpclose(Sock)=0 then
  101. CloseSocket := 0 else
  102. CloseSocket := -1;
  103. end;
  104. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  105. begin
  106. Send:=do_syscall(syscall_nr_sendto,Sock,Longint(@Buf),BufLen,Flags,0,0);
  107. end;
  108. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  109. begin
  110. Sendto:=do_syscall(syscall_nr_Sendto,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
  111. end;
  112. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  113. begin
  114. Recv:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@Buf),BufLen,Flags,0,0);
  115. end;
  116. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
  117. begin
  118. RecvFrom:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
  119. end;
  120. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  121. begin
  122. Bind:=(do_syscall(syscall_nr_Bind,Sock,Longint(@Addr),AddrLen)=0);
  123. end;
  124. Function Listen(Sock,MaxConnect:Longint):Boolean;
  125. begin
  126. Listen:=(do_syscall(syscall_nr_Listen,Sock,MaxConnect,0)=0);
  127. end;
  128. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  129. begin
  130. Accept:=do_syscall(syscall_nr_accept,Sock,longint(@Addr),longint(@AddrLen));
  131. If Accept<0 Then
  132. Accept:=-1;
  133. end;
  134. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
  135. begin
  136. Connect:=do_syscall(syscall_nr_connect,Sock,longint(@Addr),AddrLen)=0;
  137. end;
  138. Function Shutdown(Sock:Longint;How:Longint):Longint;
  139. begin
  140. ShutDown:=do_syscall(syscall_nr_shutdown,Sock,How);
  141. end;
  142. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  143. begin
  144. GetSocketName:=do_syscall(syscall_nr_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
  145. end;
  146. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  147. begin
  148. GetPeerName:=do_syscall(syscall_nr_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
  149. end;
  150. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  151. begin
  152. SetSocketOptions:=do_syscall(syscall_nr_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  153. end;
  154. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  155. begin
  156. GetSocketOptions:=do_syscall(syscall_nr_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  157. end;
  158. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  159. begin
  160. SocketPair:=do_syscall(syscall_nr_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  161. end;
  162. {******************************************************************************
  163. UnixSock
  164. ******************************************************************************}
  165. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  166. begin
  167. Move(Addr[1],t.Path,length(Addr));
  168. t.Family:=AF_UNIX;
  169. t.Path[length(Addr)]:=#0;
  170. Len:=Length(Addr)+3;
  171. end;
  172. Function Bind(Sock:longint;const addr:string):boolean;
  173. var
  174. UnixAddr : TUnixSockAddr;
  175. AddrLen : longint;
  176. begin
  177. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  178. Bind(Sock,UnixAddr,AddrLen);
  179. Bind:=(SocketError=0);
  180. end;
  181. Function DoAccept(Sock:longint;var addr:string):longint;
  182. var
  183. UnixAddr : TUnixSockAddr;
  184. AddrLen : longint;
  185. begin
  186. AddrLen:=length(addr)+3;
  187. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  188. Move(UnixAddr.Path,Addr[1],AddrLen);
  189. SetLength(Addr,AddrLen);
  190. end;
  191. Function DoConnect(Sock:longint;const addr:string):Boolean;
  192. var
  193. UnixAddr : TUnixSockAddr;
  194. AddrLen : longint;
  195. begin
  196. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  197. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  198. end;
  199. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  200. var
  201. s : longint;
  202. begin
  203. S:=DoAccept(Sock,addr);
  204. if S>0 then
  205. begin
  206. Sock2Text(S,SockIn,SockOut);
  207. Accept:=true;
  208. end
  209. else
  210. Accept:=false;
  211. end;
  212. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  213. var
  214. s : longint;
  215. begin
  216. S:=DoAccept(Sock,addr);
  217. if S>0 then
  218. begin
  219. Sock2File(S,SockIn,SockOut);
  220. Accept:=true;
  221. end
  222. else
  223. Accept:=false;
  224. end;
  225. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  226. begin
  227. Connect:=DoConnect(Sock,addr);
  228. If Connect then
  229. Sock2Text(Sock,SockIn,SockOut);
  230. end;
  231. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  232. begin
  233. Connect:=DoConnect(Sock,addr);
  234. if Connect then
  235. Sock2File(Sock,SockIn,SockOut);
  236. end;
  237. *)