unixsock.inc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  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. Args:array[1..6] of longint;
  38. begin
  39. {$IFNDEF BSD}
  40. args[1]:=a1;
  41. args[2]:=a2;
  42. args[3]:=a3;
  43. args[4]:=a4;
  44. args[5]:=a5;
  45. args[6]:=a6;
  46. SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,longint(@args));
  47. If SocketCall<0 then
  48. SocketError:=fpgetErrno
  49. else
  50. SocketError:=0;
  51. {$ELSE}
  52. SocketError:=-1;
  53. {$ENDIF}
  54. end;
  55. Function SocketCall(SockCallNr,a1,a2,a3:longint):longint;
  56. begin
  57. SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
  58. end;
  59. {******************************************************************************
  60. Basic Socket Functions
  61. ******************************************************************************}
  62. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  63. begin
  64. Socket:=SocketCall(Socket_Sys_Socket,Domain,SocketType,ProtoCol);
  65. end;
  66. Function CloseSocket (Sock:Longint):Longint;
  67. begin
  68. if fpClose(Sock)=0 then
  69. CloseSocket := 0 else
  70. CloseSocket := -1;
  71. end;
  72. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  73. begin
  74. Send:=SocketCall(Socket_Sys_Send,Sock,Longint(@Buf),BufLen,Flags,0,0);
  75. end;
  76. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  77. begin
  78. Sendto:=SocketCall(Socket_Sys_SendTo,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
  79. end;
  80. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  81. begin
  82. Recv:=SocketCall(Socket_Sys_Recv,Sock,Longint(@Buf),BufLen,Flags,0,0);
  83. end;
  84. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
  85. begin
  86. RecvFrom:=SocketCall(Socket_Sys_Recv,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
  87. end;
  88. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  89. begin
  90. Bind:=(SocketCall(Socket_Sys_Bind,Sock,Longint(@Addr),AddrLen)=0);
  91. end;
  92. Function Listen(Sock,MaxConnect:Longint):Boolean;
  93. begin
  94. Listen:=(SocketCall(Socket_Sys_Listen,Sock,MaxConnect,0)=0);
  95. end;
  96. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  97. begin
  98. Accept:=SocketCall(Socket_Sys_Accept,Sock,longint(@Addr),longint(@AddrLen));
  99. If Accept<0 Then
  100. Accept:=-1;
  101. end;
  102. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
  103. begin
  104. Connect:=SocketCall(Socket_Sys_Connect,Sock,longint(@Addr),AddrLen)=0;
  105. end;
  106. Function Shutdown(Sock:Longint;How:Longint):Longint;
  107. begin
  108. ShutDown:=SocketCall(Socket_Sys_ShutDown,Sock,How,0);
  109. end;
  110. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  111. begin
  112. GetSocketName:=SocketCall(Socket_Sys_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
  113. end;
  114. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  115. begin
  116. GetPeerName:=SocketCall(Socket_Sys_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
  117. end;
  118. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  119. begin
  120. SetSocketOptions:=SocketCall(Socket_Sys_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  121. end;
  122. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  123. begin
  124. GetSocketOptions:=SocketCall(Socket_Sys_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  125. end;
  126. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  127. begin
  128. SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  129. end;
  130. {******************************************************************************
  131. UnixSock
  132. ******************************************************************************}
  133. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  134. begin
  135. Move(Addr[1],t.Path,length(Addr));
  136. t.Family:=AF_UNIX;
  137. t.Path[length(Addr)]:=#0;
  138. Len:=Length(Addr)+3;
  139. end;
  140. Function Bind(Sock:longint;const addr:string):boolean;
  141. var
  142. UnixAddr : TUnixSockAddr;
  143. AddrLen : longint;
  144. begin
  145. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  146. Bind(Sock,UnixAddr,AddrLen);
  147. Bind:=(SocketError=0);
  148. end;
  149. Function DoAccept(Sock:longint;var addr:string):longint;
  150. var
  151. UnixAddr : TUnixSockAddr;
  152. AddrLen : longint;
  153. begin
  154. AddrLen:=length(addr)+3;
  155. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  156. Move(UnixAddr.Path,Addr[1],AddrLen);
  157. SetLength(Addr,AddrLen);
  158. end;
  159. Function DoConnect(Sock:longint;const addr:string):Boolean;
  160. var
  161. UnixAddr : TUnixSockAddr;
  162. AddrLen : longint;
  163. begin
  164. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  165. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  166. end;
  167. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  168. var
  169. s : longint;
  170. begin
  171. S:=DoAccept(Sock,addr);
  172. if S>0 then
  173. begin
  174. Sock2Text(S,SockIn,SockOut);
  175. Accept:=true;
  176. end
  177. else
  178. Accept:=false;
  179. end;
  180. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  181. var
  182. s : longint;
  183. begin
  184. S:=DoAccept(Sock,addr);
  185. if S>0 then
  186. begin
  187. Sock2File(S,SockIn,SockOut);
  188. Accept:=true;
  189. end
  190. else
  191. Accept:=false;
  192. end;
  193. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  194. begin
  195. Connect:=DoConnect(Sock,addr);
  196. If Connect then
  197. Sock2Text(Sock,SockIn,SockOut);
  198. end;
  199. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  200. begin
  201. Connect:=DoConnect(Sock,addr);
  202. if Connect then
  203. Sock2File(Sock,SockIn,SockOut);
  204. end;
  205. {
  206. $Log$
  207. Revision 1.9 2004-02-06 23:06:16 florian
  208. - killed tsyscallregs
  209. Revision 1.8 2003/09/14 20:15:01 marco
  210. * Unix reform stage two. Remove all calls from Unix that exist in Baseunix.
  211. Revision 1.7 2003/03/23 17:47:15 armin
  212. * CloseSocket added
  213. Revision 1.6 2002/09/07 16:01:20 peter
  214. * old logs removed and tabs fixed
  215. Revision 1.5 2002/02/04 21:29:34 michael
  216. + merged missing sendto/rcvfrom functions
  217. }