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