unixsock.inc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. {******************************************************************************
  14. Basic Socket Functions
  15. ******************************************************************************}
  16. Const
  17. {
  18. Arguments to the Linux Kernel system call for sockets. All
  19. Socket Connected calls go through the same system call,
  20. with an extra argument to determine what action to take.
  21. }
  22. Socket_Sys_SOCKET = 1;
  23. Socket_Sys_BIND = 2;
  24. Socket_Sys_CONNECT = 3;
  25. Socket_Sys_LISTEN = 4;
  26. Socket_Sys_ACCEPT = 5;
  27. Socket_Sys_GETSOCKNAME = 6;
  28. Socket_Sys_GETPEERNAME = 7;
  29. Socket_Sys_SOCKETPAIR = 8;
  30. Socket_Sys_SEND = 9;
  31. Socket_Sys_RECV = 10;
  32. Socket_Sys_SENDTO = 11;
  33. Socket_Sys_RECVFROM = 12;
  34. Socket_Sys_SHUTDOWN = 13;
  35. Socket_Sys_SETSOCKOPT = 14;
  36. Socket_Sys_GETSOCKOPT = 15;
  37. Socket_Sys_SENDMSG = 16;
  38. Socket_Sys_RECVMSG = 17;
  39. Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:longint):longint;
  40. var
  41. Args:array[1..6] of longint;
  42. begin
  43. args[1]:=a1;
  44. args[2]:=a2;
  45. args[3]:=a3;
  46. args[4]:=a4;
  47. args[5]:=a5;
  48. args[6]:=a6;
  49. SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,longint(@args));
  50. If SocketCall<0 then
  51. SocketError:=fpgetErrno
  52. else
  53. SocketError:=0;
  54. end;
  55. Function SocketCall(SockCallNr,a1,a2,a3:longint):longint;
  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,optname,TSysParam(optval),optlen,0,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. {
  120. $Log$
  121. Revision 1.11 2004-03-20 15:19:29 marco
  122. * *BSD do_syscall was left behind. Replaced with socketcall
  123. Revision 1.10 2004/03/16 18:03:37 marco
  124. * first changes sockets units
  125. Revision 1.9 2004/01/03 12:18:29 marco
  126. * a lot of copyright notices and CVS logs added and fixed
  127. Revision 1.8 2003/09/15 07:09:58 marco
  128. * small fixes, round 1
  129. Revision 1.7 2003/03/23 17:47:15 armin
  130. * CloseSocket added
  131. Revision 1.6 2002/09/07 16:01:18 peter
  132. * old logs removed and tabs fixed
  133. Revision 1.5 2002/02/05 07:54:34 marco
  134. * Fixed typo
  135. }