sockets.pp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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. args[1]:=a1;
  84. args[2]:=a2;
  85. args[3]:=a3;
  86. args[4]:=a4;
  87. args[5]:=a5;
  88. args[6]:=a6;
  89. regs.reg2:=SockCallNr;
  90. regs.reg3:=Longint(@args);
  91. SocketCall:=Syscall(syscall_nr_socketcall,regs);
  92. If SocketCall<0 then
  93. SocketError:=Errno
  94. else
  95. SocketError:=0;
  96. end;
  97. Function SocketCall(SockCallNr,a1,a2,a3:longint):longint;
  98. begin
  99. SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
  100. end;
  101. {******************************************************************************
  102. Basic Socket Functions
  103. ******************************************************************************}
  104. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  105. begin
  106. Socket:=SocketCall(Socket_Sys_Socket,Domain,SocketType,ProtoCol);
  107. end;
  108. Function Send(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
  109. begin
  110. Send:=SocketCall(Socket_Sys_Send,Sock,Longint(@Addr),AddrLen,Flags,0,0);
  111. end;
  112. Function Recv(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
  113. begin
  114. Recv:=SocketCall(Socket_Sys_Recv,Sock,Longint(@Addr),AddrLen,Flags,0,0);
  115. end;
  116. Function Bind(Sock:Longint;Var Addr;AddrLen:Longint):Boolean;
  117. begin
  118. Bind:=(SocketCall(Socket_Sys_Bind,Sock,Longint(@Addr),AddrLen)=0);
  119. end;
  120. Function Listen(Sock,MaxConnect:Longint):Boolean;
  121. begin
  122. Listen:=(SocketCall(Socket_Sys_Listen,Sock,MaxConnect,0)=0);
  123. end;
  124. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  125. begin
  126. Accept:=SocketCall(Socket_Sys_Accept,Sock,longint(@Addr),longint(@AddrLen));
  127. If Accept<0 Then
  128. Accept:=-1;
  129. end;
  130. Function Connect(Sock:Longint;Var Addr;Addrlen:Longint): boolean;
  131. begin
  132. Connect:=SocketCall(Socket_Sys_Connect,Sock,longint(@Addr),AddrLen)=0;
  133. end;
  134. Function Shutdown(Sock:Longint;How:Longint):Longint;
  135. begin
  136. ShutDown:=SocketCall(Socket_Sys_ShutDown,Sock,How,0);
  137. end;
  138. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  139. begin
  140. GetSocketName:=SocketCall(Socket_Sys_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
  141. end;
  142. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  143. begin
  144. GetPeerName:=SocketCall(Socket_Sys_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
  145. end;
  146. Function SetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;optlen:longint):Longint;
  147. begin
  148. SetSocketOptions:=SocketCall(Socket_Sys_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  149. end;
  150. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;optlen:longint):Longint;
  151. begin
  152. GetSocketOptions:=SocketCall(Socket_Sys_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  153. end;
  154. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  155. begin
  156. SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  157. end;
  158. {******************************************************************************
  159. UnixSock
  160. ******************************************************************************}
  161. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  162. begin
  163. Move(Addr[1],t.Path,length(Addr));
  164. t.Family:=AF_UNIX;
  165. t.Path[length(Addr)]:=#0;
  166. Len:=Length(Addr)+3;
  167. end;
  168. Function Bind(Sock:longint;const addr:string):boolean;
  169. var
  170. UnixAddr : TUnixSockAddr;
  171. AddrLen : longint;
  172. begin
  173. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  174. Bind(Sock,UnixAddr,AddrLen);
  175. Bind:=(SocketError=0);
  176. end;
  177. Function DoAccept(Sock:longint;var addr:string):longint;
  178. var
  179. UnixAddr : TUnixSockAddr;
  180. AddrLen : longint;
  181. begin
  182. AddrLen:=length(addr)+3;
  183. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  184. Move(UnixAddr.Path,Addr[1],AddrLen);
  185. SetLength(Addr,AddrLen);
  186. end;
  187. Function DoConnect(Sock:longint;const addr:string):Boolean;
  188. var
  189. UnixAddr : TUnixSockAddr;
  190. AddrLen : longint;
  191. begin
  192. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  193. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  194. end;
  195. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  196. var
  197. s : longint;
  198. begin
  199. S:=DoAccept(Sock,addr);
  200. if S>0 then
  201. begin
  202. Sock2Text(S,SockIn,SockOut);
  203. Accept:=true;
  204. end
  205. else
  206. Accept:=false;
  207. end;
  208. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  209. var
  210. s : longint;
  211. begin
  212. S:=DoAccept(Sock,addr);
  213. if S>0 then
  214. begin
  215. Sock2File(S,SockIn,SockOut);
  216. Accept:=true;
  217. end
  218. else
  219. Accept:=false;
  220. end;
  221. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  222. begin
  223. Connect:=DoConnect(Sock,addr);
  224. If Connect then
  225. Sock2Text(Sock,SockIn,SockOut);
  226. end;
  227. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  228. begin
  229. Connect:=DoConnect(Sock,addr);
  230. if Connect then
  231. Sock2File(Sock,SockIn,SockOut);
  232. end;
  233. {$i sockets.inc}
  234. end.
  235. {
  236. $Log$
  237. Revision 1.13 2000-02-09 16:59:32 peter
  238. * truncated log
  239. Revision 1.12 2000/01/07 16:41:41 daniel
  240. * copyright 2000
  241. Revision 1.11 2000/01/07 16:32:28 daniel
  242. * copyright 2000 added
  243. Revision 1.10 1999/11/14 21:35:04 peter
  244. * removed warnings
  245. }