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 *)