sockets.pp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1993,97 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. Var FD : Longint;
  223. begin
  224. Connect:=DoConnect(Sock,addr);
  225. If Connect then
  226. Sock2Text(Sock,SockIn,SockOut);
  227. end;
  228. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  229. begin
  230. Connect:=DoConnect(Sock,addr);
  231. if Connect then
  232. Sock2File(Sock,SockIn,SockOut);
  233. end;
  234. {$i sockets.inc}
  235. end.
  236. {
  237. $Log$
  238. Revision 1.9 1999-07-03 15:16:47 michael
  239. + Fixed Connect call
  240. Revision 1.8 1999/06/27 16:04:25 michael
  241. + Updated to Florians system independent sockets unit
  242. Revision 1.7 1999/06/08 18:35:24 michael
  243. + Beter return values for connect and accept
  244. Revision 1.6 1999/06/08 18:19:24 michael
  245. + Fixes for connect calls
  246. Revision 1.5 1999/06/08 16:08:33 michael
  247. + completed (hopefully) Fix by stian ([email protected])
  248. Revision 1.4 1999/06/08 16:05:08 michael
  249. + Fix by stian ([email protected])
  250. Revision 1.3 1998/11/16 10:21:30 peter
  251. * fixes for H+
  252. Revision 1.2 1998/07/16 10:36:45 michael
  253. + added connect call for inet sockets
  254. Revision 1.1.1.1 1998/03/25 11:18:43 root
  255. * Restored version
  256. Revision 1.1 1998/02/13 08:35:05 michael
  257. + Initial implementation
  258. }