unixsock.inc 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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 SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  74. begin
  75. Sendto:=SocketCall(Socket_Sys_SendTo,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
  76. end;
  77. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  78. begin
  79. Recv:=SocketCall(Socket_Sys_Recv,Sock,Longint(@Buf),BufLen,Flags,0,0);
  80. end;
  81. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
  82. begin
  83. RecvFrom:=SocketCall(Socket_Sys_Recv,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
  84. end;
  85. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  86. begin
  87. Bind:=(SocketCall(Socket_Sys_Bind,Sock,Longint(@Addr),AddrLen)=0);
  88. end;
  89. Function Listen(Sock,MaxConnect:Longint):Boolean;
  90. begin
  91. Listen:=(SocketCall(Socket_Sys_Listen,Sock,MaxConnect,0)=0);
  92. end;
  93. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  94. begin
  95. Accept:=SocketCall(Socket_Sys_Accept,Sock,longint(@Addr),longint(@AddrLen));
  96. If Accept<0 Then
  97. Accept:=-1;
  98. end;
  99. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
  100. begin
  101. Connect:=SocketCall(Socket_Sys_Connect,Sock,longint(@Addr),AddrLen)=0;
  102. end;
  103. Function Shutdown(Sock:Longint;How:Longint):Longint;
  104. begin
  105. ShutDown:=SocketCall(Socket_Sys_ShutDown,Sock,How,0);
  106. end;
  107. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  108. begin
  109. GetSocketName:=SocketCall(Socket_Sys_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
  110. end;
  111. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  112. begin
  113. GetPeerName:=SocketCall(Socket_Sys_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
  114. end;
  115. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  116. begin
  117. SetSocketOptions:=SocketCall(Socket_Sys_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  118. end;
  119. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  120. begin
  121. GetSocketOptions:=SocketCall(Socket_Sys_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  122. end;
  123. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  124. begin
  125. SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  126. end;
  127. {******************************************************************************
  128. UnixSock
  129. ******************************************************************************}
  130. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  131. begin
  132. Move(Addr[1],t.Path,length(Addr));
  133. t.Family:=AF_UNIX;
  134. t.Path[length(Addr)]:=#0;
  135. Len:=Length(Addr)+3;
  136. end;
  137. Function Bind(Sock:longint;const addr:string):boolean;
  138. var
  139. UnixAddr : TUnixSockAddr;
  140. AddrLen : longint;
  141. begin
  142. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  143. Bind(Sock,UnixAddr,AddrLen);
  144. Bind:=(SocketError=0);
  145. end;
  146. Function DoAccept(Sock:longint;var addr:string):longint;
  147. var
  148. UnixAddr : TUnixSockAddr;
  149. AddrLen : longint;
  150. begin
  151. AddrLen:=length(addr)+3;
  152. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  153. Move(UnixAddr.Path,Addr[1],AddrLen);
  154. SetLength(Addr,AddrLen);
  155. end;
  156. Function DoConnect(Sock:longint;const addr:string):Boolean;
  157. var
  158. UnixAddr : TUnixSockAddr;
  159. AddrLen : longint;
  160. begin
  161. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  162. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  163. end;
  164. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  165. var
  166. s : longint;
  167. begin
  168. S:=DoAccept(Sock,addr);
  169. if S>0 then
  170. begin
  171. Sock2Text(S,SockIn,SockOut);
  172. Accept:=true;
  173. end
  174. else
  175. Accept:=false;
  176. end;
  177. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  178. var
  179. s : longint;
  180. begin
  181. S:=DoAccept(Sock,addr);
  182. if S>0 then
  183. begin
  184. Sock2File(S,SockIn,SockOut);
  185. Accept:=true;
  186. end
  187. else
  188. Accept:=false;
  189. end;
  190. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  191. begin
  192. Connect:=DoConnect(Sock,addr);
  193. If Connect then
  194. Sock2Text(Sock,SockIn,SockOut);
  195. end;
  196. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  197. begin
  198. Connect:=DoConnect(Sock,addr);
  199. if Connect then
  200. Sock2File(Sock,SockIn,SockOut);
  201. end;
  202. {
  203. $Log$
  204. Revision 1.6 2002-09-07 16:01:20 peter
  205. * old logs removed and tabs fixed
  206. Revision 1.5 2002/02/04 21:29:34 michael
  207. + merged missing sendto/rcvfrom functions
  208. }