nwsock.inc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. {! completely untested !}
  2. {******************************************************************************
  3. Import Socket Functions from nlmlib
  4. ******************************************************************************}
  5. CONST SockLib = 'nlmlib.nlm';
  6. Function _NWsocket(Domain,SocketType,Protocol:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'socket';
  7. Function _NWSend(Sock:Longint;Const Addr;AddrLen,Flags:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'send';
  8. Function _NWSendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint; Var Addr; AddrLen : longint):Longint; CDECL; EXTERNAL SockLib NAME 'sendto';
  9. Function _NWRecv(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'recv';
  10. Function _NWRecvFrom(Sock:Longint;Var Buf;BufLen,Flags:Longint; Var Addr; AddrLen : Longint):Longint; CDECL; EXTERNAL SockLib NAME 'recvfrom';
  11. Function _NWBind(Sock:Longint;Const Addr;AddrLen:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'bind';
  12. Function _NWListen(Sock,MaxConnect:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'listen';
  13. Function _NWAccept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'accept';
  14. Function _NWConnect(Sock:Longint;Const Addr;Addrlen:Longint): longint; CDECL; EXTERNAL SockLib NAME 'connect';
  15. Function _NWShutdown(Sock:Longint;How:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'shutdown';
  16. Function _NWGetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'getsocketname';
  17. Function _NWGetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint; CDECL; EXTERNAL SockLib NAME 'getpeername';
  18. Function _NWSetSockOpt(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint; CDECL; EXTERNAL SockLib NAME 'setsockopt';
  19. Function _NWGetSockOpt(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint; CDECL; EXTERNAL SockLib NAME 'getsockopt';
  20. {******************************************************************************
  21. Basic Socket Functions
  22. ******************************************************************************}
  23. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  24. begin
  25. Socket:=_NWSocket(Domain,SocketType,Protocol);
  26. end;
  27. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  28. begin
  29. Send:=_NWSend(Sock,Buf,BufLen,Flags);
  30. end;
  31. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  32. begin
  33. SendTo := _NWSendTo (Sock, Buf, BufLen, Flags, Addr, AddrLen);
  34. end;
  35. Function Recv(Sock:Longint;Var Buf; BufLen,Flags:Longint):Longint;
  36. begin
  37. Recv:=_NWRecv(Sock,Buf,BufLen,Flags);
  38. end;
  39. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
  40. begin
  41. RecvFrom := _NWRecvFrom (Sock, Buf, BufLen, Flags, Addr, AddrLen);
  42. end;
  43. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  44. begin
  45. Bind:=(_NWBind(Sock,Addr,AddrLen)=0);
  46. end;
  47. Function Listen(Sock,MaxConnect:Longint):Boolean;
  48. begin
  49. Listen:=(_NWListen(Sock,MaxConnect)=0);
  50. end;
  51. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  52. begin
  53. Accept:=_NWAccept(Sock,Addr,AddrLen);
  54. If Accept<0 Then
  55. Accept:=-1;
  56. end;
  57. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
  58. begin
  59. Connect:=_NWConnect(Sock,Addr,AddrLen)=0;
  60. end;
  61. Function Shutdown(Sock:Longint;How:Longint):Longint;
  62. begin
  63. ShutDown:=_NWShutdown(Sock,How);
  64. end;
  65. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  66. begin
  67. GetSocketName:=_NWGetSocketName(Sock,Addr,AddrLen);
  68. end;
  69. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  70. begin
  71. GetPeerName:=_NWGetPeerName(Sock,Addr,AddrLen);
  72. end;
  73. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  74. begin
  75. SetSocketOptions:=_NWSetsockopt(Sock,Level,OptName,OptVal,OptLen);
  76. end;
  77. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  78. begin
  79. GetSocketOptions:=_NWGetsockopt(Sock,Level,OptName,OptVal,OptLen);
  80. end;
  81. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  82. begin
  83. //SocketPair:=do_syscall(syscall_nr_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  84. Socketpair := -1;
  85. end;
  86. {******************************************************************************
  87. UnixSock
  88. ******************************************************************************}
  89. Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
  90. begin
  91. Move(Addr[1],t.Path,length(Addr));
  92. t.Family:=AF_UNIX;
  93. t.Path[length(Addr)]:=#0;
  94. Len:=Length(Addr)+3;
  95. end;
  96. Function Bind(Sock:longint;const addr:string):boolean;
  97. var
  98. UnixAddr : TUnixSockAddr;
  99. AddrLen : longint;
  100. begin
  101. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  102. Bind(Sock,UnixAddr,AddrLen);
  103. Bind:=(SocketError=0);
  104. end;
  105. Function DoAccept(Sock:longint;var addr:string):longint;
  106. var
  107. UnixAddr : TUnixSockAddr;
  108. AddrLen : longint;
  109. begin
  110. AddrLen:=length(addr)+3;
  111. DoAccept:=Accept(Sock,UnixAddr,AddrLen);
  112. Move(UnixAddr.Path,Addr[1],AddrLen);
  113. SetLength(Addr,AddrLen);
  114. end;
  115. Function DoConnect(Sock:longint;const addr:string):Boolean;
  116. var
  117. UnixAddr : TUnixSockAddr;
  118. AddrLen : longint;
  119. begin
  120. Str2UnixSockAddr(addr,UnixAddr,AddrLen);
  121. DoConnect:=Connect(Sock,UnixAddr,AddrLen);
  122. end;
  123. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
  124. var
  125. s : longint;
  126. begin
  127. S:=DoAccept(Sock,addr);
  128. if S>0 then
  129. begin
  130. Sock2Text(S,SockIn,SockOut);
  131. Accept:=true;
  132. end
  133. else
  134. Accept:=false;
  135. end;
  136. Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
  137. var
  138. s : longint;
  139. begin
  140. S:=DoAccept(Sock,addr);
  141. if S>0 then
  142. begin
  143. Sock2File(S,SockIn,SockOut);
  144. Accept:=true;
  145. end
  146. else
  147. Accept:=false;
  148. end;
  149. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
  150. begin
  151. Connect:=DoConnect(Sock,addr);
  152. If Connect then
  153. Sock2Text(Sock,SockIn,SockOut);
  154. end;
  155. Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
  156. begin
  157. Connect:=DoConnect(Sock,addr);
  158. if Connect then
  159. Sock2File(Sock,SockIn,SockOut);
  160. end;
  161. // fsread and fswrite are used in socket.inc
  162. procedure fdwrite (Handle:longint; VAR Data; Len : LONGINT);
  163. begin
  164. { this has to be checked: }
  165. _NWSend(Handle,Data,Len,0);
  166. end;
  167. function fdread (Handle:longint; VAR Data; Len : LONGINT) : LONGINT;
  168. begin
  169. { this has to be checked: }
  170. fdread := _NWRecv(Handle,Data,Len,0);
  171. end;