fpc/rtl/netware/sockets.pp
armin cc769a33ea * support for fcl, support for linking without debug info
* renamed winsock2 to winsock for win32 compatinility
* new sockets unit for netware
* changes for compiler warnings
2003-03-25 18:17:54 +00:00

289 lines
6.6 KiB
ObjectPascal

{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by the Free Pascal development team
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{$mode objfpc}
{$R-}
unit Sockets;
Interface
Uses
winsock;
Const
AF_MAX = WinSock.AF_MAX;
PF_MAX = AF_MAX;
{$i socketsh.inc}
Implementation
{ Include filerec and textrec structures }
{$i filerec.inc}
{$i textrec.inc}
{******************************************************************************
Basic Socket Functions
******************************************************************************}
Function socket(Domain,SocketType,Protocol:Longint):Longint;
begin
Socket:=WinSock.Socket(Domain,SocketType,ProtoCol);
if Socket<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function CloseSocket(Sock:Longint):Longint;
var i : longint;
begin
i := Winsock.CloseSocket (Sock);
if i <> 0 then
begin
SocketError:=WSAGetLastError;
CloseSocket := i;
end else
begin
CloseSocket := 0;
SocketError := 0;
end;
end;
Function Send(Sock:Longint;const Buf;BufLen,Flags:Longint):Longint;
begin
Send:=WinSock.Send(Sock,Buf,BufLen,Flags);
if Send<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
begin
// Dubious construct, this should be checked.
SendTo:=WinSock.SendTo(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
if SendTo<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
begin
Recv:=WinSock.Recv(Sock,Buf,BufLen,Flags);
if Recv<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; AddrLen : Integer) : longint;
begin
RecvFrom:=WinSock.RecvFrom(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
if RecvFrom<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
var
l : longint;
begin
l:=WinSock.Bind(Sock,WinSock.PSockAddr(@Addr),AddrLen);
if l<0 then
begin
SocketError:=WSAGetLastError;
Bind:=false;
end
else
begin
SocketError:=0;
Bind:=true;
end;
end;
Function Listen(Sock,MaxConnect:Longint):Boolean;
var
l : longint;
begin
l:=WinSock.Listen(Sock,MaxConnect);
if l<0 then
begin
SocketError:=WSAGetLastError;
Listen:=false;
end
else
begin
SocketError:=0;
Listen:=true;
end;
end;
Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
Accept:=WinSock.Accept(Sock,WinSock.PSockAddr(@Addr),plongint(@AddrLen));
if Accept<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
begin
Connect:=WinSock.Connect(Sock,@WinSock.TSockAddr(Addr),AddrLen)=0;
if not Connect then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Shutdown(Sock:Longint;How:Longint):Longint;
begin
ShutDown:=WinSock.ShutDown(Sock,How);
if ShutDown<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
GetSocketName:=WinSock.GetSockName(Sock,WinSock.TSockAddr(Addr),AddrLen);
if GetSocketName<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
GetPeerName:=WinSock.GetPeerName(Sock,WinSock.TSockAddr(Addr),AddrLen);
if GetPeerName<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
begin
SetSocketOptions:=WinSock.SetSockOpt(Sock,Level,OptName,pchar(@OptVal),OptLen);
if SetSocketOptions<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
begin
GetSocketOptions:=WinSock.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
if GetSocketOptions<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
begin
// SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
end;
{ mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
function fdWrite(handle : longint;Const bufptr;size : dword) : dword;
begin
fdWrite := dword(WinSock.send(handle, bufptr, size, 0));
if fdWrite = dword(SOCKET_ERROR) then
begin
SocketError := WSAGetLastError;
fdWrite := 0;
end
else
SocketError := 0;
end;
function fdRead(handle : longint;var bufptr;size : dword) : dword;
var
d : dword;
begin
if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
begin
SocketError:=WSAGetLastError;
fdRead:=0;
exit;
end;
if d>0 then
begin
if size>d then
size:=d;
fdRead := dword(WinSock.recv(handle, bufptr, size, 0));
if fdRead = dword(SOCKET_ERROR) then
begin
SocketError:= WSAGetLastError;
fdRead := 0;
end else
SocketError:=0;
end
else
SocketError:=0;
end;
{$i sockets.inc}
{ winsocket stack needs an init. and cleanup code }
var
wsadata : twsadata;
initialization
WSAStartUp($2,wsadata);
finalization
WSACleanUp;
end.
{
$Log$
Revision 1.4 2003-03-25 18:17:54 armin
* support for fcl, support for linking without debug info
* renamed winsock2 to winsock for win32 compatinility
* new sockets unit for netware
* changes for compiler warnings
Revision 1.3 2003/03/23 17:47:15 armin
* CloseSocket added
Revision 1.10 2003/01/01 14:34:22 peter
* sendto overload
Revision 1.9 2002/09/07 16:01:29 peter
* old logs removed and tabs fixed
Revision 1.8 2002/07/17 07:28:21 pierre
* avoid constant evaluation problems if cycling with -Cr
Revision 1.7 2002/02/04 21:41:15 michael
+ merged ixed syntax
Revision 1.6 2002/02/04 21:29:34 michael
+ merged missing sendto/rcvfrom functions
}