unixsock.inc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. (c) 2000-2003 by Marco van de Voort
  5. member of the Free Pascal development team.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. socket call implementations for FreeBSD
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY;without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. }
  13. {******************************************************************************
  14. Basic Socket Functions
  15. ******************************************************************************}
  16. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  17. begin
  18. Socket:=Do_Syscall(syscall_nr_socket,Domain,SocketType,Protocol);
  19. end;
  20. Function CloseSocket (Sock:Longint):Longint;
  21. begin
  22. if fpclose(Sock)=0 then
  23. CloseSocket := 0 else
  24. CloseSocket := -1;
  25. end;
  26. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  27. begin
  28. Send:=do_syscall(syscall_nr_sendto,Sock,Longint(@Buf),BufLen,Flags,0,0);
  29. end;
  30. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  31. begin
  32. Sendto:=do_syscall(syscall_nr_Sendto,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
  33. end;
  34. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  35. begin
  36. Recv:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@Buf),BufLen,Flags,0,0);
  37. end;
  38. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
  39. begin
  40. RecvFrom:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
  41. end;
  42. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  43. begin
  44. Bind:=(do_syscall(syscall_nr_Bind,Sock,Longint(@Addr),AddrLen)=0);
  45. end;
  46. Function Listen(Sock,MaxConnect:Longint):Boolean;
  47. begin
  48. Listen:=(do_syscall(syscall_nr_Listen,Sock,MaxConnect,0)=0);
  49. end;
  50. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  51. begin
  52. Accept:=do_syscall(syscall_nr_accept,Sock,longint(@Addr),longint(@AddrLen));
  53. If Accept<0 Then
  54. Accept:=-1;
  55. end;
  56. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
  57. begin
  58. Connect:=do_syscall(syscall_nr_connect,Sock,longint(@Addr),AddrLen)=0;
  59. end;
  60. Function Shutdown(Sock:Longint;How:Longint):Longint;
  61. begin
  62. ShutDown:=do_syscall(syscall_nr_shutdown,Sock,How);
  63. end;
  64. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  65. begin
  66. GetSocketName:=do_syscall(syscall_nr_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
  67. end;
  68. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  69. begin
  70. GetPeerName:=do_syscall(syscall_nr_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
  71. end;
  72. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  73. begin
  74. SetSocketOptions:=do_syscall(syscall_nr_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  75. end;
  76. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  77. begin
  78. GetSocketOptions:=do_syscall(syscall_nr_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  79. end;
  80. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  81. begin
  82. SocketPair:=do_syscall(syscall_nr_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  83. end;
  84. {******************************************************************************
  85. UnixSock
  86. ******************************************************************************}
  87. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  88. begin
  89. Move(Addr[1],t.Path,length(Addr));
  90. t.Family:=AF_UNIX;
  91. t.Path[length(Addr)]:=#0;
  92. Len:=Length(Addr)+3;
  93. end;
  94. Function Bind(Sock:longint;const addr:string):boolean;
  95. var
  96. UnixAddr : TUnixSockAddr;
  97. AddrLen : longint;
  98. begin
  99. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  100. Bind(Sock,UnixAddr,AddrLen);
  101. Bind:=(SocketError=0);
  102. end;
  103. Function DoAccept(Sock:longint;var addr:string):longint;
  104. var
  105. UnixAddr : TUnixSockAddr;
  106. AddrLen : longint;
  107. begin
  108. AddrLen:=length(addr)+3;
  109. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  110. Move(UnixAddr.Path,Addr[1],AddrLen);
  111. SetLength(Addr,AddrLen);
  112. end;
  113. Function DoConnect(Sock:longint;const addr:string):Boolean;
  114. var
  115. UnixAddr : TUnixSockAddr;
  116. AddrLen : longint;
  117. begin
  118. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  119. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  120. end;
  121. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  122. var
  123. s : longint;
  124. begin
  125. S:=DoAccept(Sock,addr);
  126. if S>0 then
  127. begin
  128. Sock2Text(S,SockIn,SockOut);
  129. Accept:=true;
  130. end
  131. else
  132. Accept:=false;
  133. end;
  134. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  135. var
  136. s : longint;
  137. begin
  138. S:=DoAccept(Sock,addr);
  139. if S>0 then
  140. begin
  141. Sock2File(S,SockIn,SockOut);
  142. Accept:=true;
  143. end
  144. else
  145. Accept:=false;
  146. end;
  147. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  148. begin
  149. Connect:=DoConnect(Sock,addr);
  150. If Connect then
  151. Sock2Text(Sock,SockIn,SockOut);
  152. end;
  153. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  154. begin
  155. Connect:=DoConnect(Sock,addr);
  156. if Connect then
  157. Sock2File(Sock,SockIn,SockOut);
  158. end;
  159. {
  160. $Log$
  161. Revision 1.4 2004-01-04 01:11:28 marco
  162. * a new qod port of the freebsd rtl. To be refined in the coming days.
  163. Revision 1.9 2004/01/03 12:18:29 marco
  164. * a lot of copyright notices and CVS logs added and fixed
  165. Revision 1.8 2003/09/15 07:09:58 marco
  166. * small fixes, round 1
  167. Revision 1.7 2003/03/23 17:47:15 armin
  168. * CloseSocket added
  169. Revision 1.6 2002/09/07 16:01:18 peter
  170. * old logs removed and tabs fixed
  171. Revision 1.5 2002/02/05 07:54:34 marco
  172. * Fixed typo
  173. }