/*
 * vnode.h for HP-UX 10.30 and above
 *
 * This header file defines the locklist, vnode and vattr structures for lsof
 * in a manner that can be compiled at the application level.
 *
 * V. Abell <abe@purdue.edu>
 * February, 1998
 */

#if !defined(LSOF_VNODE_H)
#    define LSOF_VNODE_H
#    define _SYS_VNODE_INCLUDED /* prevent inclusion of <sys/vnode.h> */

#    include "kernbits.h"
#    include <sys/types.h>
#    include <sys/sem_beta.h>
#    include <sys/time.h>

#    define VROOT 0x01

typedef struct locklist { /* lock list */
    KA_T ll_link;
    short ll_count;
    short ll_flags;   /* flags */
    KA_T ll_proc;     /* proc structure address (unused) */
    KA_T ll_kthreadp; /* thread structure address */

    /* ll_start and ll_end should be typed off_t, but there's an
     * unresolvable conflict between the size of the kernel's off_t
     * and the 32 and 64 bit application off_t sizes.
     */

    int64_t ll_start; /* lock start */
    int64_t ll_end;   /* lock end */
    short ll_type;    /* lock type -- e.g., F_RDLCK or
                       * F_WRLCK */
    KA_T ll_vp;
    KA_T ll_waitq;
    KA_T ll_fwd; /* forward link */
    KA_T ll_rev;
    KA_T ll_sib_fwd;
    KA_T ll_sib_rev;
} locklist_t;

enum vtype {
    VNON = 0,
    VREG = 0x1,
    VDIR = 0x2,
    VBLK = 0x3,
    VCHR = 0x4,
    VLNK = 0x5,
    VSOCK = 0x6,
    VBAD = 0x7,
    VFIFO = 0x8,
    VFNWK = 0x9,
    VEMPTYDIR = 0xa
};

enum vfstype {
    VDUMMY = 0,
    VNFS = 0x1,
    VUFS = 0x2,
    VDEV_VN = 0x3,
    VNFS_SPEC = 0x4,
    VNFS_BDEV = 0x5,
    VNFS_FIFO = 0x6,
    VCDFS = 0x7,
    VVXFS = 0x8,
    VDFS = 0x9,
    VEFS = 0xa,
    VLOFS = 0xb
};

typedef struct vnode {
    u_short v_flag;    /* flags -- e.g., VROOT */
    u_short v_shlockc; /* shared lock count */
    u_short v_exlockc; /* exclusive lock count */
    u_short v_tcount;
    int v_count;
    KA_T v_vfsmountedhere;
    KA_T v_op; /* operations switch */
    KA_T v_socket;
    KA_T v_stream;     /* associated stream */
    KA_T v_vfsp;       /* pointer to virtual file system
                        * structure */
    enum vtype v_type; /* vnode type */
    dev_t v_rdev;      /* device -- for VCHR and VBLK
                        * vnodes */
    caddr_t v_data;    /* private data -- i.e., pointer to
                        * successor node structure */
    enum vfstype v_fstype;
    KA_T v_vas;
    vm_sema_t v_lock;
    KA_T v_cleanblkhd;
    KA_T v_dirtyblkhd;
    int v_writecount;
    KA_T v_locklist; /* locklist structure chain pointer */
    int v_scount;
    int32_t v_nodeid;
    KA_T v_ncachedhd;
    KA_T v_ncachevhd;
    KA_T v_pfdathd;
    u_int v_last_fsync;
} vnode_t;

typedef struct vattr {
    enum vtype va_type;
    u_short va_mode;
    short va_nlink;
    uid_t va_uid;
    gid_t va_gid;
    int32_t va_fsid;
    int32_t va_nodeid; /* node ID number (e.g., inode
                        * number) */
    off64_t va_size;   /* file size */
    int32_t va_blocksize;
    struct timeval va_atime;
    struct timeval va_mtime;
    struct timeval va_ctime;
    dev_t va_rdev;
    blkcnt64_t va_blocks;
    dev_t va_realdev;
    u_short va_basemode;
    u_short va_acl;
    u_short va_sysVacl;
    u_short va_dummy;
    short va_fstype;
} vattr_t;

#endif /* !defined(LSOF_VNODE_H) */
