/*
 * proc.h for Hp-UX 10.30 and above
 *
 * This header file defines the proc structure for lsof.  Lsof uses it to
 * get process information, including PGID, PID, PPID, UID, CWD, and open
 * file pointers.
 *
 * V. Abell <abe@purdue.edu>
 * February, 1998
 */

#if !defined(LSOF_PROC_H)
#    define LSOF_PROC_H

#    include "kernbits.h"
#    include <sys/types.h>
#    include <sys/resource.h>
#    include <sys/user.h>

struct pprof {
    KA_T pr_base;
    u_long pr_size;
    u_long pr_off;
    u_int pr_scale;
};

typedef enum proc_flag {
    SLOAD = 0x1,
    SSYS = 0x2,
    SDONTTRC = 0x4,
    STRC = 0x8,
    SWTED_PARENT = 0x10,
    SDEACTSELF = 0x20,
    SPVFORK = 0x40,
    SWEXIT = 0x80,
    SPGID_EXIT_ADJUSTED = 0x100,
    SVFORK = 0x200,
    SWANTS_ALLCPU = 0x400,
    SSERIAL = 0x800,
    SDEACT = 0x1000,
    SWAITIO = 0x2000,
    SWTED_DEBUGGER = 0x4000,
    SWCONT = 0x8000,
    SDBG_CREATING = 0x10000,
    SDBG_WAITING = 0x20000,
    SDBG_ACTIVE = 0x40000,
    SDBG_LIMBO = 0x80000,
    SDBG_ATTACHING = 0x100000,
    SDBG_EXITING = 0x200000,
    SDBG_KILLED = 0x400000,
    SDBG_INEXEC = 0x800000,
    SDBG_TRACESELF = 0x1000000,
    SDBG_STOPPED = 0x2000000,
    SDBG_EXITREQ = 0x4000000,
    SREAPING = 0x10000000
} proc_flag_t;

typedef enum proc_flag2 {
    S2CLDSTOP = 0x1,
    S2EXEC = 0x2,
    SGRAPHICS = 0x4,
    SADOPTIVE = 0x8,
    SADOPTIVE_WAIT = 0x10,
    SPMT = 0x40,
    S2SENDDILSIG = 0x100,
    SLKDONE = 0x200,
    SISNFSLM = 0x400,
    S2POSIX_NO_TRUNC = 0x800,
    S2SYSCALL_BYPID = 0x1000,
    S2ADOPTEE = 0x2000,
    SCRITICAL = 0x4000,
    SMULTITHREADED = 0x8000,
    S2NOCLDWAIT = 0x10000,
    S_USE_THRD_CACHE = 0x20000,
    S2PASS_VIOREF = 0x40000,
    S2VIOREF_NPROC = 0x80000,
    SUSRMULTITHREADED = 0x100000
} proc_flag2_t;

typedef enum proc_state {
    SUNUSED = 0,
    SWAIT = 0x1,
    SIDL = 0x2,
    SZOMB = 0x3,
    SSTOP = 0x4,
    SINUSE = 0x5
} proc_state_t;

typedef enum proc_sync_flag {
    P_OP_PENDING_READER = 0x1,
    P_OP_PENDING_WRITER = 0x2
} proc_sync_flag_t;

typedef enum proc_sync_reason {
    P_OP_NONE = 0,
    P_OP_THREAD_MGMT = 0x1,
    P_OP_EXIT = 0x2,
    P_OP_EXEC = 0x3,
    P_OP_SUSPEND = 0x4,
    P_OP_CONTINUE = 0x5,
    P_OP_SIGTRAP = 0x6,
    P_OP_FORK = 0x7,
    P_OP_VFORK = 0x8,
    P_OP_CORE = 0x9,
    KT_OP_SUSPEND = 0xa,
    KT_OP_RESUME = 0xb,
    KT_OP_CREATE = 0xc,
    KT_OP_TERMINATE = 0xd,
    KT_OP_LWPEXIT = 0xe,
    KT_OP_ABORT_SYSCALL = 0xf
} proc_sync_reason_t;

typedef struct proc {
    short p_fandx;
    short p_pandx;
    int p_created_threads;
    KA_T p_firstthreadp; /* thread pointer (for locks) */
    KA_T p_lastthreadp;
    proc_flag_t p_flag;
    KA_T thread_lock;
    KA_T p_lock;
    KA_T p_detached_zombie;
    KA_T p_fss;
    proc_state_t p_stat; /* process state */
    char p_nice;
    u_short p_pri;
    int p_livethreads;
    int p_cached_threads_count;
    int p_cached_threads_max;
    KA_T p_cached_threads;
    KA_T p_cache_next;
    KA_T p_cache_prev;
    ksigset_t p_sig;
    ksigset_t p_ksi_avail;
    ksigset_t p_ksifl_alloced;
    KA_T p_ksiactive;
    KA_T p_ksifree;
    KA_T p_sigcountp;
    KA_T p_sigwaiters;
    int p_cursig;
    proc_flag2_t p_flag2;
    int p_coreflags;
    uid_t p_uid; /* user ID (UID) of process owner */
    uid_t p_suid;
    KA_T p_pgid_p;
    gid_t p_pgid;
    pid_t p_pid;  /* process ID (PID) */
    pid_t p_ppid; /* parent process ID (PPID) */
    size_t p_maxrss;
    short p_idhash;
    short p_ridhash;
    short p_pgidhx;
    short p_rpgidhx;
    short p_uidhx;
    short p_ruidhx;
    KA_T p_pptr;
    KA_T p_cptr;
    KA_T p_osptr;
    KA_T p_ysptr;
    KA_T p_dptr;
    KA_T p_vas; /* pointer to VM for process */
    short p_memresv;
    short p_swpresv;
    short p_sysmemresv;
    short p_sysswpresv;
    u_short p_xstat;
    time_t p_deactime;
    short p_ndx;
    sid_t p_sid;
    short p_sidhx;
    short p_rsidhx;
    short p_idwrite;
    KA_T p_semundo;
    KA_T p_dbipcp;
    u_char p_cookie;
    u_char p_reglocks;
    int p_no_swap_count;
    dev_t p_ttyd;
    KA_T p_ttyp;
    KA_T p_nextdeact;
    time_t p_start;
    KA_T p_shadproc;
    KA_T p_bor_lock;
    int p_maxof;   /* maximum open files */
    KA_T p_cdir;   /* pointer to CWD vnode */
    KA_T p_rdir;   /* pointer to root directory vnode */
    KA_T p_ofilep; /* pointer to ofile_t chain */
    KA_T p_vforkbuf;
    u_int p_schedpolicy;
    u_short p_pindx;
    KA_T p_krusagep;
    KA_T p_timers;
    KA_T p_clic;
    proc_sync_reason_t p_sync_reason;
    void (*p_wide_action_hdlr)();
    proc_sync_flag_t p_sync_flag;
    ushort p_sync_readers;
    ushort p_sync_writers;
    u_int p_sync_thread_cnt;
    int p_suspended_threads;
    int p_captr;
    union {
        struct {
            u_int zombies_exist : 1, recalc_privgrps : 1, unused : 30;
        } bits;
        u_int all;
    } p_pl_flags;
    u_int p_seqnum;
    spu_t p_spu_group;
    u_char p_spu_mandatory;
    KA_T p_cred;
    caddr_t p_ki_bitmap;
    KA_T p_aioqp;
    KA_T p_shared;
    KA_T p_nseminfop;
    KA_T p_mqpinfop;
    KA_T p_dbgctltp;
    KA_T p_dbgp;
    KA_T p_trcp;
    KA_T p_p2p;
    KA_T p_gang;
    u_int p_pmon_timer_mask;
    u_int p_pmon_inherit;
    u_long p_pmon_state_flag;
    u_long p_pmon_state_value;
    KA_T p_cnx_features;
    char p_comm[15];
    aid_t p_aid;
    short p_audproc;
    short p_audsusp;
    gid_t p_sgid;
    u_int p_priv[2];
    int p_highestfd;
    short p_cmask;
    time_t p_ticks;
    short p_acflag;
    struct rlimit p_rlimit[11];
    KA_T p_auditperproc;
    struct pprof p_prof;
    char p_spare[48];
} proc_t;

#endif /* !defined(LSOF_PROC_H) */
