unixsock.inc 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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. {$if not defined(cpux86_64) and not defined(NO_SYSCALL_SOCKETCALL)}
  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):cint; 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. internal_socketerror:=fpgeterrno;
  54. end;
  55. function SocketCall(SockCallNr,a1,a2,a3:TSysParam):cint;inline;
  56. begin
  57. SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
  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. internal_socketerror:=fpgeterrno;
  124. end;
  125. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  126. begin
  127. fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
  128. internal_socketerror:=fpgeterrno;
  129. end;
  130. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  131. begin
  132. fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
  133. internal_socketerror:=fpgeterrno;
  134. end;
  135. function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
  136. begin
  137. fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
  138. internal_socketerror:=fpgeterrno;
  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. internal_socketerror:=fpgeterrno;
  144. end;
  145. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  146. begin
  147. fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
  148. internal_socketerror:=fpgeterrno;
  149. end;
  150. function fplisten (s:cint; backlog : cint):cint;
  151. begin
  152. fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
  153. internal_socketerror:=fpgeterrno;
  154. end;
  155. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  156. begin
  157. fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
  158. internal_socketerror:=fpgeterrno;
  159. end;
  160. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  161. begin
  162. fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
  163. internal_socketerror:=fpgeterrno;
  164. end;
  165. function fpshutdown (s:cint; how:cint):cint;
  166. begin
  167. fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
  168. internal_socketerror:=fpgeterrno;
  169. end;
  170. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  171. begin
  172. fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
  173. internal_socketerror:=fpgeterrno;
  174. end;
  175. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  176. begin
  177. fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
  178. internal_socketerror:=fpgeterrno;
  179. end;
  180. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
  181. begin
  182. fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
  183. internal_socketerror:=fpgeterrno;
  184. end;
  185. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  186. begin
  187. fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
  188. internal_socketerror:=fpgeterrno;
  189. end;
  190. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  191. begin
  192. fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
  193. internal_socketerror:=fpgeterrno;
  194. end;
  195. {$endif NEED_do_syscall}