remove aix 4.x + 5.x bincompat insanity, allowing sigar to be compiled on 5.x
This commit is contained in:
		
							parent
							
								
									9badde2eae
								
							
						
					
					
						commit
						829f93104f
					
				@ -46,9 +46,6 @@
 | 
			
		||||
#include <sys/cfgdb.h>
 | 
			
		||||
#include <cf.h>
 | 
			
		||||
 | 
			
		||||
#include "user_v5.h"
 | 
			
		||||
#include "utmp_v5.h"
 | 
			
		||||
 | 
			
		||||
#include <sys/ldr.h>
 | 
			
		||||
 | 
			
		||||
/* not defined in aix 4.3 */
 | 
			
		||||
@ -791,67 +788,30 @@ int sigar_cpu_list_get(sigar_t *sigar, sigar_cpu_list_t *cpulist)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int boot_time_v4(int fd, time_t *time)
 | 
			
		||||
static int boot_time(sigar_t *sigar, time_t *time)
 | 
			
		||||
{
 | 
			
		||||
    int fd;
 | 
			
		||||
    struct utmp data;
 | 
			
		||||
 | 
			
		||||
    if ((fd = open(UTMP_FILE, O_RDONLY)) < 0) {
 | 
			
		||||
        return errno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    do {
 | 
			
		||||
        if (read(fd, &data, sizeof(data)) != sizeof(data)) {
 | 
			
		||||
            return errno;
 | 
			
		||||
            int status = errno;
 | 
			
		||||
            close(fd);
 | 
			
		||||
            return status;
 | 
			
		||||
        }
 | 
			
		||||
    } while (data.ut_type != BOOT_TIME);
 | 
			
		||||
 | 
			
		||||
    *time = data.ut_time;
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int boot_time_v5(int fd, time_t *time)
 | 
			
		||||
{
 | 
			
		||||
    struct utmp_v5 data;
 | 
			
		||||
 | 
			
		||||
    do {
 | 
			
		||||
        if (read(fd, &data, sizeof(data)) != sizeof(data)) {
 | 
			
		||||
            return errno;
 | 
			
		||||
        }
 | 
			
		||||
    } while (data.ut_type != BOOT_TIME);
 | 
			
		||||
 | 
			
		||||
    if (data.ut_time != 0) {
 | 
			
		||||
        *time = data.ut_time;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        /* XXX: dunno wtf is going on here.
 | 
			
		||||
         * this exact code above works as expected
 | 
			
		||||
         * in a standalone program.
 | 
			
		||||
         * sizeof(utmp_v5) is the same if compiled on 4.3
 | 
			
		||||
         * or 5.2, this workaround hack will have todo for now.
 | 
			
		||||
         */
 | 
			
		||||
        *time = data.__time_t_space;
 | 
			
		||||
    }
 | 
			
		||||
    close(fd);
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int boot_time(sigar_t *sigar, time_t *time)
 | 
			
		||||
{
 | 
			
		||||
    int utmp, status;
 | 
			
		||||
 | 
			
		||||
    if ((utmp = open(UTMP_FILE, O_RDONLY)) < 0) {
 | 
			
		||||
        return errno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (sigar->aix_version == 4) {
 | 
			
		||||
        status = boot_time_v4(utmp, time);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        status = boot_time_v5(utmp, time);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close(utmp);
 | 
			
		||||
 | 
			
		||||
    return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sigar_uptime_get(sigar_t *sigar,
 | 
			
		||||
                     sigar_uptime_t *uptime)
 | 
			
		||||
{
 | 
			
		||||
@ -874,84 +834,42 @@ int sigar_uptime_get(sigar_t *sigar,
 | 
			
		||||
#define WHOCPY(dest, src) \
 | 
			
		||||
    SIGAR_SSTRCPY(dest, src); \
 | 
			
		||||
    if (sizeof(src) < sizeof(dest)) \
 | 
			
		||||
        dest[sizeof(src)] = '\0'
 | 
			
		||||
 | 
			
		||||
static int who_v4(sigar_t *sigar, sigar_who_list_t *wholist, FILE *fp)
 | 
			
		||||
{
 | 
			
		||||
    struct utmp ut;
 | 
			
		||||
 | 
			
		||||
    while (fread(&ut, sizeof(ut), 1, fp) == 1) {
 | 
			
		||||
        sigar_who_t *who;
 | 
			
		||||
 | 
			
		||||
        if (*ut.ut_name == '\0') {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ut.ut_type != USER_PROCESS) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SIGAR_WHO_LIST_GROW(wholist);
 | 
			
		||||
        who = &wholist->data[wholist->number++];
 | 
			
		||||
 | 
			
		||||
        WHOCPY(who->user, ut.ut_user);
 | 
			
		||||
        WHOCPY(who->device, ut.ut_line);
 | 
			
		||||
        WHOCPY(who->host, ut.ut_host);
 | 
			
		||||
 | 
			
		||||
        who->time = ut.ut_time;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int who_v5(sigar_t *sigar, sigar_who_list_t *wholist, FILE *fp)
 | 
			
		||||
{
 | 
			
		||||
    struct utmp_v5 ut;
 | 
			
		||||
 | 
			
		||||
    while (fread(&ut, sizeof(ut), 1, fp) == 1) {
 | 
			
		||||
        sigar_who_t *who;
 | 
			
		||||
 | 
			
		||||
        if (*ut.ut_name == '\0') {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ut.ut_type != USER_PROCESS) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SIGAR_WHO_LIST_GROW(wholist);
 | 
			
		||||
        who = &wholist->data[wholist->number++];
 | 
			
		||||
 | 
			
		||||
        WHOCPY(who->user, ut.ut_user);
 | 
			
		||||
        WHOCPY(who->device, ut.ut_line);
 | 
			
		||||
        WHOCPY(who->host, ut.ut_host);
 | 
			
		||||
 | 
			
		||||
        who->time = ut.ut_time;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
        dest[sizeof(dest)-1] = '\0'
 | 
			
		||||
 | 
			
		||||
static int sigar_who_utmp(sigar_t *sigar,
 | 
			
		||||
                          sigar_who_list_t *wholist)
 | 
			
		||||
{
 | 
			
		||||
    int status;
 | 
			
		||||
    struct utmp ut;
 | 
			
		||||
    FILE *fp;
 | 
			
		||||
 | 
			
		||||
    if (!(fp = fopen(UTMP_FILE, "r"))) {
 | 
			
		||||
        return errno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (sigar->aix_version == 4) {
 | 
			
		||||
        status = who_v4(sigar, wholist, fp);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        status = who_v5(sigar, wholist, fp);
 | 
			
		||||
    while (fread(&ut, sizeof(ut), 1, fp) == 1) {
 | 
			
		||||
        sigar_who_t *who;
 | 
			
		||||
 | 
			
		||||
        if (*ut.ut_name == '\0') {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ut.ut_type != USER_PROCESS) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SIGAR_WHO_LIST_GROW(wholist);
 | 
			
		||||
        who = &wholist->data[wholist->number++];
 | 
			
		||||
 | 
			
		||||
        WHOCPY(who->user, ut.ut_user);
 | 
			
		||||
        WHOCPY(who->device, ut.ut_line);
 | 
			
		||||
        WHOCPY(who->host, ut.ut_host);
 | 
			
		||||
 | 
			
		||||
        who->time = ut.ut_time;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fclose(fp);
 | 
			
		||||
 | 
			
		||||
    return status;
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sigar_who_list_get(sigar_t *sigar,
 | 
			
		||||
@ -1268,44 +1186,12 @@ int sigar_proc_env_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * V[45]_sigar_proc_fd_get routines are exactly
 | 
			
		||||
 * the same except for sizeof(uinfo).
 | 
			
		||||
 */
 | 
			
		||||
static int V5_sigar_proc_fd_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
                                sigar_proc_fd_t *procfd)
 | 
			
		||||
int sigar_proc_fd_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
                      sigar_proc_fd_t *procfd)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    struct procsinfo pinfo;
 | 
			
		||||
    struct user_v5 uinfo; /* V5 */
 | 
			
		||||
 | 
			
		||||
    procfd->total = 0;
 | 
			
		||||
    pinfo.pi_pid = pid;
 | 
			
		||||
 | 
			
		||||
    if (getuser(&pinfo, sizeof(pinfo),
 | 
			
		||||
                &uinfo, sizeof(uinfo)) != 0) {
 | 
			
		||||
        if (errno == EINVAL) {
 | 
			
		||||
            return SIGAR_ENOTIMPL;
 | 
			
		||||
        }
 | 
			
		||||
        return errno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* see sys/user.h */
 | 
			
		||||
    for (i=0; i<uinfo.U_maxofile; i++) {
 | 
			
		||||
        if (uinfo.U_ufd[i].fp) {
 | 
			
		||||
            procfd->total++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int V4_sigar_proc_fd_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
                                sigar_proc_fd_t *procfd)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    struct procsinfo pinfo;
 | 
			
		||||
    struct user uinfo; /* V4 */
 | 
			
		||||
    struct user uinfo;
 | 
			
		||||
 | 
			
		||||
    procfd->total = 0;
 | 
			
		||||
    pinfo.pi_pid = pid;
 | 
			
		||||
@ -1327,30 +1213,6 @@ static int V4_sigar_proc_fd_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sigar_proc_fd_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
                      sigar_proc_fd_t *procfd)
 | 
			
		||||
{
 | 
			
		||||
    if (sigar->getprocfd == NULL) {
 | 
			
		||||
        /*
 | 
			
		||||
         * XXX should determine aix version in sigar_os_open
 | 
			
		||||
         * and set function pointer there.  for now try v4
 | 
			
		||||
         * first, if that fails try v5.  only costs 1 extra
 | 
			
		||||
         * call to getuser on v5 for the lifetime of the
 | 
			
		||||
         * sigar.
 | 
			
		||||
         */
 | 
			
		||||
        int status = V4_sigar_proc_fd_get(sigar, pid, procfd);
 | 
			
		||||
 | 
			
		||||
        if (status == SIGAR_OK) {
 | 
			
		||||
            sigar->getprocfd = V4_sigar_proc_fd_get;
 | 
			
		||||
            return SIGAR_OK;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sigar->getprocfd = V5_sigar_proc_fd_get;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return sigar->getprocfd(sigar, pid, procfd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sigar_proc_exe_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
                       sigar_proc_exe_t *procexe)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,312 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * struct user is not binary compatible
 | 
			
		||||
 * between 4.3 and 5.x
 | 
			
		||||
 * this structure is taken from 5.1 sys/user.h
 | 
			
		||||
 * and defines from sys/user.h and sys/types.h
 | 
			
		||||
 * we compile this on v5.
 | 
			
		||||
 * XXX: will not compile 5.x  if we want to compile
 | 
			
		||||
 * on 5.x would need to create a struct user_v4
 | 
			
		||||
 * to maintain bincompt.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define V5_NISIG           3 /* v4 == 2 */
 | 
			
		||||
 | 
			
		||||
#define SIGMAX64 255
 | 
			
		||||
#define SIGMAX32 63
 | 
			
		||||
#ifdef __64BIT__
 | 
			
		||||
#define V5_SIGMAX SIGMAX64
 | 
			
		||||
#else
 | 
			
		||||
#define V5_SIGMAX SIGMAX32
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define NSIG64		(SIGMAX64+1)
 | 
			
		||||
#define NSIG32		(SIGMAX32+1)
 | 
			
		||||
#ifdef __64BIT__
 | 
			
		||||
#define V5_NSIG		NSIG64
 | 
			
		||||
#else
 | 
			
		||||
#define V5_NSIG		NSIG32
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define WLM_TAG_LENGTH 30
 | 
			
		||||
#define U_FD_LCK_CNT 16
 | 
			
		||||
 | 
			
		||||
typedef vmhandle_t      vmlpghandle_t;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
#ifdef _ALL_SOURCE
 | 
			
		||||
	unsigned int losigs, hisigs;
 | 
			
		||||
#else
 | 
			
		||||
	unsigned int __losigs, __hisigs;
 | 
			
		||||
#endif
 | 
			
		||||
} sigset32_t;
 | 
			
		||||
 | 
			
		||||
struct user_v5 {
 | 
			
		||||
 | 
			
		||||
	/* swappable process context */
 | 
			
		||||
	unsigned long long U_chk_paddr; /* address of checkpnt_pending var */
 | 
			
		||||
	struct saioq_head *U_saioq_head;/* anchor for async socket queue */
 | 
			
		||||
	uid_t		   U_sv_sgid;   /* set group identifier at exec time */
 | 
			
		||||
	int 		   U_num_pmsegs;/* number of PM segments */
 | 
			
		||||
	vmhandle_t 	   *U_pm_segs;	/* PM segments */
 | 
			
		||||
	vmhandle_t 	   U_pm_space;	/* space for first PM segment */
 | 
			
		||||
	vmhandle_t 	   U_text_vmh;	/* text seg vmhandle for memusage */
 | 
			
		||||
        unsigned long long U_cancel_func;/* cancelation user entry point */
 | 
			
		||||
        unsigned long long U_cancel_toc;/* cancelation user entry point */
 | 
			
		||||
	struct proc	*U_procp;	/* pointer to proc structure */
 | 
			
		||||
	Simple_lock	U_handy_lock;	/* self preservation lock */
 | 
			
		||||
 | 
			
		||||
#ifdef __64BIT_KERNEL
 | 
			
		||||
#ifdef _POWER
 | 
			
		||||
	/* U_segs32 must be pinned and must not cross a page boundary */
 | 
			
		||||
        void            *U_segs32_raddr; /* real addr of U_segs32 */
 | 
			
		||||
        vmhandle_t      U_segs32[NSEGS]; /* shadow of first 4Gb for resume() */
 | 
			
		||||
#endif /* _POWER */
 | 
			
		||||
#endif /* __64BIT_KERNEL */
 | 
			
		||||
 | 
			
		||||
	/* signal management */
 | 
			
		||||
	void		(*U_signal[NSIG32+V5_NISIG])(int);/* disposition of sigs */
 | 
			
		||||
	sigset32_t	U_sigmask[NSIG32+V5_NISIG];       /* sig's to be blocked */
 | 
			
		||||
#ifdef __64BIT_KERNEL
 | 
			
		||||
	uint		U_sigflags[V5_NSIG+V5_NISIG];	
 | 
			
		||||
#else
 | 
			
		||||
	ushort		U_sigflags[NSIG64+V5_NISIG];/* ushort-save space for now*/
 | 
			
		||||
#endif /* __64BIT_KERNEL */
 | 
			
		||||
 | 
			
		||||
	/* user-mode address space mapping */
 | 
			
		||||
#ifndef __64BIT_KERNEL
 | 
			
		||||
	adspace_t	U_adspace;	/* user-mode address space */
 | 
			
		||||
	struct segstate U_segst[NSEGS]; /* info on use of each segment */
 | 
			
		||||
#else
 | 
			
		||||
#ifdef _POWER
 | 
			
		||||
        void *    	U_uastrtp;      /* strt addr for V_USERACC */
 | 
			
		||||
	vmsize_t  	U_uasize;       /* size of the V_USERACC buf */
 | 
			
		||||
#endif /* _POWER */
 | 
			
		||||
	struct asalloc  U_snode;	/* segment node allocation */
 | 
			
		||||
	struct asalloc  U_unode;	/* uadspace node allocation */
 | 
			
		||||
        struct uadnode  U_adspace32[NADNODES]; /* usr adspace 32bit process */
 | 
			
		||||
        struct segnode  U_segnode[NSEGNODES]; /* segnode for 32bit processes */
 | 
			
		||||
#endif /* __64BIT_KERNEL */
 | 
			
		||||
	struct vmmlock 	U_adspace_lock;
 | 
			
		||||
	int		U_vmmflags;	/* vmm process state flags */
 | 
			
		||||
 | 
			
		||||
	/* auditing stuff */
 | 
			
		||||
	int		U_auditstatus;	/* auditing RESUME or SUSPEND */
 | 
			
		||||
 | 
			
		||||
	/* address map (mmap) */
 | 
			
		||||
	char		*U_map;
 | 
			
		||||
 | 
			
		||||
	/* current exec file information */
 | 
			
		||||
 	char		U_comm[MAXCOMLEN+1]; /* basename of exec file */
 | 
			
		||||
 | 
			
		||||
	int		U_ncargs;	     /* ARGMAX value during exec */
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Program model information, 64bit and 32bit, small and large data.
 | 
			
		||||
	 * The 'max' values are the maximums allowed by the model, which
 | 
			
		||||
	 * may be smaller than the current resource limits.
 | 
			
		||||
	 * These fields are filled in during exec.
 | 
			
		||||
	 *
 | 
			
		||||
	 * There is no U_stksize field.  The stack is allowed whatever it can
 | 
			
		||||
	 * get, subject to resource limits, model limits (possibly set from
 | 
			
		||||
	 * the a.out header during exec), and, in 32-bit mode, the PRIVSEG
 | 
			
		||||
	 * data break address.  The get_stack_size routine will return the
 | 
			
		||||
	 * current maximum effective size of the stack.
 | 
			
		||||
	 *
 | 
			
		||||
	 * Other fields:
 | 
			
		||||
	 *   U_breakhiwater: the high water mark for the break value
 | 
			
		||||
	 *   U_minbreak: the smallest permitted break value
 | 
			
		||||
	 *   U_min_mmap: If non-zero, smallest address allowed for mmap()
 | 
			
		||||
	 *		or shmat() at a user-specified address.
 | 
			
		||||
	 */
 | 
			
		||||
	unsigned long long U_tstart;	/* start of text	*/
 | 
			
		||||
	unsigned long long U_tsize;	/* text size (bytes)	*/
 | 
			
		||||
	unsigned long long U_datastart;	/* start of data	*/
 | 
			
		||||
	unsigned long long U_datasize;	/* Current data size (bytes)	*/
 | 
			
		||||
 | 
			
		||||
	/* DABR watchpoint information */
 | 
			
		||||
	unsigned long long U_wp_dabr;	/* DABR value for ptrace watchpoint */
 | 
			
		||||
	unsigned long long U_wp_value;	/* current value at watched address */
 | 
			
		||||
 | 
			
		||||
	/* System call table information */
 | 
			
		||||
	void		*U_svc_table;	/* svc table address  */
 | 
			
		||||
	int		U_max_svcnum;	/* max allowed svc number for process */
 | 
			
		||||
 | 
			
		||||
	/* CHANGES FROM HERE ON DO NOT AFFECT ASSEMBLER CODE
 | 
			
		||||
	   (see ml/POWER/32user.m4) */
 | 
			
		||||
 | 
			
		||||
	char		U_pad2[32];
 | 
			
		||||
 | 
			
		||||
	unsigned long long U_datamax;	/* Maximum data size (bytes)	*/
 | 
			
		||||
	unsigned long long U_minbreak;	/* minimum/initial break address */
 | 
			
		||||
	unsigned long long U_breakhiwater; /* Largest break address so far */
 | 
			
		||||
	unsigned long long U_min_mmap;	/* Minimum shmat/mmap address allowed */
 | 
			
		||||
 | 
			
		||||
	uint		U_brkseg;	/* segment number of U_breakhiwater */
 | 
			
		||||
	uint		U_stkseg;	/* Lowest segment number of stack */
 | 
			
		||||
 | 
			
		||||
	unsigned long long U_stkstart;	/* stack start (grows downwards) */
 | 
			
		||||
	unsigned long long U_stkmax;	/* stack max (bytes)	*/
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * The following macros compute some commonly required values
 | 
			
		||||
	 * about the addressing model.
 | 
			
		||||
	 *
 | 
			
		||||
	 * U_BIGDATA	Tells you whether the 32-bit large data model
 | 
			
		||||
	 *		is in effect.
 | 
			
		||||
	 * U_PDATASIZE	Is the current data size for a 32-bit process
 | 
			
		||||
	 *		in the private segment (hence the P).
 | 
			
		||||
	 *		Note - this is always the PRIVSEG data size; with
 | 
			
		||||
	 *		the large data model, the general data size is
 | 
			
		||||
	 *		separate, as data begins in the BDATASEG.
 | 
			
		||||
	 * U_PDATABRK	Is the current data break address of a 32-bit process
 | 
			
		||||
	 *		in the private segment (see above).
 | 
			
		||||
	 * U_DATABRK	Is the general data break address in all cases.
 | 
			
		||||
	 * U_DSIZE	Is for compatibility only.  Use it to fill in fields
 | 
			
		||||
	 *		that previously were copies of U_dsize, which is now
 | 
			
		||||
	 *		obsolete.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	unsigned int	U_sdsize;	/* Size of data for privately loaded
 | 
			
		||||
					   modules, if the bigdata model is
 | 
			
		||||
					   being used. */
 | 
			
		||||
	short		U_lock; 	/* process/text locking flags */
 | 
			
		||||
	char		U_64bit;	/* 0 if 32-bit process, 0x1 if 64-bit */
 | 
			
		||||
	char		U_emul;		/* emulation type (UW7, etc.) */
 | 
			
		||||
 | 
			
		||||
	/* user identification and authorization */
 | 
			
		||||
	Simple_lock	U_cr_lock;	/* credentials lock */
 | 
			
		||||
        struct ucred    * volatile U_cred; /* user credentials (uid, gid, etc) */
 | 
			
		||||
 | 
			
		||||
	uinfo_t 	U_uinfo;	/* usrinfo() buffer */
 | 
			
		||||
	int		U_compatibility;/* compatibility/user mode bit masks */
 | 
			
		||||
 | 
			
		||||
	/* defines for u.u_compatibility bit mask */
 | 
			
		||||
 | 
			
		||||
	struct sem_undo	*U_semundo;	/* semaphore undo struct pointer */
 | 
			
		||||
 | 
			
		||||
	/* accounting and profiling data */
 | 
			
		||||
	time_t		U_start;
 | 
			
		||||
	time_t		U_ticks;
 | 
			
		||||
	struct profdata U_prof;
 | 
			
		||||
	short		U_acflag;	/* accounting flag */
 | 
			
		||||
	struct trusage64 U_ru;		/* this process resource usage value */
 | 
			
		||||
	struct trusage64 U_cru;		/* accumulated children's resources */
 | 
			
		||||
        /*
 | 
			
		||||
         * The kernel uses U_ru & U_cru to keep track of the time used by
 | 
			
		||||
         * the process and its children.
 | 
			
		||||
         * Even though the ru_utime & ru_stime fields within U_ru & U_cru are
 | 
			
		||||
         * struct timeval, their granularity within the kernel is nanoseconds,
 | 
			
		||||
         * not microseconds. This is the granularity returned by getprocs().
 | 
			
		||||
         * Other syscalls and library functions convert this to microseconds.
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
	char		U_pthru;		/* pthread rusage tracking */
 | 
			
		||||
 | 
			
		||||
	/* virtualized resource usage values */
 | 
			
		||||
	struct trusage64 U_vru;
 | 
			
		||||
	struct trusage64 U_vcru;
 | 
			
		||||
 | 
			
		||||
	/* resource limits and counters */
 | 
			
		||||
	unsigned long	U_fsblimit;		/* fs limit in 512 byte-blks */
 | 
			
		||||
 | 
			
		||||
#if defined(_KERNSYS) || defined(__64BIT_KERNEL)
 | 
			
		||||
	/* rlimit32 structure is exposed to only 32/64 kernel 
 | 
			
		||||
	 * and 64bit kernel extensions 
 | 
			
		||||
	 */
 | 
			
		||||
	struct rlimit32	U_rlimit[RLIM_NLIMITS];	/* 32-bit resource limits */
 | 
			
		||||
#else
 | 
			
		||||
	struct rlimit	U_rlimit[RLIM_NLIMITS];	/* 32-bit resource limits */
 | 
			
		||||
#endif
 | 
			
		||||
	struct rlimit64 U_saved_rlimit[RLIM_NLIMITS]; /* saved 64-bit limits */
 | 
			
		||||
        /*
 | 
			
		||||
         * To maximize compatibility with old kernel code, a 32-bit
 | 
			
		||||
         * representation of each resource limit is maintained in U_rlimit.
 | 
			
		||||
         * Should the limit require a 64-bit representation, the U_rlimit
 | 
			
		||||
         * value is set to RLIM_INFINITY, with actual 64-bit limit being
 | 
			
		||||
         * stored in U_saved_rlimit.  These flags indicate what
 | 
			
		||||
         * the real situation is:
 | 
			
		||||
         *
 | 
			
		||||
         *   RLFLAG_SML => limit correctly represented in 32-bit U_rlimit
 | 
			
		||||
         *   RLFLAG_INF => limit is infinite
 | 
			
		||||
         *   RLFLAG_MAX => limit is in 64_bit U_saved_rlimit.rlim_max
 | 
			
		||||
         *   RLFLAG_CUR => limit is in 64_bit U_saved_rlimit.rlim_cur
 | 
			
		||||
         *
 | 
			
		||||
         * These flags are for use by the getrlimit/setrlimit routines only.
 | 
			
		||||
         * Kernel code desiring a 64-bit limit must go through kgetrlimit.
 | 
			
		||||
         */
 | 
			
		||||
        struct {
 | 
			
		||||
                uchar rlim_cur;                 /* how to determine rlim_cur */
 | 
			
		||||
                uchar rlim_max;                 /* how to determine rlim_max */
 | 
			
		||||
	} U_rlimit_flag[RLIM_NLIMITS];
 | 
			
		||||
 | 
			
		||||
	unsigned long long U_ioch; 		/* I/O character count */
 | 
			
		||||
 | 
			
		||||
	/* timers */
 | 
			
		||||
	Simple_lock	U_timer_lock;
 | 
			
		||||
	struct trb	*U_timer[NTIMERS];	/* per process timers */
 | 
			
		||||
 | 
			
		||||
	/* controlling tty info */
 | 
			
		||||
  	pid_t		*U_ttysid;	/* ptr to session leader id in tty */
 | 
			
		||||
	pid_t		*U_ttyp;	/* ptr to controlling tty pgrp field */
 | 
			
		||||
	dev_t		U_ttyd; 	/* controlling tty dev */
 | 
			
		||||
	long		U_ttympx;	/* mpx value for controlling tty */
 | 
			
		||||
	unsigned	*U_ttys;	/* pointer to t_state in tty struct */
 | 
			
		||||
	int32long64_t	U_ttyid;	/* tty id */
 | 
			
		||||
	int		(*U_ttyf)();	/* tty query function pointer */
 | 
			
		||||
 | 
			
		||||
	struct upfbuf	*U_message;	/* uprintf buffer pointer */
 | 
			
		||||
	struct trb *   	U_trb;		/* trb for user scheduler */
 | 
			
		||||
	struct pvthread	*U_chktv;	/* pointer to adv handler pvthread */
 | 
			
		||||
 | 
			
		||||
	/* file system state */
 | 
			
		||||
	vmid_t		U_pn_segno;	/* sid of chkpt/restart pathname seg*/
 | 
			
		||||
	Simple_lock	U_pnseg_lock;	/* lock of chkpt/restart pathname seg*/
 | 
			
		||||
	struct vnode	*U_cdir;	/* current directory of process */
 | 
			
		||||
	struct vnode	*U_rdir;	/* root directory of process */
 | 
			
		||||
	short		U_cmask;	/* mask for file creation */
 | 
			
		||||
	Simple_lock	U_fso_lock;	/* other file system fields lock */
 | 
			
		||||
	long		U_lockflag;	/* process has done file locks */
 | 
			
		||||
	long		U_fdevent;	/* fd lock event list */
 | 
			
		||||
 | 
			
		||||
        long long       U_irss;         /* accumulator for memory integral */
 | 
			
		||||
	struct pinu_block *U_pinu_block;/* list of control structs for pinu */
 | 
			
		||||
	tid_t		U_ulocks;	/* event list for user locks */
 | 
			
		||||
	int32long64_t	U_rmmap;	/* anchor of rmmap list	*/
 | 
			
		||||
 | 
			
		||||
	unsigned long long U_loader[84]; /* loader area */
 | 
			
		||||
	Simple_lock     U_aio_susp_lock; /* aio lock used in aio_suspend */
 | 
			
		||||
	unsigned int    U_fdfree[2];    /* file descriptor management */
 | 
			
		||||
 | 
			
		||||
	unsigned int    U_cannot_chpt;  /* process unable to checkpoint */
 | 
			
		||||
	unsigned int	U_maxofile;	/* maximum u_ofile index in use */
 | 
			
		||||
	unsigned int	U_freefile;	/* first available u_ofile index */
 | 
			
		||||
 | 
			
		||||
	/* WLM data */
 | 
			
		||||
	dev64_t		U_dev;		/* device of exec'ed file */
 | 
			
		||||
	ino64_t		U_ino;		/* inode */
 | 
			
		||||
	uint_t		U_gen;		/* generation number */
 | 
			
		||||
 | 
			
		||||
	char		U_tag[WLM_TAG_LENGTH+1]; /* WLM tag: user settable string */
 | 
			
		||||
 | 
			
		||||
	/*  structures added for VMM checkpoint/restart support */
 | 
			
		||||
        struct ckpt_ipcid *U_ckptshm;   /* ptr to shmid blocks for checkpoint   */
 | 
			
		||||
        struct ckpt_ipcid *U_ckptsem;   /* ptr to semid blocks for checkpoint   */
 | 
			
		||||
        struct ckpt_ipcid *U_ckptmsg;   /* ptr to msgid blocks for checkpoint   */
 | 
			
		||||
        struct _mmapent   *U_mapent;    /* ptr to mmap entry structure used for restart */
 | 
			
		||||
	ut_error_t	   U_ckpterr;   /* u_error saved during ckpt processing */
 | 
			
		||||
 | 
			
		||||
#ifdef __64BIT_KERNEL
 | 
			
		||||
	char		cacheline_pad[128]; /* keep 1st cacheline alligned */
 | 
			
		||||
#else
 | 
			
		||||
	vmlpghandle_t   U_lpgsegs32[NSEGS]; /* lgpg handles for 32bit processes */
 | 
			
		||||
	char		cacheline_pad[64]; /* keep 1st cacheline alligned */
 | 
			
		||||
#endif /* __64BIT_KERNEL */
 | 
			
		||||
	struct {		  	    /* file descriptor lock cacheline */
 | 
			
		||||
		Simple_lock	u_fd_slock;
 | 
			
		||||
		char		cache_pad[128 - sizeof(Simple_lock)];
 | 
			
		||||
	} U_fd_slcks[U_FD_LCK_CNT]; 
 | 
			
		||||
 | 
			
		||||
	/* from here on the data is pageable. */
 | 
			
		||||
 | 
			
		||||
	struct ufd	U_ufd[OPEN_MAX];/* User's file descriptor table */
 | 
			
		||||
};
 | 
			
		||||
@ -1,36 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * struct utmp is not binary compatible
 | 
			
		||||
 * between 4.3 and 5.x
 | 
			
		||||
 * this structure is taken from 5.1 utmp.h
 | 
			
		||||
 * we compile this on v4.3.
 | 
			
		||||
 * XXX: will not compile 5.x  if we want to compile
 | 
			
		||||
 * on 5.x would need to create a struct user_v4
 | 
			
		||||
 * to maintain bincompt.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
struct utmp_v5 {
 | 
			
		||||
	char ut_user[256] ;		/* User login name */
 | 
			
		||||
	char ut_id[14] ;		/* /etc/inittab id */
 | 
			
		||||
	char ut_line[64] ;		/* device name (console, lnxx) */
 | 
			
		||||
	pid_t ut_pid ;			/* process id */
 | 
			
		||||
	short ut_type ; 		/* type of entry */
 | 
			
		||||
#if !defined(__64BIT__) && !defined(__ia64)
 | 
			
		||||
        int __time_t_space;             /* for 32vs64-bit time_t PPC */
 | 
			
		||||
#endif
 | 
			
		||||
	time_t ut_time ;		/* time entry was made */
 | 
			
		||||
#if !defined(__64BIT__) && defined(__ia64)
 | 
			
		||||
        int __time_t_space;             /* for 32vs64-bit time_t IA64 */
 | 
			
		||||
#endif
 | 
			
		||||
	struct exit_status_v5
 | 
			
		||||
	  {
 | 
			
		||||
	    short e_termination ;	/* Process termination status */
 | 
			
		||||
	    short e_exit ;		/* Process exit status */
 | 
			
		||||
	  }
 | 
			
		||||
	ut_exit ;			/* The exit status of a process
 | 
			
		||||
					 * marked as DEAD_PROCESS.
 | 
			
		||||
					 */
 | 
			
		||||
	char ut_host[256] ;		/* host name */
 | 
			
		||||
	int __dbl_word_pad;		/* for double word alignment */
 | 
			
		||||
	int __reservedA[2];
 | 
			
		||||
	int __reservedV[6];
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user