2
0

unixsock.inc 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. (c) 2004 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. socket call implementations for Linux
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY;without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. }
  13. {$ifndef cpux86_64}
  14. {$define NEED_SOCKETCALL}
  15. {$endif}
  16. {******************************************************************************
  17. Basic Socket Functions
  18. ******************************************************************************}
  19. {$ifdef NEED_SOCKETCALL}
  20. Const
  21. {
  22. Arguments to the Linux Kernel system call for sockets. All
  23. Socket Connected calls go through the same system call,
  24. with an extra argument to determine what action to take.
  25. }
  26. Socket_Sys_SOCKET = 1;
  27. Socket_Sys_BIND = 2;
  28. Socket_Sys_CONNECT = 3;
  29. Socket_Sys_LISTEN = 4;
  30. Socket_Sys_ACCEPT = 5;
  31. Socket_Sys_GETSOCKNAME = 6;
  32. Socket_Sys_GETPEERNAME = 7;
  33. Socket_Sys_SOCKETPAIR = 8;
  34. Socket_Sys_SEND = 9;
  35. Socket_Sys_RECV = 10;
  36. Socket_Sys_SENDTO = 11;
  37. Socket_Sys_RECVFROM = 12;
  38. Socket_Sys_SHUTDOWN = 13;
  39. Socket_Sys_SETSOCKOPT = 14;
  40. Socket_Sys_GETSOCKOPT = 15;
  41. Socket_Sys_SENDMSG = 16;
  42. Socket_Sys_RECVMSG = 17;
  43. Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:longint):longint;
  44. var
  45. Args:array[1..6] of longint;
  46. begin
  47. args[1]:=a1;
  48. args[2]:=a2;
  49. args[3]:=a3;
  50. args[4]:=a4;
  51. args[5]:=a5;
  52. args[6]:=a6;
  53. SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,longint(@args));
  54. If SocketCall<0 then
  55. SocketError:=fpgetErrno
  56. else
  57. SocketError:=0;
  58. end;
  59. function SocketCall(SockCallNr,a1,a2,a3:longint):longint;
  60. begin
  61. SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
  62. end;
  63. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  64. begin
  65. fpSocket:=SocketCall(Socket_Sys_socket,Domain,xtype,Protocol);
  66. end;
  67. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  68. begin
  69. fpSend:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,0,0);
  70. end;
  71. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  72. begin
  73. fpSendto:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
  74. end;
  75. function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
  76. begin
  77. fpRecv:=SocketCall(Socket_Sys_Recvfrom,S,tsysparam(buf),len,flags,0,0);
  78. end;
  79. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  80. begin
  81. fpRecvFrom:=SocketCall(Socket_Sys_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
  82. end;
  83. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  84. begin
  85. fpBind:=SocketCall(Socket_Sys_Bind,S,TSysParam(addrx),addrlen);
  86. end;
  87. function fplisten (s:cint; backlog : cint):cint;
  88. begin
  89. fpListen:=SocketCall(Socket_Sys_Listen,S,backlog,0);
  90. end;
  91. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  92. begin
  93. fpAccept:=SocketCall(Socket_Sys_accept,S,TSysParam(addrx),TSysParam(addrlen));
  94. end;
  95. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  96. begin
  97. fpConnect:=SocketCall(Socket_Sys_connect,S,TSysParam(name),namelen);
  98. end;
  99. function fpshutdown (s:cint; how:cint):cint;
  100. begin
  101. fpShutDown:=SocketCall(Socket_Sys_shutdown,S,how,0);
  102. end;
  103. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  104. begin
  105. fpGetSockName:=SocketCall(Socket_Sys_GetSockName,S,TSysParam(name),TSysParam(namelen));
  106. end;
  107. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  108. begin
  109. fpGetPeerName:=SocketCall(Socket_Sys_GetPeerName,S,TSysParam(name),TSysParam(namelen));
  110. end;
  111. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
  112. begin
  113. fpSetSockOpt:=SocketCall(Socket_Sys_SetSockOpt,S,level,optname,TSysParam(optval),optlen,0);
  114. end;
  115. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  116. begin
  117. fpGetSockOpt:=SocketCall(Socket_Sys_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen),0);
  118. end;
  119. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  120. begin
  121. fpSocketPair:=SocketCall(Socket_Sys_SocketPair,d,xtype,protocol,TSysParam(sv),0,0);
  122. end;
  123. {$else NEED_SOCKETCALL}
  124. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  125. begin
  126. fpSocket:=do_syscall(syscall_nr_socket,Domain,xtype,Protocol);
  127. end;
  128. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  129. begin
  130. fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags);
  131. end;
  132. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  133. begin
  134. fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
  135. end;
  136. function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
  137. begin
  138. fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags);
  139. end;
  140. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  141. begin
  142. fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
  143. end;
  144. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  145. begin
  146. fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
  147. end;
  148. function fplisten (s:cint; backlog : cint):cint;
  149. begin
  150. fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
  151. end;
  152. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  153. begin
  154. fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
  155. end;
  156. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  157. begin
  158. fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
  159. end;
  160. function fpshutdown (s:cint; how:cint):cint;
  161. begin
  162. fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
  163. end;
  164. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  165. begin
  166. fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
  167. end;
  168. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  169. begin
  170. fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
  171. end;
  172. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
  173. begin
  174. fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
  175. end;
  176. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  177. begin
  178. fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
  179. end;
  180. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  181. begin
  182. fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
  183. end;
  184. {$endif NEED_do_syscall}
  185. {
  186. $Log$
  187. Revision 1.13 2004-04-22 17:17:23 peter
  188. * x86-64 fixes
  189. Revision 1.12 2004/03/22 06:49:28 marco
  190. * more fixes from Lloyd
  191. Revision 1.11 2004/03/20 15:19:29 marco
  192. * *BSD do_syscall was left behind. Replaced with socketcall
  193. Revision 1.10 2004/03/16 18:03:37 marco
  194. * first changes sockets units
  195. Revision 1.9 2004/01/03 12:18:29 marco
  196. * a lot of copyright notices and CVS logs added and fixed
  197. Revision 1.8 2003/09/15 07:09:58 marco
  198. * small fixes, round 1
  199. Revision 1.7 2003/03/23 17:47:15 armin
  200. * CloseSocket added
  201. Revision 1.6 2002/09/07 16:01:18 peter
  202. * old logs removed and tabs fixed
  203. Revision 1.5 2002/02/05 07:54:34 marco
  204. * Fixed typo
  205. }