sockets.pp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  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. 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.10 1999-11-14 21:35:04 peter
  238. * removed warnings
  239. Revision 1.9 1999/07/03 15:16:47 michael
  240. + Fixed Connect call
  241. Revision 1.8 1999/06/27 16:04:25 michael
  242. + Updated to Florians system independent sockets unit
  243. Revision 1.7 1999/06/08 18:35:24 michael
  244. + Beter return values for connect and accept
  245. Revision 1.6 1999/06/08 18:19:24 michael
  246. + Fixes for connect calls
  247. Revision 1.5 1999/06/08 16:08:33 michael
  248. + completed (hopefully) Fix by stian ([email protected])
  249. Revision 1.4 1999/06/08 16:05:08 michael
  250. + Fix by stian ([email protected])
  251. Revision 1.3 1998/11/16 10:21:30 peter
  252. * fixes for H+
  253. Revision 1.2 1998/07/16 10:36:45 michael
  254. + added connect call for inet sockets
  255. Revision 1.1.1.1 1998/03/25 11:18:43 root
  256. * Restored version
  257. Revision 1.1 1998/02/13 08:35:05 michael
  258. + Initial implementation
  259. }