diff --git a/sys/init_sysent.pas b/sys/init_sysent.pas index e7863d1d..206ddfbf 100644 --- a/sys/init_sysent.pas +++ b/sys/init_sysent.pas @@ -564,7 +564,7 @@ var ), (//[101] sy_narg:2; - sy_call:nil; + sy_call:@sys_netabort; sy_name:'sys_netabort' ), (//[102] diff --git a/sys/kern/uipc_syscalls.pas b/sys/kern/uipc_syscalls.pas index 7fb6bd08..a952a65b 100644 --- a/sys/kern/uipc_syscalls.pas +++ b/sys/kern/uipc_syscalls.pas @@ -5,14 +5,15 @@ unit uipc_syscalls; interface -function sys_socket(domain,stype,protocol:Integer):Integer; -function sys_socketex(name:pchar;domain,stype,protocol:Integer):Integer; +function sys_socket (domain,stype,protocol:Integer):Integer; +function sys_socketex (name:pchar;domain,stype,protocol:Integer):Integer; function sys_socketclose(fd:Integer):Integer; -function sys_bind(s:Integer;name:Pointer;namelen:Integer):Integer; -function sys_listen(s,backlog:Integer):Integer; -function sys_accept(s:Integer;aname,anamelen:Pointer):Integer; -function sys_connect(fd:Integer;name:Pointer;namelen:Integer):Integer; -function sys_setsockopt(s,level,name:Integer;val:Pointer;valsize:Integer):Integer; +function sys_bind (s:Integer;name:Pointer;namelen:Integer):Integer; +function sys_listen (s,backlog:Integer):Integer; +function sys_accept (s:Integer;aname,anamelen:Pointer):Integer; +function sys_connect (fd:Integer;name:Pointer;namelen:Integer):Integer; +function sys_setsockopt (s,level,name:Integer;val:Pointer;valsize:Integer):Integer; +function sys_netabort (fd,flags:Integer):Integer; implementation @@ -608,6 +609,34 @@ begin Result:=kern_setsockopt(s,level,name,val,UIO_USERSPACE,valsize); end; +const + SOCKET_ABORT_FLAG_RCV =$00000001; + SOCKET_ABORT_FLAG_SND =$00000002; + SOCKET_ABORT_FLAG_SND_AGAIN=$00000004; + +function sys_netabort(fd,flags:Integer):Integer; +var + error:Integer; + fp:p_file; +begin + + if ((flags and $1000000)=0) then + begin + error:=getsock_cap(fd, flags, @fp, nil); + if (error=0) then + begin + //error:=bnet_netabort(td,fp->f_data,flags); + fdrop(fp); + end; + end else + begin + flags:=flags and $feffffff; + error:=0; + //error:=kern_epollabort(td,fd,flags); + end; + + Exit(error); +end; end. diff --git a/sys/syscalls.pas b/sys/syscalls.pas index a5e22d2d..0cef1525 100644 --- a/sys/syscalls.pas +++ b/sys/syscalls.pas @@ -65,6 +65,7 @@ function socket(domain,stype,protocol:Integer):Integer; function _connect(fd:Integer;name:Pointer;namelen:Integer):Integer; function __sys_netcontrol(fd,op:Integer;buf:Pointer;nbuf:DWORD):Integer; function getpriority(which,who:Integer):Integer; +function __sys_netabort(fd,flags:Integer):Integer; function _bind(s:Integer;name:Pointer;namelen:Integer):Integer; function _setsockopt(s,level,name:Integer;val:Pointer;valsize:Integer):Integer; function _listen(s,backlog:Integer):Integer; @@ -675,6 +676,13 @@ asm jmp cerror end; +function __sys_netabort(fd,flags:Integer):Integer; assembler; nostackframe; +asm + movq $101,%rax + call fast_syscall + jmp cerror +end; + function _bind(s:Integer;name:Pointer;namelen:Integer):Integer; assembler; nostackframe; asm movq $104,%rax