BSD-Process

 view release on metacpan or  search on metacpan

Process.xs  view on Meta::CPAN

#define TIME_FRAC(t) ((double)(t).tv_sec + (double)(t).tv_usec/1000000)
#define P_FLAG(f)    ((kp->ki_flag   & f) ? 1 : 0)
#define KI_FLAG(f)   ((kp->ki_kiflag & f) ? 1 : 0)

#if __FreeBSD_version < 500000
#define NO_FREEBSD_4x(a)    (-1)
#define NO_FREEBSD_4x_pv(a) ("")
#else
#define NO_FREEBSD_4x(a)    (a)
#define NO_FREEBSD_4x_pv(a) (a)
#endif

#if __FreeBSD_version < 600000
#define NO_FREEBSD_5x(a)    (-1)
#define NO_FREEBSD_5x_pv(a) ("")
#else
#define NO_FREEBSD_5x(a)    (a)
#define NO_FREEBSD_5x_pv(a) (a)
#endif

static int proc_info_mib[4] = { -1, -1, -1, -1 };

struct kinfo_proc *_proc_request (kvm_t *kd, int request, int param, int *pnr) {
    struct kinfo_proc *kip;

    switch(request) {
    case 2:
        kip = kvm_getprocs(kd, KERN_PROC_PGRP, param, pnr);
        break;
    case 3:
        kip = kvm_getprocs(kd, KERN_PROC_SESSION, param, pnr);
        break;
    case 5:
        kip = kvm_getprocs(kd, KERN_PROC_UID, param, pnr);
        break;
    case 6:
        kip = kvm_getprocs(kd, KERN_PROC_RUID, param, pnr);
        break;
#if __FreeBSD_version >= 600000
    case 10:
        kip = kvm_getprocs(kd, KERN_PROC_RGID, param, pnr);
        break;
    case 11:
        kip = kvm_getprocs(kd, KERN_PROC_GID, param, pnr);
        break;
#endif
    case 0:
    default:
        kip = kvm_getprocs(kd, KERN_PROC_ALL, 0, pnr);
        break;
    }
    return(kip);
}

void store_uid (HV *h, const char *field, uid_t uid) {
    struct passwd *pw;
    size_t flen;
    size_t len;

    flen = strlen(field);
    if (!(pw = getpwuid(uid))) {
        /* shouldn't ever happen... */
        hv_store(h, field, flen, newSViv(uid), 0);
    }
    else {
        len = strlen(pw->pw_name);
        hv_store(h, field, flen, newSVpvn(pw->pw_name,len), 0);
    }
}

void store_gid (HV *h, const char *field, gid_t gid) {
    struct group *gr;
    size_t flen;
    size_t len;

    flen = strlen(field);
    if (!(gr = getgrgid(gid))) {
        /* shouldn't ever happen... */
        hv_store(h, field, flen, newSViv(gid), 0);
    }
    else {
        len = strlen(gr->gr_name);
        hv_store(h, field, flen, newSVpvn(gr->gr_name,len), 0);
    }
}


#if __FreeBSD_version < 500000
#define ACFLAG_FIELD  kp_proc.p_acflag
#define COMM_FIELD    kp_proc.p_comm
#define ESTCPU_FIELD  kp_proc.p_estcpu
#define FLAG_FIELD    kp_eproc.e_jobc
#define JOBC_FIELD    kp_eproc.e_flag
#define LASTCPU_FIELD kp_proc.p_lastcpu
#define LOCK_FIELD    kp_proc.p_lock
#define LOGIN_FIELD   kp_eproc.e_login
#define NICE_FIELD    kp_proc.p_nice
#define ONCPU_FIELD   kp_proc.p_oncpu
#define PCTCPU_FIELD  kp_proc.p_pctcpu
#define PGID_FIELD    kp_eproc.e_pgid
#define PID_FIELD     kp_proc.p_pid
#define PPID_FIELD    kp_eproc.e_ppid
#define RQINDEX_FIELD kp_proc.p_rqindex
#define RSSIZE_FIELD  kp_eproc.e_xrssize
#define RUNTIME_FIELD kp_proc.p_runtime
#define SLPTIME_FIELD kp_proc.p_slptime
#define SWRSS_FIELD   kp_eproc.e_xswrss
#define SWTIME_FIELD  kp_proc.p_swtime
#define TPGID_FIELD   kp_eproc.e_tpgid
#define TSIZE_FIELD   kp_eproc.e_xsize
#define WMESG_FIELD   kp_eproc.e_wmesg
#define XSTAT_FIELD   kp_proc.p_xstat
#else
#define ACFLAG_FIELD  ki_acflag
#define COMM_FIELD    ki_comm
#define ESTCPU_FIELD  ki_estcpu
#define FLAG_FIELD    ki_flag
#define JOBC_FIELD    ki_jobc
#define LASTCPU_FIELD ki_lastcpu
#define LOCK_FIELD    ki_lock
#define LOGIN_FIELD   ki_login



( run in 2.585 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )