unixsock.inc 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 2000 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. 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. Const
  13. {
  14. Arguments to the Linux Kernel system call for sockets. All
  15. Socket Connected calls go through the same system call,
  16. with an extra argument to determine what action to take.
  17. }
  18. Socket_Sys_SOCKET = 1;
  19. Socket_Sys_BIND = 2;
  20. Socket_Sys_CONNECT = 3;
  21. Socket_Sys_LISTEN = 4;
  22. Socket_Sys_ACCEPT = 5;
  23. Socket_Sys_GETSOCKNAME = 6;
  24. Socket_Sys_GETPEERNAME = 7;
  25. Socket_Sys_SOCKETPAIR = 8;
  26. Socket_Sys_SEND = 9;
  27. Socket_Sys_RECV = 10;
  28. Socket_Sys_SENDTO = 11;
  29. Socket_Sys_RECVFROM = 12;
  30. Socket_Sys_SHUTDOWN = 13;
  31. Socket_Sys_SETSOCKOPT = 14;
  32. Socket_Sys_GETSOCKOPT = 15;
  33. Socket_Sys_SENDMSG = 16;
  34. Socket_Sys_RECVMSG = 17;
  35. Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:longint):longint;
  36. var
  37. Regs:SysCallRegs;
  38. Args:array[1..6] of longint;
  39. begin
  40. {$IFNDEF BSD}
  41. args[1]:=a1;
  42. args[2]:=a2;
  43. args[3]:=a3;
  44. args[4]:=a4;
  45. args[5]:=a5;
  46. args[6]:=a6;
  47. regs.reg2:=SockCallNr;
  48. regs.reg3:=Longint(@args);
  49. SocketCall:=Syscall(syscall_nr_socketcall,regs);
  50. If SocketCall<0 then
  51. SocketError:=Errno
  52. else
  53. SocketError:=0;
  54. {$ELSE}
  55. SocketError:=-1;
  56. {$ENDIF}
  57. end;
  58. Function SocketCall(SockCallNr,a1,a2,a3:longint):longint;
  59. begin
  60. SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
  61. end;
  62. {******************************************************************************
  63. Basic Socket Functions
  64. ******************************************************************************}
  65. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  66. begin
  67. Socket:=SocketCall(Socket_Sys_Socket,Domain,SocketType,ProtoCol);
  68. end;
  69. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  70. begin
  71. Send:=SocketCall(Socket_Sys_Send,Sock,Longint(@Buf),BufLen,Flags,0,0);
  72. end;
  73. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  74. begin
  75. Recv:=SocketCall(Socket_Sys_Recv,Sock,Longint(@Buf),BufLen,Flags,0,0);
  76. end;
  77. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  78. begin
  79. Bind:=(SocketCall(Socket_Sys_Bind,Sock,Longint(@Addr),AddrLen)=0);
  80. end;
  81. Function Listen(Sock,MaxConnect:Longint):Boolean;
  82. begin
  83. Listen:=(SocketCall(Socket_Sys_Listen,Sock,MaxConnect,0)=0);
  84. end;
  85. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  86. begin
  87. Accept:=SocketCall(Socket_Sys_Accept,Sock,longint(@Addr),longint(@AddrLen));
  88. If Accept<0 Then
  89. Accept:=-1;
  90. end;
  91. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
  92. begin
  93. Connect:=SocketCall(Socket_Sys_Connect,Sock,longint(@Addr),AddrLen)=0;
  94. end;
  95. Function Shutdown(Sock:Longint;How:Longint):Longint;
  96. begin
  97. ShutDown:=SocketCall(Socket_Sys_ShutDown,Sock,How,0);
  98. end;
  99. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  100. begin
  101. GetSocketName:=SocketCall(Socket_Sys_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
  102. end;
  103. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  104. begin
  105. GetPeerName:=SocketCall(Socket_Sys_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
  106. end;
  107. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  108. begin
  109. SetSocketOptions:=SocketCall(Socket_Sys_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  110. end;
  111. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  112. begin
  113. GetSocketOptions:=SocketCall(Socket_Sys_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  114. end;
  115. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  116. begin
  117. SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  118. end;
  119. {******************************************************************************
  120. UnixSock
  121. ******************************************************************************}
  122. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  123. begin
  124. Move(Addr[1],t.Path,length(Addr));
  125. t.Family:=AF_UNIX;
  126. t.Path[length(Addr)]:=#0;
  127. Len:=Length(Addr)+3;
  128. end;
  129. Function Bind(Sock:longint;const addr:string):boolean;
  130. var
  131. UnixAddr : TUnixSockAddr;
  132. AddrLen : longint;
  133. begin
  134. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  135. Bind(Sock,UnixAddr,AddrLen);
  136. Bind:=(SocketError=0);
  137. end;
  138. Function DoAccept(Sock:longint;var addr:string):longint;
  139. var
  140. UnixAddr : TUnixSockAddr;
  141. AddrLen : longint;
  142. begin
  143. AddrLen:=length(addr)+3;
  144. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  145. Move(UnixAddr.Path,Addr[1],AddrLen);
  146. SetLength(Addr,AddrLen);
  147. end;
  148. Function DoConnect(Sock:longint;const addr:string):Boolean;
  149. var
  150. UnixAddr : TUnixSockAddr;
  151. AddrLen : longint;
  152. begin
  153. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  154. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  155. end;
  156. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  157. var
  158. s : longint;
  159. begin
  160. S:=DoAccept(Sock,addr);
  161. if S>0 then
  162. begin
  163. Sock2Text(S,SockIn,SockOut);
  164. Accept:=true;
  165. end
  166. else
  167. Accept:=false;
  168. end;
  169. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  170. var
  171. s : longint;
  172. begin
  173. S:=DoAccept(Sock,addr);
  174. if S>0 then
  175. begin
  176. Sock2File(S,SockIn,SockOut);
  177. Accept:=true;
  178. end
  179. else
  180. Accept:=false;
  181. end;
  182. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  183. begin
  184. Connect:=DoConnect(Sock,addr);
  185. If Connect then
  186. Sock2Text(Sock,SockIn,SockOut);
  187. end;
  188. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  189. begin
  190. Connect:=DoConnect(Sock,addr);
  191. if Connect then
  192. Sock2File(Sock,SockIn,SockOut);
  193. end;
  194. {
  195. $Log$
  196. Revision 1.4 2001-06-10 08:51:44 peter
  197. * forgotten file for the const to var fixes
  198. Revision 1.3 2001/06/04 11:43:51 peter
  199. * Formal const to var fixes
  200. * Hexstr(int64) added
  201. Revision 1.2 2001/06/02 00:31:30 peter
  202. * merge unix updates from the 1.0 branch, mostly related to the
  203. solaris target
  204. Revision 1.2 2000/09/18 13:14:50 marco
  205. * Global Linux +bsd to (rtl/freebsd rtl/unix rtl/linux structure)
  206. Revision 1.2 2000/09/11 14:05:31 marco
  207. * FreeBSD support and removed old signalhandling
  208. }