unixsock.inc 6.9 KB

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