/*
 * dlsof.h - /dev/kmem-based HP-UX header file for lsof
 */

/*
 * Copyright 1994 Purdue Research Foundation, West Lafayette, Indiana
 * 47907.  All rights reserved.
 *
 * Written by Victor A. Abell
 *
 * This software is not subject to any license of the American Telephone
 * and Telegraph Company or the Regents of the University of California.
 *
 * Permission is granted to anyone to use this software for any purpose on
 * any computer system, and to alter it and redistribute it freely, subject
 * to the following restrictions:
 *
 * 1. Neither the authors nor Purdue University are responsible for any
 *    consequences of the use of this software.
 *
 * 2. The origin of this software must not be misrepresented, either by
 *    explicit claim or by omission.  Credit to the authors and Purdue
 *    University must appear in documentation and sources.
 *
 * 3. Altered versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 *
 * 4. This notice may not be removed or altered.
 */

/*
 * $Id: dlsof.h,v 1.19 2007/04/24 16:25:30 abe Exp $
 */

#if !defined(HPUX_LSOF_H)
#    define HPUX_LSOF_H 1

#    if HPUXV >= 1030
#        include <fcntl.h>
#    endif /* HPUXV>=1030 */

#    include <stdlib.h>
#    include <dirent.h>
#    include <mntent.h>
#    include <setjmp.h>
#    include <string.h>
#    include <nlist.h>
#    include <unistd.h>

#    if HPUXV < 1020
#        include <sys/vnode.h>
#    endif /* HPUXV<1020 */

#    if HPUXV >= 1030
/*
 * Include header files for HP-UX 10.30 and up that have been
 * manufactured with q4 and hand edited.
 */

#        include "lla.h"
#        include "proc.h"
#        include "rnode.h"
#        include "nfs_clnt.h"
#        include "vnode.h"
#    endif /* HPUXV>=1030 */

#    include <sys/domain.h>

#    if HPUXV >= 1020
#        define _INCLUDE_STRUCT_FILE
#    endif /* HPUXV>=1020 */

#    if HPUXV >= 1030
struct uio { /* to satisfy function prototypes in <sys/file.h> */
    int dummy;
};
#    endif /* HPUXV>=1030 */

#    include <sys/file.h>

#    if HPUXV >= 1020
#        undef _INCLUDE_STRUCT_FILE
#    endif /* HPUXV>=1020 */

#    if HPUXV >= 1030
#        include <sys/stream.h>
#        include "sth.h"
#    endif /* HPUXV>=1030 */

#    include <sys/mbuf.h>

#    if HPUXV >= 800
#        undef _PROTOTYPES
#        include <sys/pstat.h>
#    endif /* HPUXV>=800 */

#    include <sys/resource.h>

#    if HPUXV < 1010
#        include <sys/proc.h>
#    endif /* HPUXV<1010 */

#    include <sys/protosw.h>
#    include <sys/socket.h>
#    include <sys/socketvar.h>
#    include <netinet/in.h>
#    include <net/route.h>

#    if HPUXV < 1030
#        include <net/raw_cb.h>
#        include <netinet/in_pcb.h>
#    endif /* HPUXV<1030 */

#    include <netinet/ip_var.h>
#    include <netinet/tcp.h>
#    include <netinet/tcpip.h>

#    if HPUXV < 1030
#        include <netinet/tcp_fsm.h>
#        include <netinet/tcp_timer.h>
#        include <netinet/tcp_var.h>
#    else /* HPUXV>=1030 */
#        include <sys/tihdr.h>
/*
 * Include header files for HP-UX 10.30 and up that have been
 * manufactured with q4 and hand editing.
 */

#        include "ipc_s.h"
#        include "tcp_s.h"
#        include "udp_s.h"
#    endif /* HPUXV<1030 */

#    if HPUXV >= 1030
#        undef TCP_NODELAY
#        undef TCP_MAXSEG
#    endif /* HPUXV>=1030 */

#    include <rpc/types.h>
#    include <rpc/rpc.h>
#    include <rpc/pmap_prot.h>

#    if HPUXV >= 1030
#        include <rpc/clnt_soc.h>
#    endif /* HPUXV>=1030 */

#    if HPUXV >= 1000
#        include <rpc/xdr.h>
#        include <rpc/auth.h>
#        include <rpc/clnt.h>
#        include <sys/cdfsdir.h>
#        include <sys/cdfs.h>
#        include <sys/cdnode.h>
#    endif /* HPUXV>=1000 */

#    include <nfs/nfs.h>

/*
 * Structure for Atria's MVFS node (ancestry: lsof 3.61 or older)
 */

struct mvfsnode {
    unsigned long d1[6];
    unsigned long m_ino; /* node number */
};

#    if HPUXV < 1030
#        include <nfs/nfs_clnt.h>
#        if defined(HASRNODE3)
/*
 * This rnode structure definition should come from <nfs/rnode.h>, but HP-UX
 * patched the kernel structures of NFS3 at PHNE_18173, PHNE_19426, PHNE_19937,
 * and PHNE_20091 and didn't supply an updated <nfs/rnode.h>.
 *
 * This definition of rnode was derived via /usr/contrib/binq4.
 */

struct rnode {
    struct rnode *r_next;
    struct vnode r_vnode;
    u_int r_fh3;
    fhandle_t r_fh;
    u_short r_flags;
    short r_error;
    daddr_t r_lastr;
    k_off_t r_size;
    k_off_t r_cachedsize;
    struct ucred *r_rcred;
    struct ucred *r_wcred;
    struct ucred *r_unlcred;
    int *r_unlname;
    struct vnode *r_unldvp;
    struct nfsfattr r_nfsattr;
};
#        else /* !defined(HASRNODE3) */
#            include <nfs/rnode.h>
#        endif /* defined(HASRNODE3) */
#    endif     /* HPUXV<1030 */

#    include <nfs/snode.h>

#    if HPUXV >= 1000
#        define _KERNEL
#        include <nfs/fifonode.h>
#        undef _KERNEL
#    endif /* HPUXV>=1000 */

#    if defined(DTYPE_LLA) && HPUXV < 1030
#        define _KERNEL 1
#        include <sio/lla.h>
#        undef _KERNEL
#    endif /* defined(DTYPE_LLA) && HPUXV<1030 */

#    include <sys/un.h>
#    include <sys/unpcb.h>
#    include <sys/vfs.h>
#    include <sys/vmmac.h>
#    include <sys/user.h>

/*
 * The hpux_mount.h header file is manufactured from <sys/mount.h> by the
 * Configure script to get the mount structure without needing to define
 * _KERNEL when including <sys/mount.h>.  Defining _KERNEL causes unresolvable
 * header file complications.
 */

#    include "hpux_mount.h"

#    if HPUXV >= 800
/*
 * These definitions are from <sys/vfs.h>, defined under the _KERNEL symbol.
 * Unfortunately, defining _KERNEL causes <sys/vfs.h> to include other
 * header files not in <sys>.
 */
#        define MOUNT_UFS 0
#        define MOUNT_NFS 1
#        define MOUNT_CDFS 2
#    endif /* HPUXV>=800 */

#    if defined(HAS_CONST)
#        define COMP_P const void
#    else /* !defined(HAS_CONST) */
#        define COMP_P void
#    endif /* defined(HAS_CONST) */

#    if HPUXV >= 800
#        define CURDIR p->p_cdir
#        define ROOTDIR p->p_rdir
#    else /* HPUXV<800 */
#        define CURDIR u->u_cdir
#        define ROOTDIR u->u_rdir
#    endif /* HPUXV>=800 */

#    define DEVINCR 1024 /* device table malloc() increment */

#    if HPUXV < 1030
/*
 * KA_T is defined in dialects/hpux/kmem/hpux11/kernbits.h for HP-UX 10.30
 * and above.
 */
typedef off_t KA_T;
#    endif /* HPUXV<1030 */

#    define KMEM "/dev/kmem"
#    define MALLOC_P void
#    define FREE_P void
#    define MALLOC_S unsigned
#    define MOUNTED MNT_MNTTAB

#    if HPUXV < 1000
#        define N_UNIX "/hp-ux"
#    else /* HPUXV>=1000 */
#        define N_UNIX "/stand/vmunix"
#    endif /* HPUXV<1000 */

#    define QSORT_P void
#    define READLEN_T int
#    define STRNCPY_L size_t

#    if HPUXV >= 1000
#        define SZOFFTYPE unsigned long long
/* type for size and offset */
#        define SZOFFPSPEC "ll" /* SZOFFTYPE printf specification modifier */
#    endif                      /* HPUXV>=1000 */

#    define SWAP "/dev/swap"

#    if HPUXV < 800
#        define unp_addr unp_locaddr
/*
 * HP-UX <8 SWAP must be read in DEV_BSIZE chunks.
 */
#        define U_SIZE                                                         \
            (((DEV_BSIZE + sizeof(struct user)) / DEV_BSIZE) * DEV_BSIZE)
#    endif /* HPUXV<800 */

#    if HPUXV >= 800
#        define U_SIZE sizeof(struct user)
#    endif /* HPUXV>=800 */

#    if HPUXV >= 1030
#        define XDR_PMAPLIST (xdrproc_t) xdr_pmaplist
#        define XDR_VOID (xdrproc_t) xdr_void
#    endif /* HPUXV>=1030 */

#    if defined(HAS_AFS)
/*
 * AFS definitions
 */

#        define AFSAPATHDEF "/usr/adm/afs/kload"
#        define AFSDEV 1 /* AFS "fake" device number */

#        if defined(HASAOPT)
extern char *AFSApath; /* alternate AFS name list path
                        * (from -A) */
#        endif         /* defined(HASAOPT) */

extern struct vfs *AFSVfsp; /* AFS struct vfs kernel pointer */
#    endif                  /* defined(HAS_AFS) */

/*
 * Global storage definitions (including their structure definitions)
 */

extern int CloneMaj;
extern int HaveCloneMaj;
extern int Kd;
extern KA_T Kpa;

#    if HPUXV >= 1010
extern KA_T Ktp;
#    endif /* HPUXV>=1010 */

struct l_vfs {
    KA_T addr;    /* kernel address */
    dev_t dev;    /* device */
    char *dir;    /* mounted directory */
    char *fsname; /* file system name */

#    if defined(HASFSINO)
    INODETYPE fs_ino; /* file system inode number */
#    endif            /* defined(HASFSINO) */

    struct l_vfs *next; /* forward link */
};
extern struct l_vfs *Lvfs;

#    if HPUXV < 800
extern int Mem;
#    endif /* HPUXV<800 */

struct mounts {
    char *dir;           /* directory (mounted on) */
    char *fsname;        /* file system
                          * (symbolic links unresolved) */
    char *fsnmres;       /* file system
                          * (symbolic links resolved) */
    dev_t dev;           /* directory st_dev */
    dev_t rdev;          /* directory st_rdev */
    INODETYPE inode;     /* directory st_ino */
    mode_t mode;         /* directory st_mode */
    mode_t fs_mode;      /* file system st_mode */
    struct mounts *next; /* forward link */
};

#    define X_NCACHE "ncache"
#    define X_NCSIZE "ncsize"
#    define NL_NAME n_name

#    if HPUXV < 800 && defined(hp9000s800)
extern int npids;
extern struct proc *proc;
#    endif /* HPUXV<800 && defined(hp9000s800) */

struct sfile {
    char *aname;        /* argument file name */
    char *name;         /* file name (after readlink()) */
    char *devnm;        /* device name (optional) */
    dev_t dev;          /* device */
    dev_t rdev;         /* raw device */
    u_short mode;       /* S_IFMT mode bits from stat() */
    int type;           /* file type: 0 = file system
                         *	      1 = regular file */
    INODETYPE i;        /* inode number */
    int f;              /* file found flag */
    struct sfile *next; /* forward link */
};

#    if HPUXV < 800
extern int Swap;
#    endif /* HPUXV<800 */

#    if HPUXV < 800 && defined(hp9000s800)
extern struct user *ubase;
#    endif /* HPUXV<800 && defined(hp9000s800) */

#    if HPUXV < 800 && defined(hp9000s300)
extern struct pte *Usrptmap;
extern struct pte *usrpt;
#    endif /* HPUXV<800 && defined(hp9000s300) */

extern KA_T Vnfops;

/*
 * Definitions for dvch.c, isfn.c, and rdev.c
 */

#    define CLONEMAJ CloneMaj         /* clone major variable name */
#    define DIRTYPE dirent            /* directory structure type */
#    define HASDNAMLEN 1              /* DIRTYPE has d_namlen element */
#    define HAS_STD_CLONE 1           /* uses standard clone structure */
#    define HAVECLONEMAJ HaveCloneMaj /* clone major status variable name */
#    define MAXSYSCMDL (PST_CLEN - 1)

/*
 * Definition for rmnt.c
 */

#    define MNTSKIP                                                            \
        {                                                                      \
            if (strcmp(mp->mnt_type, MNTTYPE_IGNORE) == 0)                     \
                continue;                                                      \
        }

/*
 * Definitions for rnch.c
 */

#    if defined(HASNCACHE)
#        include <sys/dnlc.h>
#        if HPUXV < 1000
#            define ADDR_NCACHE 1
#        endif /* HPUXV<1000 */
#    endif     /* defined(HASNCACHE) */

struct lsof_context_dialect {};

#endif /* HPUX_LSOF_H */
