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

/*
 * Copyright 1999 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.8 2008/10/21 16:17:50 abe Exp $
 */

#if !defined(HPUX_LSOF_H)
#    define HPUX_LSOF_H 1

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

#    include <arpa/inet.h>
#    include <netinet/in.h>

#    if defined(HASIPv6)
#        include <netinet/in6.h>
#    endif /* defined(HASIPv6) */

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

#    include <sys/fstyp.h>
#    include <sys/mount.h>
#    include <sys/param.h>
#    include <sys/pstat.h>

#    if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 &&               \
        defined(_APP32_64BIT_OFF_T)
#        define TMP_APP32_64BIT_OFF_T _APP32_64BIT_OFF_T
#        undef _APP32_64BIT_OFF_T
#    endif

#    if !defined(__LP64__) && defined(_LARGEFILE64_SOURCE) && HPUXV >= 1123
/*
 * Make sure a 32 bit lsof for HPUX>=1123 uses [l]stat64 when
 * _LARGEFILE64_SOURCE is defined.
 */

#        define stat stat64
#        define lstat lstat64
#    endif /* !defined(__LP64__) && defined(_LARGEFILE64_SOURCE) &&            \
            * HPUXV>=1123                                                      \
            */

#    include <sys/socket.h>

#    if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 &&               \
        defined(_APP32_64BIT_OFF_T)
#        define _APP32_64BIT_OFF_T TMP_APP32_64BIT_OFF_T
#        undef TMP_APP32_64BIT_OFF_T
#    endif

#    include <sys/tihdr.h>
#    include <sys/un.h>

/*
 * This definition is needed for the common function prototype definitions
 * in "proto.h".  The /proc-based lsof also uses it to make sure its
 * manufactured node ID number has 64 bits.
 */

typedef unsigned long long KA_T;
#    define KA_T_FMT_X "%#llx"

/*
 * Local definitions
 */

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

#    define DEVINCR 1024 /* device table malloc() increment */
#    define MALLOC_P void
#    define FREE_P void
#    define MALLOC_S unsigned
#    define MOUNTED MNT_MNTTAB
#    define QSORT_P void
#    define READLEN_T int
#    define STRNCPY_L size_t
#    define SZOFFTYPE unsigned long long
#    define SZOFFPSPEC "ll" /* SZOFFTYPE printf specification modifier */
#    define XDR_PMAPLIST (xdrproc_t) xdr_pmaplist
#    define XDR_VOID (xdrproc_t) xdr_void

/*
 * Local macros
 */

#    define IS_PSFILEID(p) ((p)->psf_fsid.psfs_id || (p)->psf_fsid.psfs_type)
/* is psfiled active? */

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

extern _T_LONG_T CloneMaj; /* clone major device number */
extern int HaveCloneMaj;   /* clone major status */

struct mounts {
    char *dir;           /* directory (mounted on) */
    char *fsname;        /* file system
                          * (symbolic links unresolved) */
    char *fsnmres;       /* file system
                          * (symbolic links resolved) */
    char *mnt_fstype;    /* file system type -- e.g.,
                          * MNTTYPE_NFS */
    int stat_fstype;     /* st_fstype */
    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 */
    u_char is_nfs;       /* file system type is MNTTYPE_NFS or
                          * MNTTYPE_NFS3 */
    struct mounts *next; /* forward link */
};

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

extern char **Fsinfo;
extern int Fsinfomax;
extern int HasNFS;

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

#    define CLONEMAJ CloneMaj /* clone major variable name */
#    define DIRTYPE dirent
#    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_UCOMMLEN - 1)
/* max system command name length */

/*
 * Definition for rmnt.c
 */

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

#    if defined(HASFSTYPE) && HASFSTYPE == 2
#        define RMNT_STAT_FSTYPE st_fstype
#        define MOUNTS_STAT_FSTYPE stat_fstype
#    endif /* defined(HASFSTYPE) && HASFSTYPE==2 */

struct lsof_context_dialect {};

#endif /* HPUX_LSOF_H */
