initial checkin
This commit is contained in:
167
bepascal/source/bepascal/pas/src/be/net/_socket.pp
Normal file
167
bepascal/source/bepascal/pas/src/be/net/_socket.pp
Normal file
@@ -0,0 +1,167 @@
|
||||
unit _socket;
|
||||
// BSD socket-like interface
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
SupportDefs;
|
||||
|
||||
{$PACKRECORDS C}
|
||||
|
||||
// This one belongs to posix/time.h
|
||||
// We need to find a better place for it.
|
||||
type
|
||||
timeval = record
|
||||
tv_sec,
|
||||
tv_usec : Longint;
|
||||
end;
|
||||
Ptimeval = ^timeval;
|
||||
|
||||
const
|
||||
kBeNETLibName = 'net';
|
||||
|
||||
const
|
||||
AF_INET = 1;
|
||||
|
||||
INADDR_ANY = $00000000;
|
||||
INADDR_BROADCAST = $ffffffff;
|
||||
INADDR_LOOPBACK = $7f000001; // in host order
|
||||
|
||||
SOL_SOCKET = 1;
|
||||
|
||||
SO_DEBUG = 1;
|
||||
SO_REUSEADDR = 2;
|
||||
SO_NONBLOCK = 3;
|
||||
SO_REUSEPORT = 4;
|
||||
|
||||
MSG_OOB = $1;
|
||||
|
||||
SOCK_DGRAM = 1;
|
||||
SOCK_STREAM = 2;
|
||||
|
||||
IPPROTO_UDP = 1;
|
||||
IPPROTO_TCP = 2;
|
||||
IPPROTO_ICMP = 3;
|
||||
|
||||
// Be extension
|
||||
B_UDP_MAX_SIZE = (65536 - 1024);
|
||||
|
||||
type
|
||||
sockaddr = record
|
||||
sa_family : Word;
|
||||
sa_data : array[0..9] of Byte;
|
||||
end;
|
||||
Psockaddr = ^sockaddr;
|
||||
|
||||
in_addr = record
|
||||
s_addr : Longword;
|
||||
end;
|
||||
|
||||
sockaddr_in = record
|
||||
sin_family,
|
||||
sin_port : Word;
|
||||
sin_addr : in_addr;
|
||||
sin_zero : array[0..3] of Byte;
|
||||
end;
|
||||
|
||||
// You can define your own FDSETSIZE if you want more bits
|
||||
const
|
||||
FD_SETSIZE = 256;
|
||||
|
||||
// Compatibily only: use FD_SETSIZE instead
|
||||
FDSETSIZE = FD_SETSIZE;
|
||||
|
||||
const
|
||||
NFDBITS = 32;
|
||||
|
||||
type
|
||||
fd_set = record
|
||||
mask : array [0..(FDSETSIZE div NFDBITS) - 1] of Longword;
|
||||
end;
|
||||
Pfd_set = ^fd_set;
|
||||
|
||||
//--- these were macros
|
||||
// need to change FD_SET name because of naming clash with the record.
|
||||
function _FDMSKNO(fd : Longint) : Longint;
|
||||
function _FDBITNO(fd : Longint) : Longint;
|
||||
procedure FD_ZERO(setp : fd_set);
|
||||
procedure FD_SET_(fd : Longint; var setp : fd_set);
|
||||
procedure FD_CLR(fd : Longint; var setp : fd_set);
|
||||
function FD_ISSET(fd : Longint; setp : fd_set) : Longint;
|
||||
//---
|
||||
|
||||
|
||||
function socket(family, _type, proto : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'socket';
|
||||
function bind(fd : Longint; const addr : Psockaddr; size : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'bind';
|
||||
function getsockname(fd : Longint; addr : Psockaddr; size : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'getsockname';
|
||||
function getpeername(fd : Longint; addr : Psockaddr; size : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'getpeername';
|
||||
function recvfrom(fd : Longint; buf : Pointer; size : size_t; flags : Longint;
|
||||
from : Psockaddr; var fromlen : Longint) : ssize_t;
|
||||
cdecl; external kBeNETLibName name 'recvfrom';
|
||||
function sendto(fd : Longint; const buf : Pointer; size : size_t; flags : Longint;
|
||||
const _to : Psockaddr; tolen : Longint) : ssize_t;
|
||||
cdecl; external kBeNETLibName name 'sendto';
|
||||
|
||||
function send(fd : Longint; const buf : Pointer; size : size_t; flags : Longint) : ssize_t;
|
||||
cdecl; external kBeNETLibName name 'send';
|
||||
function recv(fd : Longint; buf : Pointer; size : size_t; flags : Longint) : ssize_t;
|
||||
cdecl; external kBeNETLibName name 'recv';
|
||||
|
||||
function connect(fd : Longint; const addr : Psockaddr; size : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'connect';
|
||||
function accept(fd : Longint; addr : Psockaddr; var size : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'accept';
|
||||
function listen(fd, backlog : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'listen';
|
||||
function closesocket(fd : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'closesocket';
|
||||
|
||||
// doesn't work yet (from Be's header file)
|
||||
function shutdown(fd, how : Longint) : Longint;
|
||||
cdecl; external kBeNETLibName name 'shutdown';
|
||||
function setsockopt(sd, prot, opt : Longint; const data : Pointer;
|
||||
datasize : Longword) : Longint;
|
||||
cdecl; external kBeNETLibName name 'setsockopt';
|
||||
|
||||
function select(nbits : Longint; rbits, wbits, ebits : Pfd_set; timeout : Ptimeval)
|
||||
: Longint; cdecl; external kBeNETLibName name 'select';
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
function _FDMSKNO(fd : Longint) : Longint;
|
||||
begin
|
||||
Result := fd div NFDBITS;
|
||||
end;
|
||||
|
||||
function _FDBITNO(fd : Longint) : Longint;
|
||||
begin
|
||||
Result := fd mod NFDBITS;
|
||||
end;
|
||||
|
||||
procedure FD_ZERO(setp : fd_set);
|
||||
begin
|
||||
FillChar(setp.mask, 0, SizeOf(setp.mask));
|
||||
end;
|
||||
|
||||
procedure FD_SET_(fd : Longint; var setp : fd_set);
|
||||
begin
|
||||
setp.mask[_FDMSKNO(fd)] := setp.mask[_FDMSKNO(fd)] or (1 shl (_FDBITNO(fd)));
|
||||
end;
|
||||
|
||||
procedure FD_CLR(fd : Longint; var setp : fd_set);
|
||||
begin
|
||||
setp.mask[_FDMSKNO(fd)] := setp.mask[_FDMSKNO(fd)] and not(1 shl (_FDBITNO(fd)));
|
||||
end;
|
||||
|
||||
function FD_ISSET(fd : Longint; setp : fd_set) : Longint;
|
||||
begin
|
||||
Result := setp.mask[_FDMSKNO(fd)] and (1 shl (_FDBITNO(fd)));
|
||||
end;
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user