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
6   See the file COPYING.FPC, included in this distribution,
7   for details about the copyright.
8
9   socket call implementations for FreeBSD
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY;without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14}
15
16
17{******************************************************************************
18                          Basic Socket Functions
19******************************************************************************}
20
21function  fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
22Begin
23  fpSocket:=Do_Syscall(syscall_nr_socket,Domain,xtype,Protocol);
24  internal_socketerror:=fpgeterrno;
25End;
26
27function  fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
28begin
29  fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
30  internal_socketerror:=fpgeterrno;
31end;
32
33function  fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
34begin
35  fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
36  internal_socketerror:=fpgeterrno;
37end;
38
39function  fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
40begin
41  fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
42  internal_socketerror:=fpgeterrno;
43end;
44
45function  fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
46begin
47  fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
48  internal_socketerror:=fpgeterrno;
49end;
50
51function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
52begin
53  fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
54  internal_socketerror:=fpgeterrno;
55end;
56
57function  fplisten (s:cint; backlog : cint):cint;
58begin
59  fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
60  internal_socketerror:=fpgeterrno;
61end;
62
63function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
64begin
65  fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
66  internal_socketerror:=fpgeterrno;
67end;
68
69function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint;
70begin
71  fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
72  internal_socketerror:=fpgeterrno;
73end;
74
75function  fpshutdown (s:cint; how:cint):cint;
76begin
77  fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
78  internal_socketerror:=fpgeterrno;
79end;
80
81function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
82begin
83  fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
84  internal_socketerror:=fpgeterrno;
85end;
86
87function  fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
88begin
89  fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
90  internal_socketerror:=fpgeterrno;
91end;
92
93function  fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
94begin
95  fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
96  internal_socketerror:=fpgeterrno;
97end;
98
99function  fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
100begin
101  fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
102  internal_socketerror:=fpgeterrno;
103end;
104
105function  fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
106
107begin
108  fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
109  internal_socketerror:=fpgeterrno;
110end;
111
112(*
113{******************************************************************************
114                          Basic Socket Functions
115******************************************************************************}
116
117Function socket(Domain,SocketType,Protocol:Longint):Longint;
118begin
119  Socket:=Do_Syscall(syscall_nr_socket,Domain,SocketType,Protocol);
120end;
121
122Function CloseSocket (Sock:Longint):Longint;
123begin
124  if fpclose(Sock)=0 then
125    CloseSocket := 0 else
126    CloseSocket := -1;
127end;
128
129Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
130begin
131  Send:=do_syscall(syscall_nr_sendto,Sock,Longint(@Buf),BufLen,Flags,0,0);
132end;
133
134Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
135begin
136  Sendto:=do_syscall(syscall_nr_Sendto,Sock,Longint(@Buf),BufLen,Flags,Longint(@Addr),AddrLen);
137end;
138
139Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
140begin
141  Recv:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@Buf),BufLen,Flags,0,0);
142end;
143
144Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr ; AddrLen : Integer) : longint;
145
146begin
147  RecvFrom:=do_syscall(syscall_nr_Recvfrom,Sock,Longint(@buf),buflen,flags,Longint(@Addr),AddrLen);
148end;
149
150Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
151begin
152  Bind:=(do_syscall(syscall_nr_Bind,Sock,Longint(@Addr),AddrLen)=0);
153end;
154
155Function Listen(Sock,MaxConnect:Longint):Boolean;
156begin
157  Listen:=(do_syscall(syscall_nr_Listen,Sock,MaxConnect,0)=0);
158end;
159
160Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
161begin
162  Accept:=do_syscall(syscall_nr_accept,Sock,longint(@Addr),longint(@AddrLen));
163  If Accept<0 Then
164    Accept:=-1;
165end;
166
167Function Connect(Sock:Longint;Const Addr;Addrlen:Longint): boolean;
168
169begin
170  Connect:=do_syscall(syscall_nr_connect,Sock,longint(@Addr),AddrLen)=0;
171end;
172
173
174Function Shutdown(Sock:Longint;How:Longint):Longint;
175begin
176  ShutDown:=do_syscall(syscall_nr_shutdown,Sock,How);
177end;
178
179
180Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
181begin
182  GetSocketName:=do_syscall(syscall_nr_GetSockName,Sock,longint(@Addr),longint(@AddrLen));
183end;
184
185
186
187Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
188begin
189  GetPeerName:=do_syscall(syscall_nr_GetPeerName,Sock,longint(@Addr),longint(@AddrLen));
190end;
191
192
193
194Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
195begin
196  SetSocketOptions:=do_syscall(syscall_nr_SetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
197end;
198
199
200
201Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
202begin
203  GetSocketOptions:=do_syscall(syscall_nr_GetSockOpt,Sock,Level,OptName,Longint(@OptVal),OptLen,0);
204end;
205
206
207
208Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
209begin
210  SocketPair:=do_syscall(syscall_nr_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
211end;
212
213{******************************************************************************
214                               UnixSock
215******************************************************************************}
216
217Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint);
218begin
219  Move(Addr[1],t.Path,length(Addr));
220  t.Family:=AF_UNIX;
221  t.Path[length(Addr)]:=#0;
222  Len:=Length(Addr)+3;
223end;
224
225
226Function Bind(Sock:longint;const addr:string):boolean;
227var
228  UnixAddr : TUnixSockAddr;
229  AddrLen  : longint;
230begin
231  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
232  Bind(Sock,UnixAddr,AddrLen);
233  Bind:=(SocketError=0);
234end;
235
236
237
238Function DoAccept(Sock:longint;var addr:string):longint;
239var
240  UnixAddr : TUnixSockAddr;
241  AddrLen  : longint;
242begin
243  AddrLen:=length(addr)+3;
244  DoAccept:=Accept(Sock,UnixAddr,AddrLen);
245  Move(UnixAddr.Path,Addr[1],AddrLen);
246  SetLength(Addr,AddrLen);
247end;
248
249
250
251Function DoConnect(Sock:longint;const addr:string):Boolean;
252var
253  UnixAddr : TUnixSockAddr;
254  AddrLen  : longint;
255begin
256  Str2UnixSockAddr(addr,UnixAddr,AddrLen);
257  DoConnect:=Connect(Sock,UnixAddr,AddrLen);
258end;
259
260Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:text):Boolean;
261var
262  s : longint;
263begin
264  S:=DoAccept(Sock,addr);
265  if S>0 then
266   begin
267     Sock2Text(S,SockIn,SockOut);
268     Accept:=true;
269   end
270  else
271   Accept:=false;
272end;
273
274
275
276Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
277var
278  s : longint;
279begin
280  S:=DoAccept(Sock,addr);
281  if S>0 then
282   begin
283     Sock2File(S,SockIn,SockOut);
284     Accept:=true;
285   end
286  else
287   Accept:=false;
288end;
289
290
291
292Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:text):Boolean;
293begin
294  Connect:=DoConnect(Sock,addr);
295  If Connect then
296     Sock2Text(Sock,SockIn,SockOut);
297end;
298
299
300
301Function Connect(Sock:longint;const addr:string;var SockIn,SockOut:file):Boolean;
302begin
303  Connect:=DoConnect(Sock,addr);
304  if Connect then
305     Sock2File(Sock,SockIn,SockOut);
306end;
307
308  *)