unixsock.inc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. {
  2. This file is part of the Free Pascal run time library.
  3. (c) 2000-2003 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 FreeBSD
  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. {******************************************************************************
  13. Basic Socket Functions
  14. ******************************************************************************}
  15. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  16. begin
  17. Socket:=Do_Syscall(syscall_nr_socket,Domain,SocketType,Protocol);
  18. end;
  19. Function CloseSocket (Sock:Longint):Longint;
  20. begin
  21. if fpclose(Sock)=0 then
  22. CloseSocket := 0 else
  23. CloseSocket := -1;
  24. end;
  25. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  26. begin
  27. Send:=do_syscall(syscall_nr_sendto,Sock,Longint(@Buf),BufLen,Flags,0,0);
  28. end;
  29. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  30. begin
  31. Sendto:=do_syscall(syscall_nr_Sendto,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
  32. end;
  33. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  34. begin
  35. Recv:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@Buf),BufLen,Flags,0,0);
  36. end;
  37. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
  38. begin
  39. RecvFrom:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
  40. end;
  41. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  42. begin
  43. Bind:=(do_syscall(syscall_nr_Bind,Sock,Longint(@Addr),AddrLen)=0);
  44. end;
  45. Function Listen(Sock,MaxConnect:Longint):Boolean;
  46. begin
  47. Listen:=(do_syscall(syscall_nr_Listen,Sock,MaxConnect,0)=0);
  48. end;
  49. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  50. begin
  51. Accept:=do_syscall(syscall_nr_accept,Sock,longint(@Addr),longint(@AddrLen));
  52. If Accept<0 Then
  53. Accept:=-1;
  54. end;
  55. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
  56. begin
  57. Connect:=do_syscall(syscall_nr_connect,Sock,longint(@Addr),AddrLen)=0;
  58. end;
  59. Function Shutdown(Sock:Longint;How:Longint):Longint;
  60. begin
  61. ShutDown:=do_syscall(syscall_nr_shutdown,Sock,How);
  62. end;
  63. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  64. begin
  65. GetSocketName:=do_syscall(syscall_nr_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
  66. end;
  67. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  68. begin
  69. GetPeerName:=do_syscall(syscall_nr_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
  70. end;
  71. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  72. begin
  73. SetSocketOptions:=do_syscall(syscall_nr_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  74. end;
  75. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  76. begin
  77. GetSocketOptions:=do_syscall(syscall_nr_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
  78. end;
  79. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  80. begin
  81. SocketPair:=do_syscall(syscall_nr_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  82. end;
  83. {******************************************************************************
  84. UnixSock
  85. ******************************************************************************}
  86. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  87. begin
  88. Move(Addr[1],t.Path,length(Addr));
  89. t.Family:=AF_UNIX;
  90. t.Path[length(Addr)]:=#0;
  91. Len:=Length(Addr)+3;
  92. end;
  93. Function Bind(Sock:longint;const addr:string):boolean;
  94. var
  95. UnixAddr : TUnixSockAddr;
  96. AddrLen : longint;
  97. begin
  98. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  99. Bind(Sock,UnixAddr,AddrLen);
  100. Bind:=(SocketError=0);
  101. end;
  102. Function DoAccept(Sock:longint;var addr:string):longint;
  103. var
  104. UnixAddr : TUnixSockAddr;
  105. AddrLen : longint;
  106. begin
  107. AddrLen:=length(addr)+3;
  108. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  109. Move(UnixAddr.Path,Addr[1],AddrLen);
  110. SetLength(Addr,AddrLen);
  111. end;
  112. Function DoConnect(Sock:longint;const addr:string):Boolean;
  113. var
  114. UnixAddr : TUnixSockAddr;
  115. AddrLen : longint;
  116. begin
  117. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  118. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  119. end;
  120. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  121. var
  122. s : longint;
  123. begin
  124. S:=DoAccept(Sock,addr);
  125. if S>0 then
  126. begin
  127. Sock2Text(S,SockIn,SockOut);
  128. Accept:=true;
  129. end
  130. else
  131. Accept:=false;
  132. end;
  133. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  134. var
  135. s : longint;
  136. begin
  137. S:=DoAccept(Sock,addr);
  138. if S>0 then
  139. begin
  140. Sock2File(S,SockIn,SockOut);
  141. Accept:=true;
  142. end
  143. else
  144. Accept:=false;
  145. end;
  146. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  147. begin
  148. Connect:=DoConnect(Sock,addr);
  149. If Connect then
  150. Sock2Text(Sock,SockIn,SockOut);
  151. end;
  152. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  153. begin
  154. Connect:=DoConnect(Sock,addr);
  155. if Connect then
  156. Sock2File(Sock,SockIn,SockOut);
  157. end;