delphimvcframework/lib/crosssocket/BSD.kqueue.pas

115 lines
4.2 KiB
ObjectPascal

{******************************************************************************}
{ }
{ Delphi cross platform socket library }
{ }
{ Copyright (c) 2017 WiNDDRiVER(soulawing@gmail.com) }
{ }
{ Homepage: https://github.com/winddriver/Delphi-Cross-Socket }
{ }
{******************************************************************************}
unit BSD.kqueue;
interface
uses
Posix.Base, Posix.Time;
const
EVFILT_READ = -1;
EVFILT_WRITE = -2;
EVFILT_AIO = -3; { attached to aio requests }
EVFILT_VNODE = -4; { attached to vnodes }
EVFILT_PROC = -5; { attached to struct proc }
EVFILT_SIGNAL = -6; { attached to struct proc }
EVFILT_TIMER = -7; { timers }
EVFILT_NETDEV = -8; { network devices }
EVFILT_FS = -9; { filesystem events }
EVFILT_SYSCOUNT = 9;
EV_ADD = $0001; { add event to kq }
EV_DELETE = $0002; { delete event from kq }
EV_ENABLE = $0004; { enable event }
EV_DISABLE = $0008; { disable event (not reported) }
{ flags }
EV_ONESHOT = $0010; { only report one occurrence }
EV_CLEAR = $0020; { clear event state after reporting }
EV_RECEIPT = $0040; { force EV_ERROR on success, data=0 }
EV_DISPATCH = $0080; { disable event after reporting }
EV_SYSFLAGS = $F000; { reserved by system }
EV_FLAG1 = $2000; { filter-specific flag }
{ returned values }
EV_EOF = $8000; { EOF detected }
EV_ERROR = $4000; { error, data contains errno }
{ data/hint flags for EVFILT_READ|WRITE, shared with userspace }
NOTE_LOWAT = $0001; { low water mark }
{ data/hint flags for EVFILT_VNODE, shared with userspace }
NOTE_DELETE = $0001; { vnode was removed }
NOTE_WRITE = $0002; { data contents changed }
NOTE_EXTEND = $0004; { size increased }
NOTE_ATTRIB = $0008; { attributes changed }
NOTE_LINK = $0010; { link count changed }
NOTE_RENAME = $0020; { vnode was renamed }
NOTE_REVOKE = $0040; { vnode access was revoked }
{ data/hint flags for EVFILT_PROC, shared with userspace }
NOTE_EXIT = $80000000; { process exited }
NOTE_FORK = $40000000; { process forked }
NOTE_EXEC = $20000000; { process exec'd }
NOTE_PCTRLMASK = $f0000000; { mask for hint bits }
NOTE_PDATAMASK = $000fffff; { mask for pid }
{ additional flags for EVFILT_PROC }
NOTE_TRACK = $00000001; { follow across forks }
NOTE_TRACKERR = $00000002; { could not track child }
NOTE_CHILD = $00000004; { am a child process }
{ data/hint flags for EVFILT_NETDEV, shared with userspace }
NOTE_LINKUP = $0001; { link is up }
NOTE_LINKDOWN = $0002; { link is down }
NOTE_LINKINV = $0004; { link state is invalid }
type
PKEvent = ^TKEvent;
TKEvent = record
Ident : UIntPtr; { identifier for this event }
Filter : SmallInt; { filter for event }
Flags : Word;
FFlags : Cardinal;
Data : IntPtr;
uData : Pointer; { opaque user data identifier }
end;
function kqueue: Integer; cdecl;
external libc name _PU + 'kqueue';
{$EXTERNALSYM kqueue}
function kevent(kq: Integer; ChangeList: PKEvent; nChanged: Integer;
EventList: PKevent; nEvents: Integer; Timeout: PTimeSpec): Integer; cdecl;
external libc name _PU + 'kevent';
{$EXTERNALSYM kevent}
procedure EV_SET(kevp: PKEvent; const aIdent: UIntPtr; const aFilter: SmallInt;
const aFlags: Word; const aFFlags: Cardinal; const aData: IntPtr;
const auData: Pointer); inline;
implementation
procedure EV_SET(kevp: PKEvent; const aIdent: UIntPtr; const aFilter: SmallInt;
const aFlags: Word; const aFFlags: Cardinal; const aData: IntPtr;
const auData: Pointer); inline;
begin
kevp^.Ident := aIdent;
kevp^.Filter := aFilter;
kevp^.Flags := aFlags;
kevp^.FFlags := aFFlags;
kevp^.Data := aData;
kevp^.uData := auData;
end;
end.