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