unixsock.inc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. {
  2. This file is part of the Free Pascal run time library.
  3. (c) 2004 by Marco van de Voort
  4. member of the Free Pascal development team.
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. socket call implementations for Linux
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY;without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. }
  12. {$ifndef cpux86_64}
  13. {$define NEED_SOCKETCALL}
  14. {$endif}
  15. {******************************************************************************
  16. Basic Socket Functions
  17. ******************************************************************************}
  18. {$ifdef NEED_SOCKETCALL}
  19. Const
  20. {
  21. Arguments to the Linux Kernel system call for sockets. All
  22. Socket Connected calls go through the same system call,
  23. with an extra argument to determine what action to take.
  24. }
  25. Socket_Sys_SOCKET = 1;
  26. Socket_Sys_BIND = 2;
  27. Socket_Sys_CONNECT = 3;
  28. Socket_Sys_LISTEN = 4;
  29. Socket_Sys_ACCEPT = 5;
  30. Socket_Sys_GETSOCKNAME = 6;
  31. Socket_Sys_GETPEERNAME = 7;
  32. Socket_Sys_SOCKETPAIR = 8;
  33. Socket_Sys_SEND = 9;
  34. Socket_Sys_RECV = 10;
  35. Socket_Sys_SENDTO = 11;
  36. Socket_Sys_RECVFROM = 12;
  37. Socket_Sys_SHUTDOWN = 13;
  38. Socket_Sys_SETSOCKOPT = 14;
  39. Socket_Sys_GETSOCKOPT = 15;
  40. Socket_Sys_SENDMSG = 16;
  41. Socket_Sys_RECVMSG = 17;
  42. Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:TSysParam):longint; inline;
  43. var
  44. Args:array[1..6] of TSysParam;
  45. begin
  46. args[1]:=a1;
  47. args[2]:=a2;
  48. args[3]:=a3;
  49. args[4]:=a4;
  50. args[5]:=a5;
  51. args[6]:=a6;
  52. SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,TSysParam(@args));
  53. end;
  54. function SocketCall(SockCallNr,a1,a2,a3:TSysParam):longint;
  55. begin
  56. SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
  57. internal_socketerror:=fpgeterrno;
  58. end;
  59. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  60. begin
  61. fpSocket:=SocketCall(Socket_Sys_socket,Domain,xtype,Protocol);
  62. end;
  63. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  64. begin
  65. fpSend:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,0,0);
  66. end;
  67. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  68. begin
  69. fpSendto:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
  70. end;
  71. function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
  72. begin
  73. fpRecv:=SocketCall(Socket_Sys_Recvfrom,S,tsysparam(buf),len,flags,0,0);
  74. end;
  75. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  76. begin
  77. fpRecvFrom:=SocketCall(Socket_Sys_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
  78. end;
  79. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  80. begin
  81. fpBind:=SocketCall(Socket_Sys_Bind,S,TSysParam(addrx),addrlen);
  82. end;
  83. function fplisten (s:cint; backlog : cint):cint;
  84. begin
  85. fpListen:=SocketCall(Socket_Sys_Listen,S,backlog,0);
  86. end;
  87. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  88. begin
  89. fpAccept:=SocketCall(Socket_Sys_accept,S,TSysParam(addrx),TSysParam(addrlen));
  90. end;
  91. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  92. begin
  93. fpConnect:=SocketCall(Socket_Sys_connect,S,TSysParam(name),namelen);
  94. end;
  95. function fpshutdown (s:cint; how:cint):cint;
  96. begin
  97. fpShutDown:=SocketCall(Socket_Sys_shutdown,S,how,0);
  98. end;
  99. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  100. begin
  101. fpGetSockName:=SocketCall(Socket_Sys_GetSockName,S,TSysParam(name),TSysParam(namelen));
  102. end;
  103. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  104. begin
  105. fpGetPeerName:=SocketCall(Socket_Sys_GetPeerName,S,TSysParam(name),TSysParam(namelen));
  106. end;
  107. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
  108. begin
  109. fpSetSockOpt:=SocketCall(Socket_Sys_SetSockOpt,S,level,optname,TSysParam(optval),optlen,0);
  110. end;
  111. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  112. begin
  113. fpGetSockOpt:=SocketCall(Socket_Sys_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen),0);
  114. end;
  115. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  116. begin
  117. fpSocketPair:=SocketCall(Socket_Sys_SocketPair,d,xtype,protocol,TSysParam(sv),0,0);
  118. end;
  119. {$else NEED_SOCKETCALL}
  120. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  121. begin
  122. fpSocket:=do_syscall(syscall_nr_socket,Domain,xtype,Protocol);
  123. end;
  124. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  125. begin
  126. fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
  127. end;
  128. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  129. begin
  130. fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
  131. end;
  132. function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
  133. begin
  134. fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
  135. end;
  136. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  137. begin
  138. fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
  139. end;
  140. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  141. begin
  142. fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
  143. end;
  144. function fplisten (s:cint; backlog : cint):cint;
  145. begin
  146. fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
  147. end;
  148. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  149. begin
  150. fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
  151. end;
  152. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  153. begin
  154. fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
  155. end;
  156. function fpshutdown (s:cint; how:cint):cint;
  157. begin
  158. fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
  159. end;
  160. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  161. begin
  162. fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
  163. end;
  164. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  165. begin
  166. fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
  167. end;
  168. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
  169. begin
  170. fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
  171. end;
  172. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  173. begin
  174. fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
  175. end;
  176. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  177. begin
  178. fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
  179. end;
  180. {$endif NEED_do_syscall}