require 'sys/queue.ph';
sub v_mountedhere { &v_un. &vu_mountedhere;}
sub v_socket { &v_un. &vu_socket;}
sub v_vmdata { &v_un. &vu_vmdata;}
sub v_specinfo { &v_un. &vu_specinfo;}
sub v_fifoinfo { &v_un. &vu_fifoinfo;}
sub VROOT {0x0001;}
sub VTEXT {0x0002;}
sub VSYSTEM {0x0004;}
sub VXLOCK {0x0100;}
sub VXWANT {0x0200;}
sub VBWAIT {0x0400;}
sub VALIASED {0x0800;}
sub VDIROP {0x1000;}
sub VA_UTIMES_NULL {0x01;}
sub IO_UNIT {0x01;}
sub IO_APPEND {0x02;}
sub IO_SYNC {0x04;}
sub IO_NODELOCKED {0x08;}
sub IO_NDELAY {0x10;}
sub VSUID {04000;}
sub VSGID {02000;}
sub VSVTX {01000;}
sub VREAD {00400;}
sub VWRITE {00200;}
sub VEXEC {00100;}
sub VNOVAL {(-1);}
if (defined &KERNEL) {
    eval 'sub IFTOVT {
        local($mode) = @_;
        eval "( &iftovt_tab[(($mode) &  &S_IFMT) >> 12])";
    }';
    eval 'sub VTTOIF {
        local($indx) = @_;
        eval "( &vttoif_tab[($indx)])";
    }';
    eval 'sub MAKEIMODE {
        local($indx, $mode) = @_;
        eval "( &VTTOIF($indx) | ($mode))";
    }';
    eval 'sub SKIPSYSTEM {0x0001;}';
    eval 'sub FORCECLOSE {0x0002;}';
    eval 'sub WRITECLOSE {0x0004;}';
    eval 'sub DOCLOSE {0x0008;}';
    eval 'sub V_SAVE {0x0001;}';
    eval 'sub V_SAVEMETA {0x0002;}';
    if (defined &DIAGNOSTIC) {
	eval 'sub HOLDRELE {
	    local($vp) = @_;
	    eval " &holdrele($vp)";
	}';
	eval 'sub VATTR_NULL {
	    local($vap) = @_;
	    eval " &vattr_null($vap)";
	}';
	eval 'sub VHOLD {
	    local($vp) = @_;
	    eval " &vhold($vp)";
	}';
	eval 'sub VREF {
	    local($vp) = @_;
	    eval " &vref($vp)";
	}';
    }
    else {
	eval 'sub HOLDRELE {
	    local($vp) = @_;
	    eval "($vp)-> &v_holdcnt--";
	}';
	eval 'sub VATTR_NULL {
	    local($vap) = @_;
	    eval "(*($vap) =  &va_null)";
	}';
	eval 'sub VHOLD {
	    local($vp) = @_;
	    eval "($vp)-> &v_holdcnt++";
	}';
	eval 'sub VREF {
	    local($vp) = @_;
	    eval "($vp)-> &v_usecount++";
	}';
    }
    eval 'sub NULLVP {( &NULL);}';
    eval 'sub LEASE_READ {0x1;}';
    eval 'sub LEASE_WRITE {0x2;}';
    if (defined &NFSCLIENT) {
	eval 'sub LEASE_CHECK {
	    local($vp, $p, $cred, $flag) = @_;
	    eval " &lease_check(($vp), ($p), ($cred), ($flag))";
	}';
	eval 'sub LEASE_UPDATETIME {
	    local($dt) = @_;
	    eval " &lease_updatetime($dt)";
	}';
    }
    else {
	eval 'sub LEASE_CHECK {
	    local($vp, $p, $cred, $flag) = @_;
	    eval "";
	}';
	eval 'sub LEASE_UPDATETIME {
	    local($dt) = @_;
	    eval "";
	}';
    }
}
sub VDESC_MAX_VPS {16;}
sub VDESC_VP0_WILLRELE {0x0001;}
sub VDESC_VP1_WILLRELE {0x0002;}
sub VDESC_VP2_WILLRELE {0x0004;}
sub VDESC_VP3_WILLRELE {0x0008;}
sub VDESC_NOMAP_VPP {0x0100;}
sub VDESC_VPP_WILLRELE {0x0200;}
sub VDESC_NO_OFFSET {-1;}
if (defined &KERNEL) {
    eval 'sub VOPARG_OFFSET {
        local($p_type,$field) = @_;
        eval "( (( (&((($p_type) &NULL)->$field))) - (  &NULL)))";
    }';
    eval 'sub VOPARG_OFFSETOF {
        local($s_type,$field) = @_;
        eval " &VOPARG_OFFSET($s_type*,$field)";
    }';
    eval 'sub VOPARG_OFFSETTO {
        local($S_TYPE,$S_OFFSET,$STRUCT_P) = @_;
        eval "(($S_TYPE)((($STRUCT_P))+($S_OFFSET)))";
    }';
    eval 'sub VOCALL {
        local($OPSV,$OFF,$AP) = @_;
        eval "(( *(($OPSV)[($OFF)])) ($AP))";
    }';
    eval 'sub VCALL {
        local($VP,$OFF,$AP) = @_;
        eval " &VOCALL(($VP)-> &v_op,($OFF),($AP))";
    }';
    eval 'sub VDESC {
        local($OP) = @_;
        eval "(&  &__CONCAT($OP, &_desc))";
    }';
    eval 'sub VOFFSET {
        local($OP) = @_;
        eval "( &VDESC($OP)-> &vdesc_offset)";
    }';
    require 'vnode_if.ph';
}
1;
