mirror of https://github.com/red-prig/fpPS4.git
148 lines
3.1 KiB
Plaintext
148 lines
3.1 KiB
Plaintext
unit dead_vnops;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
uses
|
|
vnode,
|
|
vfs_default,
|
|
vnode_if;
|
|
|
|
{
|
|
* Prototypes for dead operations on vnodes.
|
|
}
|
|
function dead_lookup(ap:p_vop_lookup_args):Integer;
|
|
function dead_open(ap:p_vop_open_args):Integer;
|
|
function dead_poll(ap:p_vop_poll_args):Integer;
|
|
function dead_read(ap:p_vop_read_args):Integer;
|
|
function dead_write(ap:p_vop_write_args):Integer;
|
|
function dead_getwritemount(ap:p_vop_getwritemount_args):Integer;
|
|
function dead_rename(ap:p_vop_rename_args):Integer;
|
|
|
|
var
|
|
dead_vnodeops:vop_vector=(
|
|
vop_default :@default_vnodeops;
|
|
vop_bypass :nil;
|
|
vop_islocked :nil;
|
|
vop_lookup :@dead_lookup;
|
|
vop_create :@VOP_PANIC;
|
|
vop_whiteout :nil;
|
|
vop_mknod :@VOP_PANIC;
|
|
vop_open :@dead_open;
|
|
vop_close :nil;
|
|
vop_access :@VOP_EBADF;
|
|
vop_accessx :nil;
|
|
vop_getattr :@VOP_EBADF;
|
|
vop_setattr :@VOP_EBADF;
|
|
vop_markatime :nil;
|
|
vop_read :@dead_read;
|
|
vop_write :@dead_write;
|
|
vop_ioctl :@VOP_EBADF;
|
|
vop_poll :@dead_poll;
|
|
vop_kqfilter :nil;
|
|
vop_revoke :nil;
|
|
vop_fsync :nil;
|
|
vop_remove :@VOP_PANIC;
|
|
vop_link :@VOP_PANIC;
|
|
vop_rename :@dead_rename;
|
|
vop_mkdir :@VOP_PANIC;
|
|
vop_rmdir :@VOP_PANIC;
|
|
vop_symlink :@VOP_PANIC;
|
|
vop_readdir :@VOP_EBADF;
|
|
vop_readlink :@VOP_EBADF;
|
|
vop_inactive :@VOP_NULL;
|
|
vop_reclaim :@VOP_NULL;
|
|
vop_lock1 :nil;
|
|
vop_unlock :nil;
|
|
vop_bmap :@VOP_EBADF;
|
|
vop_strategy :nil;
|
|
vop_getwritemount :@dead_getwritemount;
|
|
vop_print :nil;
|
|
vop_pathconf :@VOP_EBADF; { per pathconf(2) }
|
|
vop_advlock :@VOP_EBADF;
|
|
vop_advlockasync :nil;
|
|
vop_advlockpurge :nil;
|
|
vop_reallocblks :nil;
|
|
vop_getpages :nil;
|
|
vop_putpages :nil;
|
|
vop_vptofh :nil;
|
|
vop_vptocnp :@VOP_EBADF;
|
|
vop_allocate :nil;
|
|
vop_unp_bind :nil;
|
|
vop_unp_connect :nil;
|
|
vop_unp_detach :nil;
|
|
); public;
|
|
|
|
implementation
|
|
|
|
uses
|
|
errno,
|
|
vpoll,
|
|
vfs_subr;
|
|
|
|
function dead_getwritemount(ap:p_vop_getwritemount_args):Integer;
|
|
begin
|
|
ap^.a_mpp^:=nil;
|
|
Exit(0);
|
|
end;
|
|
|
|
{
|
|
* Trivial lookup routine that always fails.
|
|
}
|
|
function dead_lookup(ap:p_vop_lookup_args):Integer;
|
|
begin
|
|
ap^.a_vpp^:=nil;
|
|
Exit(ENOTDIR);
|
|
end;
|
|
|
|
{
|
|
* Open always fails as if device did not exist.
|
|
}
|
|
function dead_open(ap:p_vop_open_args):Integer;
|
|
begin
|
|
Exit(ENXIO);
|
|
end;
|
|
|
|
{
|
|
* Vnode op for read
|
|
}
|
|
function dead_read(ap:p_vop_read_args):Integer;
|
|
begin
|
|
{
|
|
* ExitEOF for tty devices, EIO for others
|
|
}
|
|
if ((ap^.a_vp^.v_vflag and VV_ISTTY)=0) then
|
|
Exit(EIO);
|
|
Exit(0);
|
|
end;
|
|
|
|
{
|
|
* Vnode op for write
|
|
}
|
|
function dead_write(ap:p_vop_write_args):Integer;
|
|
begin
|
|
Exit(EIO);
|
|
end;
|
|
|
|
{
|
|
* Trivial poll routine that always returns POLLHUP.
|
|
* This is necessary so that a process which is polling a file
|
|
* gets notified when that file is revoke()d.
|
|
}
|
|
function dead_poll(ap:p_vop_poll_args):Integer;
|
|
begin
|
|
Exit(POLLHUP);
|
|
end;
|
|
|
|
function dead_rename(ap:p_vop_rename_args):Integer;
|
|
begin
|
|
vop_rename_fail(ap);
|
|
Exit(EXDEV);
|
|
end;
|
|
|
|
|
|
end.
|
|
|