unixsock.inc 6.8 KB

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