sockets.pp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by the Free Pascal development team
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit Sockets;
  12. Interface
  13. const
  14. { Adress families, Linux specific }
  15. AF_AX25 = 3; { Amateur Radio AX.25 }
  16. AF_IPX = 4; { Novell IPX }
  17. AF_APPLETALK = 5; { Appletalk DDP }
  18. AF_NETROM = 6; { Amateur radio NetROM }
  19. AF_BRIDGE = 7; { Multiprotocol bridge }
  20. AF_AAL5 = 8; { Reserved for Werner's ATM }
  21. AF_X25 = 9; { Reserved for X.25 project }
  22. AF_INET6 = 10; { IP version 6 }
  23. AF_MAX = 12;
  24. SOCK_PACKET = 10;
  25. PF_AX25 = AF_AX25;
  26. PF_IPX = AF_IPX;
  27. PF_APPLETALK = AF_APPLETALK;
  28. PF_NETROM = AF_NETROM;
  29. PF_BRIDGE = AF_BRIDGE;
  30. PF_AAL5 = AF_AAL5;
  31. PF_X25 = AF_X25;
  32. PF_INET6 = AF_INET6;
  33. PF_MAX = AF_MAX;
  34. type
  35. TUnixSockAddr = packed Record
  36. family:word; { was byte, fixed }
  37. path:array[0..108] of char;
  38. end;
  39. {$i socketsh.inc}
  40. { unix socket specific functions }
  41. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  42. Function Bind(Sock:longint;const addr:string):boolean;
  43. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  44. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  45. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  46. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  47. Implementation
  48. Uses Linux;
  49. { Include filerec and textrec structures }
  50. {$i filerec.inc}
  51. {$i textrec.inc}
  52. {******************************************************************************
  53. Kernel Socket Callings
  54. ******************************************************************************}
  55. Const
  56. {
  57. Arguments to the Linux Kernel system call for sockets. All
  58. Socket Connected calls go through the same system call,
  59. with an extra argument to determine what action to take.
  60. }
  61. Socket_Sys_SOCKET = 1;
  62. Socket_Sys_BIND = 2;
  63. Socket_Sys_CONNECT = 3;
  64. Socket_Sys_LISTEN = 4;
  65. Socket_Sys_ACCEPT = 5;
  66. Socket_Sys_GETSOCKNAME = 6;
  67. Socket_Sys_GETPEERNAME = 7;
  68. Socket_Sys_SOCKETPAIR = 8;
  69. Socket_Sys_SEND = 9;
  70. Socket_Sys_RECV = 10;
  71. Socket_Sys_SENDTO = 11;
  72. Socket_Sys_RECVFROM = 12;
  73. Socket_Sys_SHUTDOWN = 13;
  74. Socket_Sys_SETSOCKOPT = 14;
  75. Socket_Sys_GETSOCKOPT = 15;
  76. Socket_Sys_SENDMSG = 16;
  77. Socket_Sys_RECVMSG = 17;
  78. Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:longint):longint;
  79. var
  80. Regs:SysCallRegs;
  81. Args:array[1..6] of longint;
  82. begin
  83. {$IFNDEF BSD}
  84. args[1]:=a1;
  85. args[2]:=a2;
  86. args[3]:=a3;
  87. args[4]:=a4;
  88. args[5]:=a5;
  89. args[6]:=a6;
  90. regs.reg2:=SockCallNr;
  91. regs.reg3:=Longint(@args);
  92. SocketCall:=Syscall(syscall_nr_socketcall,regs);
  93. If SocketCall<0 then
  94. SocketError:=Errno
  95. else
  96. SocketError:=0;
  97. {$ELSE}
  98. SocketError:=-1;
  99. {$ENDIF}
  100. end;
  101. Function SocketCall(SockCallNr,a1,a2,a3:longint):longint;
  102. begin
  103. SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
  104. end;
  105. {******************************************************************************
  106. Basic Socket Functions
  107. ******************************************************************************}
  108. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  109. begin
  110. Socket:=SocketCall(Socket_Sys_Socket,Domain,SocketType,ProtoCol);
  111. end;
  112. Function Send(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
  113. begin
  114. Send:=SocketCall(Socket_Sys_Send,Sock,Longint(@Addr),AddrLen,Flags,0,0);
  115. end;
  116. Function Recv(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
  117. begin
  118. Recv:=SocketCall(Socket_Sys_Recv,Sock,Longint(@Addr),AddrLen,Flags,0,0);
  119. end;
  120. Function Bind(Sock:Longint;Var Addr;AddrLen:Longint):Boolean;
  121. begin
  122. Bind:=(SocketCall(Socket_Sys_Bind,Sock,Longint(@Addr),AddrLen)=0);
  123. end;
  124. Function Listen(Sock,MaxConnect:Longint):Boolean;
  125. begin
  126. Listen:=(SocketCall(Socket_Sys_Listen,Sock,MaxConnect,0)=0);
  127. end;
  128. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  129. begin
  130. Accept:=SocketCall(Socket_Sys_Accept,Sock,longint(@Addr),longint(@AddrLen));
  131. If Accept<0 Then
  132. Accept:=-1;
  133. end;
  134. Function Connect(Sock:Longint;Var Addr;Addrlen:Longint): boolean;
  135. begin
  136. Connect:=SocketCall(Socket_Sys_Connect,Sock,longint(@Addr),AddrLen)=0;
  137. end;
  138. Function Shutdown(Sock:Longint;How:Longint):Longint;
  139. begin
  140. ShutDown:=SocketCall(Socket_Sys_ShutDown,Sock,How,0);
  141. end;
  142. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  143. begin
  144. GetSocketName:=SocketCall(Socket_Sys_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
  145. end;
  146. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  147. begin
  148. GetPeerName:=SocketCall(Socket_Sys_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
  149. end;
  150. Function SetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;optlen:longint):Longint;
  151. begin
  152. SetSocketOptions:=SocketCall(Socket_Sys_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  153. end;
  154. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  155. begin
  156. GetSocketOptions:=SocketCall(Socket_Sys_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  157. end;
  158. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  159. begin
  160. SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  161. end;
  162. {******************************************************************************
  163. UnixSock
  164. ******************************************************************************}
  165. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  166. begin
  167. Move(Addr[1],t.Path,length(Addr));
  168. t.Family:=AF_UNIX;
  169. t.Path[length(Addr)]:=#0;
  170. Len:=Length(Addr)+3;
  171. end;
  172. Function Bind(Sock:longint;const addr:string):boolean;
  173. var
  174. UnixAddr : TUnixSockAddr;
  175. AddrLen : longint;
  176. begin
  177. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  178. Bind(Sock,UnixAddr,AddrLen);
  179. Bind:=(SocketError=0);
  180. end;
  181. Function DoAccept(Sock:longint;var addr:string):longint;
  182. var
  183. UnixAddr : TUnixSockAddr;
  184. AddrLen : longint;
  185. begin
  186. AddrLen:=length(addr)+3;
  187. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  188. Move(UnixAddr.Path,Addr[1],AddrLen);
  189. SetLength(Addr,AddrLen);
  190. end;
  191. Function DoConnect(Sock:longint;const addr:string):Boolean;
  192. var
  193. UnixAddr : TUnixSockAddr;
  194. AddrLen : longint;
  195. begin
  196. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  197. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  198. end;
  199. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  200. var
  201. s : longint;
  202. begin
  203. S:=DoAccept(Sock,addr);
  204. if S>0 then
  205. begin
  206. Sock2Text(S,SockIn,SockOut);
  207. Accept:=true;
  208. end
  209. else
  210. Accept:=false;
  211. end;
  212. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  213. var
  214. s : longint;
  215. begin
  216. S:=DoAccept(Sock,addr);
  217. if S>0 then
  218. begin
  219. Sock2File(S,SockIn,SockOut);
  220. Accept:=true;
  221. end
  222. else
  223. Accept:=false;
  224. end;
  225. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  226. begin
  227. Connect:=DoConnect(Sock,addr);
  228. If Connect then
  229. Sock2Text(Sock,SockIn,SockOut);
  230. end;
  231. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  232. begin
  233. Connect:=DoConnect(Sock,addr);
  234. if Connect then
  235. Sock2File(Sock,SockIn,SockOut);
  236. end;
  237. {$i sockets.inc}
  238. end.
  239. {
  240. $Log$
  241. Revision 1.2 2000-07-13 11:33:49 michael
  242. + removed logs
  243. }