/*
 * dlsof.h - SCO UnixWare header file for lsof
 */

/*
 * Copyright 1996 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.
 */

#if !defined(UW_LSOF_H)
#    define UW_LSOF_H 1

#    include <dirent.h>
#    include <fcntl.h>
#    include <malloc.h>
#    include <stdlib.h>
#    include <unistd.h>
#    include <sys/conf.h>
#    include <sys/exec.h>
#    include <sys/mkdev.h>
#    include <sys/mnttab.h>
#    include <sys/mntent.h>
#    include <netdb.h>
#    include <string.h>
#    include <nlist.h>
#    include <sys/file.h>
#    include <sys/flock.h>
#    include <sys/immu.h>
#    include <sys/fstyp.h>
#    include <sys/fsid.h>

#    if UNIXWAREV >= 70103
#        include <sys/poll.h>
#        include <sys/fs/prdata.h>
#        define PR_PIDDIR PR_PIDCAT_DIR
#        define PR_AS PR_PIDCAT_AS
#        define PR_CTL PR_PIDCAT_CTL
#        define PR_STATUS PR_PIDCAT_STATUS
#        define PR_MAP PR_PIDCAT_MAP
#        define PR_CRED PR_PIDCAT_CRED
#        define PR_SIGACT PR_PIDCAT_SIGACT
#        define PR_OBJECTDIR PR_PIDCAT_OBJECTDIR
#        define PR_LWPDIR PR_PIDCAT_LWP_DIR
#        define PR_LWPIDDIR PR_PIDCAT_LWP_IDDIR
#        define PR_LWPCTL PR_PIDCAT_LWP_CTL
#        define PR_LWPSTATUS PR_PIDCAT_LWP_STATUS
#        define PR_LWPSINFO PR_PIDCAT_LWP_SINFO
#    endif /* UNIXWAREV>=70103 */

#    include <sys/vfs.h>
#    include <sys/vnode.h>
#    include <sys/fs/memfs_mnode.h>
#    include <sys/fs/namenode.h>

#    if UNIXWAREV >= 70000
#        undef IREAD
#        undef IWRITE
#        undef IEXEC
#    endif /* UNIXWAREV>=70000 */

#    include <sys/fs/snode.h>

#    if UNIXWAREV < 20102
#        include <fs/proc/prdata.h>
#    else /* UNIXWAREV>=20102 */
#        if UNIXWAREV < 70103
#            include <fs/procfs/prdata.h>
#        endif /* UNIXWAREV<70103 */
#    endif     /* UNIXWAREV<20102 */

#    include <sys/mount.h>
#    include <sys/stream.h>
#    include <sys/strsubr.h>
#    include <sys/sysmacros.h>
#    undef major
#    undef minor
#    define major(d) (((d) >> L_BITSMINOR) & L_MAXMAJ)
#    define minor(d) ((d)&L_MAXMIN)
#    include <sys/time.h>
#    include <sys/fs/s5dir.h>
#    include <signal.h>
#    include <sys/proc.h>
#    include <sys/user.h>
#    include <sys/var.h>
#    include <sys/procfs.h>
#    include <sys/priocntl.h>
#    include <sys/tihdr.h>
#    include <sys/tiuser.h>
#    include <sys/un.h>
#    include <rpc/types.h>
#    include <nfs/nfs.h>

#    define _KERNEL
#    include <sys/fs/fifonode.h>

#    if UNIXWAREV >= 70000
#        include <rpc/xdr.h>
#    endif /* UNIXWAREV>=70000 */

#    include <nfs/rnode.h>
#    undef _KERNEL

#    include <netinet/in.h>

#    if defined(HASIPv6)
#        include <netinet/in6.h>
#        if !defined(IN6_ARE_ADDR_EQUAL)
#            define IN6_ARE_ADDR_EQUAL IN6_ADDR_EQUAL /* required by RFC2292   \
                                                       */
#        endif /* !defined(IN6_ARE_ADDR_EQUAL) */
#    endif     /* defined(HASIPv6) */

#    include <rpc/rpc.h>
#    include <rpc/clnt_soc.h>
#    include <rpc/pmap_prot.h>
#    include <rpc/rpcent.h>
#    include <sys/socket.h>
#    include <net/route.h>

#    if defined(HAS_INKERNEL)
#        define INKERNEL
#    endif /* defined(HAS_INKERNEL) */

#    include <netinet/in_pcb.h>

#    if defined(HAS_INKERNEL)
#        undef INKERNEL
#    endif /* defined(HAS_INKERNEL) */

#    if UNIXWAREV >= 70000
#        undef TCP_MAXSEG
#        undef TCP_NODELAY
#    endif /* UNIXWAREV>=70000 */

#    include <netinet/tcp.h>
#    include <netinet/tcp_fsm.h>

#    if UNIXWAREV < 70000
#        include <netinet/tcp_kern.h>
#    else /* UNIXWAREV>=70000 */
#        include <netinet/tcp_timer.h>

#        if defined(HAS_INKERNEL)
#            define INKERNEL
#        endif /* defined(HAS_INKERNEL) */

#        include <netinet/tcp_var.h>

#        if defined(HAS_INKERNEL)
#            undef INKERNEL
#        endif /* defined(HAS_INKERNEL) */
#    endif     /* UNIXWAREV<70000 */

#    include <sys/protosw.h>
#    include <sys/socketvar.h>
#    include <sys/sockmod.h>

#    if UNIXWAREV >= 70101
#        undef SS_ISBOUND
#        undef SS_ISCONNECTED
#        undef SS_ISCONNECTING
#        undef SS_CANTRCVMORE
#        undef SS_CANTSENDMORE
#        include <sys/socksys.h>
#    endif /* UNIXWAREV>=70101 */

#    include <sys/tiuser.h>
#    include <vm/hat.h>
#    include <vm/as.h>
#    include <vm/seg.h>

#    if UNIXWAREV >= 70000 && UNIXWAREV < 70103
typedef ulong_t channel_t; /* also in types.h #if _KERNEL */
#    endif                 /* UNIXWAREV>=70000 && UNIXWAREV<70103 */

#    include <vm/seg_dev.h>
#    include <vm/seg_map.h>
#    include <vm/seg_vn.h>

#    define COMP_P const void
#    define DEVINCR 1024 /* device table malloc() increment */
#    define DIRTYPE dirent
#    define FSNAMEL 4
typedef off_t KA_T;
#    define KMEM "/dev/kmem"

#    if defined(HAS_UW_NSC)
#        define N_UNIX "/unix"
#    else /* !defined(HAS_UW_NSC) */
#        define N_UNIX "/stand/unix"
#    endif /* defined(HAS_UW_NSC) */

#    if UNIXWAREV < 70103
#        define MALLOC_P char
#        define MALLOC_S unsigned
#    else /* UNIXWAREV>=70103 */
#        define MALLOC_P void
#        define MALLOC_S size_t
#    endif /* UNIXWAREV<70103 */

#    define FREE_P MALLOC_P
#    define MAXSEGS 100               /* maximum text segments */
#    define MAXSYSCMDL (PSCOMSIZ - 1) /* max system command name length */
#    define PROCFS "/proc"
#    define PROCINCR 32 /* local proc table malloc increment */
#    define PROCMIN 3   /* processes that make a "good" scan */
#    define PROCSIZE sizeof(struct proc)
#    define PROCTRYLM 5 /* times to try to read proc table */
#    define QSORT_P char

#    if UNIXWAREV < 7000
#        define READLEN_T unsigned
#    else /* UNIXWAREV>=7000 */
#        define READLEN_T size_t
#    endif /* UNIXWAREV<7000 */

#    if defined(HASPROCFS)
#        define PNSIZ 5        /* size of /HASPROCFS names */
#        define PR_INOBIAS 64L /* /HASPROCFS PID to i_number bias */
#        define PR_ROOTINO 2   /* /HASPROCFS root inode number */
#    endif

#    define STRNCPY_L size_t
#    define STRNML 32

#    if UNIXWAREV >= 70000
#        define SZOFFTYPE unsigned long long
/* type for size and offset */
#        define SZOFFPSPEC                                                     \
            "ll" /* SZOFFTYPE printf specification                             \
                  * modifier */
/*
 * Use the 64 bit stat() functions, so that lsof can get parameters on
 * large and small files.
 */
#        define fstat fstat64
#        define lstat lstat64
#        define stat stat64
#    else                               /* UNIXWAREV<70000 */
#        define SZOFFTYPE unsigned long /* type for size and offset */
#        define SZOFFPSPEC "l" /* SZOFFTYPE printf specification modifier */
#    endif                     /* UNIXWAREV>=7000 */

#    define U_SIZE sizeof(struct user)

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

extern int CloneMaj;
extern char **Fsinfo;
extern int Fsinfomax;
extern int HaveCloneMaj;
extern int Kd;

struct l_ino {
    dev_t dev;                /* device */
    long nlink;               /* link count */
    char *nm;                 /* name */
    INODETYPE number;         /* inode number */
    dev_t rdev;               /* raw device */
    SZOFFTYPE size;           /* file size */
    unsigned char dev_def;    /* dev is defined */
    unsigned char nlink_def;  /* link count is defined */
    unsigned char number_def; /* number is defined */
    unsigned char rdev_def;   /* rdev is defined */
    unsigned char size_def;   /* size is defined */
};

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 */

#    if defined(HASFSTYPE)
    char *fstype; /* st_fstype */
#    endif
};

extern short Nfstyp;

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

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 */
};

#    include <setjmp.h>

/*
 * Definition for ckfa.c
 */

#    define CKFA_XDEVTST strcmp(sb.st_fstype, "cdfs") == 0

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

#    define CLONEMAJ CloneMaj         /* clone major variable name */
#    define HAS_STD_CLONE 1           /* has standard clone handling */
#    define HAVECLONEMAJ HaveCloneMaj /* clone major status variable name */

/*
 * Definitions for rnch.c
 */

#    if defined(HASNCACHE)
#        include <sys/dnlc.h>
#    endif /* defined(HASNCACHE) */

struct lsof_context_dialect {};

#endif /* UW_LSOF_H */
