FPPS4/sys/kern/kern_bnet.pas

75 lines
1.1 KiB
Plaintext

unit kern_bnet;
{$mode ObjFPC}{$H+}
{$CALLING SysV_ABI_CDecl}
interface
function sys_netcontrol(fd,op:Integer;buf:Pointer;nbuf:DWORD):Integer;
implementation
uses
errno,
systm,
md_arc4random;
function bnet_get_secure_seed():Integer;
begin
Result:=0;
arc4rand(@Result,SizeOf(Integer),0);
end;
function sys_netcontrol(fd,op:Integer;buf:Pointer;nbuf:DWORD):Integer;
var
_kbuf:array[0..159] of Byte;
kaddr:Pointer;
begin
Result:=0;
if (buf=nil) then
begin
kaddr:=nil;
end else
begin
if (160 < nbuf) then
begin
Exit(EINVAL);
end else
begin
kaddr:=@_kbuf;
end;
if ((op and QWORD($30000000))<>0) then
begin
Result:=copyin(buf,kaddr,nbuf);
if (Result<>0) then Exit;
end;
end;
case op of
$14: //bnet_get_secure_seed
begin
PInteger(kaddr)^:=bnet_get_secure_seed();
end
else
begin
Writeln(StdErr,'Unhandled netcontrol:',op);
Assert(False);
Result:=EINVAL;
end;
end;
if (buf<>nil) and (Result=0) and ((op and QWORD($30000000))<>QWORD($20000000)) then
begin
Result:=copyout(kaddr,buf,nbuf);
end;
end;
end.