Blame agent/mibgroup/host/hr_swrun.c

Packit fcad23
/* Portions of this file are subject to the following copyright(s).  See
Packit fcad23
 * the Net-SNMP's COPYING file for more details and other copyrights
Packit fcad23
 * that may apply:
Packit fcad23
 */
Packit fcad23
/*
Packit fcad23
 * Portions of this file are copyrighted by:
Packit fcad23
 * Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
Packit fcad23
 * Use is subject to license terms specified in the COPYING file
Packit fcad23
 * distributed with the Net-SNMP package.
Packit fcad23
 */
Packit fcad23
Packit fcad23
/*
Packit fcad23
 *  Host Resources MIB - Running Software group implementation - hr_swrun.c
Packit fcad23
 *      (also includes Running Software Performance group )
Packit fcad23
 *
Packit fcad23
 */
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
#if HAVE_STDLIB_H
Packit fcad23
#include <stdlib.h>
Packit fcad23
#endif
Packit fcad23
#include <fcntl.h>
Packit fcad23
#if HAVE_UNISTD_H
Packit fcad23
#include <unistd.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#include <sys/param.h>
Packit fcad23
#include <ctype.h>
Packit fcad23
#if HAVE_SYS_PSTAT_H
Packit fcad23
#include <sys/pstat.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_SYS_USER_H
Packit fcad23
#ifdef solaris2
Packit fcad23
#include <libgen.h>
Packit fcad23
#define _KMEMUSER
Packit fcad23
#endif
Packit fcad23
#include <sys/user.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_SYS_PROC_H
Packit fcad23
#include <sys/proc.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_KVM_H
Packit fcad23
#include <kvm.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_SYS_SYSCTL_H
Packit fcad23
#include <sys/sysctl.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_DIRENT_H && !defined(cygwin)
Packit fcad23
#include <dirent.h>
Packit fcad23
#else
Packit fcad23
# define dirent direct
Packit fcad23
# if HAVE_SYS_NDIR_H
Packit fcad23
#  include <sys/ndir.h>
Packit fcad23
# endif
Packit fcad23
# if HAVE_SYS_DIR_H
Packit fcad23
#  include <sys/dir.h>
Packit fcad23
# endif
Packit fcad23
# if HAVE_NDIR_H
Packit fcad23
#  include <ndir.h>
Packit fcad23
# endif
Packit fcad23
#endif
Packit fcad23
#ifdef cygwin
Packit fcad23
#include <windows.h>
Packit fcad23
#include <sys/cygwin.h>
Packit fcad23
#include <tlhelp32.h>
Packit fcad23
#include <psapi.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#if _SLASH_PROC_METHOD_
Packit fcad23
#include <procfs.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#if HAVE_STRING_H
Packit fcad23
#include <string.h>
Packit fcad23
#else
Packit fcad23
#include <strings.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#include <stdio.h>
Packit fcad23
Packit fcad23
#include <net-snmp/output_api.h>
Packit fcad23
#include "host_res.h"
Packit fcad23
#include "hr_swrun.h"
Packit fcad23
#include <net-snmp/agent/auto_nlist.h>
Packit fcad23
#include "kernel.h"
Packit fcad23
#ifdef solaris2
Packit fcad23
#if _SLASH_PROC_METHOD_ && defined _ILP32
Packit fcad23
#include <net-snmp/agent/cache_handler.h>
Packit fcad23
#include <net-snmp/agent/hardware/memory.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#include "kernel_sunos5.h"
Packit fcad23
#endif
Packit fcad23
#if defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
#include <procinfo.h>
Packit fcad23
#include <sys/types.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
        /*********************
Packit fcad23
	 *
Packit fcad23
	 *  Initialisation & common implementation functions
Packit fcad23
	 *
Packit fcad23
	 *********************/
Packit fcad23
void            Init_HR_SWRun(void);
Packit fcad23
int             Get_Next_HR_SWRun(void);
Packit fcad23
void            End_HR_SWRun(void);
Packit fcad23
int             header_hrswrun(struct variable *, oid *, size_t *, int,
Packit fcad23
                               size_t *, WriteMethod **);
Packit fcad23
int             header_hrswrunEntry(struct variable *, oid *, size_t *,
Packit fcad23
                                    int, size_t *, WriteMethod **);
Packit fcad23
Packit fcad23
#ifdef dynix
Packit fcad23
pid_t           nextproc;
Packit fcad23
static prpsinfo_t lowpsinfo, mypsinfo;
Packit fcad23
#endif
Packit fcad23
#ifdef cygwin
Packit fcad23
static struct external_pinfo *curproc;
Packit fcad23
static struct external_pinfo lowproc;
Packit fcad23
#elif !defined(linux)
Packit fcad23
static int      LowProcIndex;
Packit fcad23
#endif
Packit fcad23
#if defined(hpux10) || defined(hpux11)
Packit fcad23
struct pst_status *proc_table;
Packit fcad23
struct pst_dynamic pst_dyn;
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
struct kinfo_proc2 *proc_table;
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
struct kinfo_proc *proc_table;
Packit fcad23
#elif defined(solaris2)
Packit fcad23
int            *proc_table;
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
struct procsinfo *proc_table;
Packit fcad23
#else
Packit fcad23
struct proc    *proc_table;
Packit fcad23
#endif
Packit fcad23
#ifndef dynix
Packit fcad23
int             current_proc_entry;
Packit fcad23
#endif
Packit fcad23
Packit fcad23
Packit fcad23
#define	HRSWRUN_OSINDEX		1
Packit fcad23
Packit fcad23
#define	HRSWRUN_INDEX		2
Packit fcad23
#define	HRSWRUN_NAME		3
Packit fcad23
#define	HRSWRUN_ID		4
Packit fcad23
#define	HRSWRUN_PATH		5
Packit fcad23
#define	HRSWRUN_PARAMS		6
Packit fcad23
#define	HRSWRUN_TYPE		7
Packit fcad23
#define	HRSWRUN_STATUS		8
Packit fcad23
Packit fcad23
#define	HRSWRUNPERF_CPU		9
Packit fcad23
#define	HRSWRUNPERF_MEM		10
Packit fcad23
Packit fcad23
struct variable4 hrswrun_variables[] = {
Packit fcad23
    {HRSWRUN_OSINDEX, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 1, {1}},
Packit fcad23
    {HRSWRUN_INDEX, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {2, 1, 1}},
Packit fcad23
    {HRSWRUN_NAME, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {2, 1, 2}},
Packit fcad23
    {HRSWRUN_ID, ASN_OBJECT_ID, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {2, 1, 3}},
Packit fcad23
    {HRSWRUN_PATH, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {2, 1, 4}},
Packit fcad23
    {HRSWRUN_PARAMS, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {2, 1, 5}},
Packit fcad23
    {HRSWRUN_TYPE, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {2, 1, 6}},
Packit fcad23
    {HRSWRUN_STATUS, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {2, 1, 7}}
Packit fcad23
};
Packit fcad23
Packit fcad23
struct variable4 hrswrunperf_variables[] = {
Packit fcad23
    {HRSWRUNPERF_CPU, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {1, 1, 1}},
Packit fcad23
    {HRSWRUNPERF_MEM, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrswrun, 3, {1, 1, 2}}
Packit fcad23
};
Packit fcad23
Packit fcad23
oid             hrswrun_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 4 };
Packit fcad23
oid             hrswrunperf_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 5 };
Packit fcad23
Packit fcad23
#ifdef cygwin
Packit fcad23
Packit fcad23
/*
Packit fcad23
 * a lot of this is "stolen" from cygwin ps.cc
Packit fcad23
 */
Packit fcad23
Packit fcad23
typedef         BOOL(WINAPI * ENUMPROCESSMODULES) (HANDLE hProcess,
Packit fcad23
                                                   HMODULE * lphModule,
Packit fcad23
                                                   DWORD cb,
Packit fcad23
                                                   LPDWORD lpcbNeeded);
Packit fcad23
Packit fcad23
typedef         DWORD(WINAPI * GETMODULEFILENAME) (HANDLE hProcess,
Packit fcad23
                                                   HMODULE hModule,
Packit fcad23
                                                   LPTSTR lpstrFIleName,
Packit fcad23
                                                   DWORD nSize);
Packit fcad23
Packit fcad23
typedef         DWORD(WINAPI * GETPROCESSMEMORYINFO) (HANDLE hProcess,
Packit fcad23
                                                      PPROCESS_MEMORY_COUNTERS
Packit fcad23
                                                      pmc, DWORD nSize);
Packit fcad23
Packit fcad23
typedef         HANDLE(WINAPI * CREATESNAPSHOT) (DWORD dwFlags,
Packit fcad23
                                                 DWORD th32ProcessID);
Packit fcad23
Packit fcad23
typedef         BOOL(WINAPI * PROCESSWALK) (HANDLE hSnapshot,
Packit fcad23
                                            LPPROCESSENTRY32 lppe);
Packit fcad23
Packit fcad23
ENUMPROCESSMODULES myEnumProcessModules;
Packit fcad23
GETMODULEFILENAME myGetModuleFileNameEx;
Packit fcad23
CREATESNAPSHOT  myCreateToolhelp32Snapshot;
Packit fcad23
PROCESSWALK     myProcess32First;
Packit fcad23
PROCESSWALK     myProcess32Next;
Packit fcad23
GETPROCESSMEMORYINFO myGetProcessMemoryInfo = NULL;
Packit fcad23
cygwin_getinfo_types query = CW_GETPINFO;
Packit fcad23
Packit fcad23
static BOOL WINAPI
Packit fcad23
dummyprocessmodules(HANDLE hProcess,
Packit fcad23
                    HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded)
Packit fcad23
{
Packit fcad23
    lphModule[0] = (HMODULE) * lpcbNeeded;
Packit fcad23
    *lpcbNeeded = 1;
Packit fcad23
    return 1;
Packit fcad23
}
Packit fcad23
Packit fcad23
static DWORD WINAPI
Packit fcad23
GetModuleFileNameEx95(HANDLE hProcess,
Packit fcad23
                      HMODULE hModule, LPTSTR lpstrFileName, DWORD n)
Packit fcad23
{
Packit fcad23
    HANDLE          h;
Packit fcad23
    DWORD           pid = (DWORD) hModule;
Packit fcad23
    PROCESSENTRY32  proc;
Packit fcad23
Packit fcad23
    h = myCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Packit fcad23
    if (!h)
Packit fcad23
        return 0;
Packit fcad23
    proc.dwSize = sizeof(proc);
Packit fcad23
    if (myProcess32First(h, &proc))
Packit fcad23
        do
Packit fcad23
            if (proc.th32ProcessID == pid) {
Packit fcad23
                CloseHandle(h);
Packit fcad23
                strcpy(lpstrFileName, proc.szExeFile);
Packit fcad23
                return 1;
Packit fcad23
            }
Packit fcad23
        while (myProcess32Next(h, &proc));
Packit fcad23
    CloseHandle(h);
Packit fcad23
    return 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
#define FACTOR (0x19db1ded53ea710LL)
Packit fcad23
#define NSPERSEC 10000000LL
Packit fcad23
#define NSPERMSEC 10000LL
Packit fcad23
Packit fcad23
static time_t   __stdcall
Packit fcad23
to_time_t(PFILETIME ptr)
Packit fcad23
{
Packit fcad23
    long            rem;
Packit fcad23
    long long       x =
Packit fcad23
        ((long long) ptr->dwHighDateTime << 32) +
Packit fcad23
        ((unsigned) ptr->dwLowDateTime);
Packit fcad23
    x -= FACTOR;
Packit fcad23
    rem = x % NSPERSEC;
Packit fcad23
    rem += NSPERSEC / 2;
Packit fcad23
    x /= NSPERSEC;
Packit fcad23
    x += rem / NSPERSEC;
Packit fcad23
    return x;
Packit fcad23
}
Packit fcad23
Packit fcad23
static long
Packit fcad23
to_msec(PFILETIME ptr)
Packit fcad23
{
Packit fcad23
    long long       x =
Packit fcad23
        ((long long) ptr->dwHighDateTime << 32) +
Packit fcad23
        (unsigned) ptr->dwLowDateTime;
Packit fcad23
    x /= NSPERMSEC;
Packit fcad23
    return x;
Packit fcad23
}
Packit fcad23
Packit fcad23
#endif                          /* cygwin */
Packit fcad23
Packit fcad23
Packit fcad23
void
Packit fcad23
init_hr_swrun(void)
Packit fcad23
{
Packit fcad23
#ifdef cygwin
Packit fcad23
    HMODULE         h;
Packit fcad23
Packit fcad23
    if ((h = LoadLibrary("psapi.dll")) != NULL) {
Packit fcad23
        myEnumProcessModules =
Packit fcad23
            (ENUMPROCESSMODULES) GetProcAddress(h,
Packit fcad23
                                                "EnumProcessModules");
Packit fcad23
        myGetModuleFileNameEx =
Packit fcad23
            (GETMODULEFILENAME) GetProcAddress(h,
Packit fcad23
                                               "GetModuleFileNameExA");
Packit fcad23
        myGetProcessMemoryInfo =
Packit fcad23
            (GETPROCESSMEMORYINFO) GetProcAddress(h,
Packit fcad23
                                                  "GetProcessMemoryInfo");
Packit fcad23
        if (myEnumProcessModules && myGetModuleFileNameEx)
Packit fcad23
            query = CW_GETPINFO_FULL;
Packit fcad23
        else
Packit fcad23
            snmp_log(LOG_ERR, "hr_swrun failed NT init\n");
Packit fcad23
    } elif ((h = GetModuleHandle("KERNEL32.DLL")) != NULL) {
Packit fcad23
        myCreateToolhelp32Snapshot =
Packit fcad23
            (CREATESNAPSHOT) GetProcAddress(h, "CreateToolhelp32Snapshot");
Packit fcad23
        myProcess32First =
Packit fcad23
            (PROCESSWALK) GetProcAddress(h, "Process32First");
Packit fcad23
        myProcess32Next = (PROCESSWALK) GetProcAddress(h, "Process32Next");
Packit fcad23
        myEnumProcessModules = dummyprocessmodules;
Packit fcad23
        myGetModuleFileNameEx = GetModuleFileNameEx95;
Packit fcad23
        if (myCreateToolhelp32Snapshot && myProcess32First
Packit fcad23
            && myProcess32Next)
Packit fcad23
#if 0
Packit fcad23
            /*
Packit fcad23
             * This doesn't work at all on Win98 SE
Packit fcad23
             */
Packit fcad23
            query = CW_GETPINFO_FULL;
Packit fcad23
#else
Packit fcad23
            query = CW_GETPINFO;
Packit fcad23
#endif
Packit fcad23
        else
Packit fcad23
            snmp_log(LOG_ERR, "hr_swrun failed non-NT init\n");
Packit fcad23
    }
Packit fcad23
#endif                          /* cygwin */
Packit fcad23
#ifdef PROC_SYMBOL
Packit fcad23
    auto_nlist(PROC_SYMBOL, 0, 0);
Packit fcad23
#endif
Packit fcad23
#ifdef NPROC_SYMBOL
Packit fcad23
    auto_nlist(NPROC_SYMBOL, 0, 0);
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    proc_table = NULL;
Packit fcad23
Packit fcad23
    REGISTER_MIB("host/hr_swrun", hrswrun_variables, variable4,
Packit fcad23
                 hrswrun_variables_oid);
Packit fcad23
    REGISTER_MIB("host/hr_swrun", hrswrunperf_variables, variable4,
Packit fcad23
                 hrswrunperf_variables_oid);
Packit fcad23
}
Packit fcad23
Packit fcad23
/*
Packit fcad23
 * header_hrswrun(...
Packit fcad23
 * Arguments:
Packit fcad23
 * vp     IN      - pointer to variable entry that points here
Packit fcad23
 * name    IN/OUT  - IN/name requested, OUT/name found
Packit fcad23
 * length  IN/OUT  - length of IN/OUT oid's 
Packit fcad23
 * exact   IN      - TRUE if an exact match was requested
Packit fcad23
 * var_len OUT     - length of variable or 0 if function returned
Packit fcad23
 * write_method
Packit fcad23
 * 
Packit fcad23
 */
Packit fcad23
Packit fcad23
int
Packit fcad23
header_hrswrun(struct variable *vp,
Packit fcad23
               oid * name,
Packit fcad23
               size_t * length,
Packit fcad23
               int exact, size_t * var_len, WriteMethod ** write_method)
Packit fcad23
{
Packit fcad23
#define HRSWRUN_NAME_LENGTH	9
Packit fcad23
    oid             newname[MAX_OID_LEN];
Packit fcad23
    int             result;
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("host/hr_swrun", "var_hrswrun: "));
Packit fcad23
    DEBUGMSGOID(("host/hr_swrun", name, *length));
Packit fcad23
    DEBUGMSG(("host/hr_swrun", " %d\n", exact));
Packit fcad23
Packit fcad23
    memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
Packit fcad23
    newname[HRSWRUN_NAME_LENGTH] = 0;
Packit fcad23
    result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
Packit fcad23
    if ((exact && (result != 0)) || (!exact && (result >= 0)))
Packit fcad23
        return (MATCH_FAILED);
Packit fcad23
    memcpy((char *) name, (char *) newname,
Packit fcad23
           (vp->namelen + 1) * sizeof(oid));
Packit fcad23
    *length = vp->namelen + 1;
Packit fcad23
Packit fcad23
    *write_method = (WriteMethod*)0;
Packit fcad23
    *var_len = sizeof(long);    /* default to 'long' results */
Packit fcad23
    return (MATCH_SUCCEEDED);
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
header_hrswrunEntry(struct variable *vp,
Packit fcad23
                    oid * name,
Packit fcad23
                    size_t * length,
Packit fcad23
                    int exact,
Packit fcad23
                    size_t * var_len, WriteMethod ** write_method)
Packit fcad23
{
Packit fcad23
#define HRSWRUN_ENTRY_NAME_LENGTH	11
Packit fcad23
    oid             newname[MAX_OID_LEN];
Packit fcad23
    int             pid, LowPid = -1;
Packit fcad23
    int             result;
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("host/hr_swrun", "var_hrswrunEntry: "));
Packit fcad23
    DEBUGMSGOID(("host/hr_swrun", name, *length));
Packit fcad23
    DEBUGMSG(("host/hr_swrun", " %d\n", exact));
Packit fcad23
Packit fcad23
    memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     *  Find the "next" running process
Packit fcad23
     */
Packit fcad23
    Init_HR_SWRun();
Packit fcad23
    for (;;) {
Packit fcad23
        pid = Get_Next_HR_SWRun();
Packit fcad23
#ifndef linux
Packit fcad23
#ifndef dynix
Packit fcad23
        DEBUGMSG(("host/hr_swrun",
Packit fcad23
                  "(index %d (entry #%d) ....", pid, current_proc_entry));
Packit fcad23
#else
Packit fcad23
        DEBUGMSG(("host/hr_swrun", "pid %d; nextproc %d ....", pid,
Packit fcad23
                  nextproc));
Packit fcad23
#endif
Packit fcad23
#endif
Packit fcad23
        if (pid == -1)
Packit fcad23
            break;
Packit fcad23
        newname[HRSWRUN_ENTRY_NAME_LENGTH] = pid;
Packit fcad23
        DEBUGMSGOID(("host/hr_swrun", newname, *length));
Packit fcad23
        DEBUGMSG(("host/hr_swrun", "\n"));
Packit fcad23
        result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
Packit fcad23
        if (exact && (result == 0)) {
Packit fcad23
            LowPid = pid;
Packit fcad23
#ifdef cygwin
Packit fcad23
            lowproc = *curproc;
Packit fcad23
#elif  dynix
Packit fcad23
            memcpy(&lowpsinfo, &mypsinfo, sizeof(prpsinfo_t));
Packit fcad23
#elif !defined(linux)
Packit fcad23
            LowProcIndex = current_proc_entry - 1;
Packit fcad23
#endif
Packit fcad23
            DEBUGMSGTL(("host/hr_swrun", " saved\n"));
Packit fcad23
            /*
Packit fcad23
             * Save process status information 
Packit fcad23
             */
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
        if ((!exact && (result < 0)) && (LowPid == -1 || pid < LowPid)) {
Packit fcad23
            LowPid = pid;
Packit fcad23
#ifdef cygwin
Packit fcad23
            lowproc = *curproc;
Packit fcad23
#elif !defined(linux)
Packit fcad23
            LowProcIndex = current_proc_entry - 1;
Packit fcad23
#endif
Packit fcad23
            /*
Packit fcad23
             * Save process status information 
Packit fcad23
             */
Packit fcad23
            DEBUGMSG(("host/hr_swrun", " saved"));
Packit fcad23
        }
Packit fcad23
        DEBUGMSG(("host/hr_swrun", "\n"));
Packit fcad23
    }
Packit fcad23
    End_HR_SWRun();
Packit fcad23
Packit fcad23
    if (LowPid == -1) {
Packit fcad23
        DEBUGMSGTL(("host/hr_swrun", "... index out of range\n"));
Packit fcad23
        return (MATCH_FAILED);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    newname[HRSWRUN_ENTRY_NAME_LENGTH] = LowPid;
Packit fcad23
    memcpy((char *) name, (char *) newname,
Packit fcad23
           (vp->namelen + 1) * sizeof(oid));
Packit fcad23
    *length = vp->namelen + 1;
Packit fcad23
    *write_method = (WriteMethod*)0;
Packit fcad23
    *var_len = sizeof(long);    /* default to 'long' results */
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("host/hr_swrun", "... get process stats "));
Packit fcad23
    DEBUGMSGOID(("host/hr_swrun", name, *length));
Packit fcad23
    DEBUGMSG(("host/hr_swrun", "\n"));
Packit fcad23
    return LowPid;
Packit fcad23
}
Packit fcad23
Packit fcad23
        /*********************
Packit fcad23
	 *
Packit fcad23
	 *  System specific implementation functions
Packit fcad23
	 *
Packit fcad23
	 *********************/
Packit fcad23
Packit fcad23
#if defined(linux)
Packit fcad23
static char     *
Packit fcad23
skip_to_next_field(char *cp)
Packit fcad23
{
Packit fcad23
    while (*cp && ! isspace(*cp)) /* skip past non-space */
Packit fcad23
	++cp;
Packit fcad23
    while (*cp && isspace(*cp)) /* skip past space */
Packit fcad23
	++cp;
Packit fcad23
    return cp;
Packit fcad23
Packit fcad23
}
Packit fcad23
Packit fcad23
static char     *
Packit fcad23
get_proc_file_line(char *fmt,
Packit fcad23
		    int pid,
Packit fcad23
		    char *buf,
Packit fcad23
		    int buflen )
Packit fcad23
{
Packit fcad23
    static char     string[1024];
Packit fcad23
    FILE *fp;
Packit fcad23
    *buf = '\0';
Packit fcad23
    sprintf(string,fmt,pid);
Packit fcad23
    if (   ((fp = fopen(string, "r")) == NULL)
Packit fcad23
	|| (fgets(buf, buflen, fp) == NULL) ) {
Packit fcad23
	if (fp)
Packit fcad23
	    fclose(fp);
Packit fcad23
	return NULL;
Packit fcad23
    }
Packit fcad23
    fclose(fp);
Packit fcad23
    return buf;
Packit fcad23
}
Packit fcad23
Packit fcad23
static char     *
Packit fcad23
get_proc_stat_field(int pid,
Packit fcad23
		    char *buf,
Packit fcad23
		    int buflen,
Packit fcad23
		    int skip )
Packit fcad23
{
Packit fcad23
    int i;
Packit fcad23
    char *cp;
Packit fcad23
Packit fcad23
    if ((cp = get_proc_file_line("/proc/%d/stat", pid, buf, buflen)) == NULL )
Packit fcad23
	return NULL;
Packit fcad23
    for (i = 0; *cp && i < skip; ++i) {
Packit fcad23
        /*
Packit fcad23
         * The second field is 'comm' and can contain spaces. Hence skip to
Packit fcad23
         * the closing parenthesis.
Packit fcad23
         */
Packit fcad23
        if (i == 1 && *cp == '(')
Packit fcad23
            cp = strrchr(cp, ')');
Packit fcad23
	cp = skip_to_next_field(cp);
Packit fcad23
    }
Packit fcad23
    return cp;
Packit fcad23
}
Packit fcad23
Packit fcad23
static char *
Packit fcad23
get_proc_name_from_cmdline(int pid,
Packit fcad23
			    char *buf,
Packit fcad23
			    int buflen )
Packit fcad23
{
Packit fcad23
    return get_proc_file_line("/proc/%d/cmdline", pid, buf, buflen);
Packit fcad23
}
Packit fcad23
Packit fcad23
static char *
Packit fcad23
get_proc_name_from_status(int pid,
Packit fcad23
	    char *buf,
Packit fcad23
	    int buflen )
Packit fcad23
{
Packit fcad23
    char *cp,*cp2;
Packit fcad23
    if ((cp = get_proc_file_line("/proc/%d/status", pid, buf, buflen)) == NULL )
Packit fcad23
	return NULL;
Packit fcad23
    cp = strchr(cp, ':');
Packit fcad23
    if ( cp == NULL ) {
Packit fcad23
	return NULL;    /* the process file is malformed */
Packit fcad23
    }
Packit fcad23
    cp = skip_to_next_field(cp);
Packit fcad23
    cp2 = strchr(cp, '\n');
Packit fcad23
    if (cp2)
Packit fcad23
	*cp2 = 0;
Packit fcad23
    return cp;
Packit fcad23
}
Packit fcad23
#endif
Packit fcad23
Packit fcad23
u_char         *
Packit fcad23
var_hrswrun(struct variable * vp,
Packit fcad23
            oid * name,
Packit fcad23
            size_t * length,
Packit fcad23
            int exact, size_t * var_len, WriteMethod ** write_method)
Packit fcad23
{
Packit fcad23
    int             pid = 0;
Packit fcad23
    static char     string[1024];
Packit fcad23
#ifdef HAVE_SYS_PSTAT_H
Packit fcad23
    struct pst_status proc_buf;
Packit fcad23
#elif defined(solaris2)
Packit fcad23
#if _SLASH_PROC_METHOD_
Packit fcad23
    static psinfo_t psinfo;
Packit fcad23
    static psinfo_t *proc_buf;
Packit fcad23
    int             procfd;
Packit fcad23
    int             ret;
Packit fcad23
    char            procfn[sizeof "/proc/00000/psinfo"];
Packit fcad23
#else
Packit fcad23
    static struct proc *proc_buf;
Packit fcad23
    char           *cp1;
Packit fcad23
#endif                          /* _SLASH_PROC_METHOD_ */
Packit fcad23
    static time_t   when = 0;
Packit fcad23
    time_t          now;
Packit fcad23
    static int      oldpid = -1;
Packit fcad23
#endif
Packit fcad23
#if (defined(HAVE_KVM_GETPROCS) || defined(HAVE_KVM_GETPROC2))
Packit fcad23
    char          **argv;
Packit fcad23
#endif
Packit fcad23
#ifdef linux
Packit fcad23
    FILE           *fp;
Packit fcad23
    char            buf[1024];
Packit fcad23
    int             i;
Packit fcad23
#endif
Packit fcad23
    char           *cp;
Packit fcad23
Packit fcad23
    if (vp->magic == HRSWRUN_OSINDEX) {
Packit fcad23
        if (header_hrswrun(vp, name, length, exact, var_len, write_method)
Packit fcad23
            == MATCH_FAILED)
Packit fcad23
            return NULL;
Packit fcad23
    } else {
Packit fcad23
Packit fcad23
        pid =
Packit fcad23
            header_hrswrunEntry(vp, name, length, exact, var_len,
Packit fcad23
                                write_method);
Packit fcad23
        if (pid == MATCH_FAILED)
Packit fcad23
            return NULL;
Packit fcad23
    }
Packit fcad23
Packit fcad23
#ifdef HAVE_SYS_PSTAT_H
Packit fcad23
    if (pstat_getproc(&proc_buf, sizeof(struct pst_status), 0, pid) == -1)
Packit fcad23
        return NULL;
Packit fcad23
#elif defined(solaris2)
Packit fcad23
    time(&now;;
Packit fcad23
    if (pid == oldpid) {
Packit fcad23
        if (now != when)
Packit fcad23
            oldpid = -1;
Packit fcad23
    }
Packit fcad23
    if (oldpid != pid || proc_buf == NULL) {
Packit fcad23
#if _SLASH_PROC_METHOD_
Packit fcad23
        proc_buf = &psinfo;
Packit fcad23
        sprintf(procfn, "/proc/%.5d/psinfo", pid);
Packit fcad23
        if ((procfd = open(procfn, O_RDONLY)) != -1) {
Packit fcad23
            ret =  read(procfd, proc_buf, sizeof(*proc_buf));
Packit fcad23
            close(procfd);
Packit fcad23
            if (ret != sizeof(*proc_buf))
Packit fcad23
                proc_buf = NULL;
Packit fcad23
        } else
Packit fcad23
            proc_buf =  NULL;
Packit fcad23
#else
Packit fcad23
        if (kd == NULL)
Packit fcad23
            return NULL;
Packit fcad23
        if ((proc_buf = kvm_getproc(kd, pid)) == NULL)
Packit fcad23
            return NULL;
Packit fcad23
#endif
Packit fcad23
        oldpid = pid;
Packit fcad23
        when = now;
Packit fcad23
    }
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    switch (vp->magic) {
Packit fcad23
    case HRSWRUN_OSINDEX:
Packit fcad23
#if NETSNMP_NO_DUMMY_VALUES
Packit fcad23
        return NULL;
Packit fcad23
#else
Packit fcad23
        /* 
Packit fcad23
         * per dts, on coders:
Packit fcad23
         * cos (in general) we won't know which process should
Packit fcad23
         * be regarded as "the primary O/S process".
Packit fcad23
         * The most obvious candidate on a Unix box is probably 'init'
Packit fcad23
         * which is typically (always?) process #1.
Packit fcad23
         */
Packit fcad23
        long_return = 1;        /* Probably! */
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    case HRSWRUN_INDEX:
Packit fcad23
        long_return = pid;
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    case HRSWRUN_NAME:
Packit fcad23
#ifdef HAVE_SYS_PSTAT_H
Packit fcad23
        strlcpy(string, proc_buf.pst_cmd, sizeof(string));
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp != NULL)
Packit fcad23
            *cp = '\0';
Packit fcad23
#elif defined(dynix)
Packit fcad23
        strlcpy(string, lowpsinfo.pr_fname, sizeof(string));
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp != NULL)
Packit fcad23
            *cp = '\0';
Packit fcad23
#elif defined(solaris2)
Packit fcad23
#if _SLASH_PROC_METHOD_
Packit fcad23
        if (proc_buf) { 
Packit fcad23
            char *pos=strchr(proc_buf->pr_psargs,' ');
Packit fcad23
            if (pos != NULL) *pos = '\0';
Packit fcad23
            strlcpy(string, basename(proc_buf->pr_psargs), sizeof(string));
Packit fcad23
            if (pos != NULL) *pos=' ';
Packit fcad23
        } else {
Packit fcad23
            strlcpy(string, "<exited>", sizeof(string));
Packit fcad23
        }
Packit fcad23
#else
Packit fcad23
        strlcpy(string, proc_buf->p_user.u_comm, sizeof(string));
Packit fcad23
#endif
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp != NULL)
Packit fcad23
            *cp = '\0';
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].p_comm, sizeof(string));
Packit fcad23
        /* process name: truncate the string at the first space */
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp != NULL)
Packit fcad23
            *cp = '\0';
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
    #if defined(freebsd5) && __FreeBSD_version >= 500014
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].ki_comm, sizeof(string));
Packit fcad23
    #elif defined(dragonfly) && __DragonFly_version >= 190000
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].kp_comm, sizeof(string));
Packit fcad23
    #elif defined(openbsd5)
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].p_comm, sizeof(string));
Packit fcad23
    #else
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].kp_proc.p_comm, sizeof(string));
Packit fcad23
    #endif
Packit fcad23
#elif defined(linux)
Packit fcad23
	if( (cp=get_proc_name_from_status(pid,buf,sizeof(buf))) == NULL ) {
Packit fcad23
            strcpy(string, "<exited>");
Packit fcad23
            *var_len = strlen(string);
Packit fcad23
            return (u_char *) string;
Packit fcad23
        }
Packit fcad23
        strlcpy(string, cp, sizeof(string));
Packit fcad23
#elif defined(cygwin)
Packit fcad23
        /* if (lowproc.process_state & (PID_ZOMBIE | PID_EXITED)) */
Packit fcad23
        if (lowproc.process_state & PID_EXITED || (lowproc.exitcode & ~0xffff))
Packit fcad23
            strcpy(string, "<defunct>");
Packit fcad23
        else if (lowproc.ppid) {
Packit fcad23
            cygwin_conv_to_posix_path(lowproc.progname, string);
Packit fcad23
            cp = strrchr(string, '/');
Packit fcad23
            if (cp)
Packit fcad23
                strlcpy(string, cp + 1, sizeof(string));
Packit fcad23
        } else if (query == CW_GETPINFO_FULL) {
Packit fcad23
            DWORD           n = lowproc.dwProcessId & 0xffff;
Packit fcad23
            HANDLE          h =
Packit fcad23
                OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
Packit fcad23
                            FALSE, n);
Packit fcad23
Packit fcad23
            if (h) {
Packit fcad23
                HMODULE         hm[1000];
Packit fcad23
                if (!myEnumProcessModules(h, hm, sizeof hm, &n)) {
Packit fcad23
                    snmp_log(LOG_DEBUG, "no module handle for %lu\n", n);
Packit fcad23
                    n = 0;
Packit fcad23
                }
Packit fcad23
                if (n
Packit fcad23
                    && myGetModuleFileNameEx(h, hm[0], string,
Packit fcad23
                                             sizeof string)) {
Packit fcad23
                    cp = strrchr(string, '\\');
Packit fcad23
                    if (cp)
Packit fcad23
                        strlcpy(string, cp + 1, sizeof(string));
Packit fcad23
                } else
Packit fcad23
                    strcpy(string, "*** unknown");
Packit fcad23
                CloseHandle(h);
Packit fcad23
            } else {
Packit fcad23
                snmp_log(LOG_INFO, "no process handle for %lu\n", n);
Packit fcad23
                strcpy(string, "** unknown");
Packit fcad23
            }
Packit fcad23
        } else
Packit fcad23
            strcpy(string, "* unknown");
Packit fcad23
        cp = strchr(string, '\0') - 4;
Packit fcad23
        if (cp > string && strcasecmp(cp, ".exe") == 0)
Packit fcad23
            *cp = '\0';
Packit fcad23
#else
Packit fcad23
#if NETSNMP_NO_DUMMY_VALUES
Packit fcad23
        return NULL;
Packit fcad23
#endif
Packit fcad23
        sprintf(string, "process name");
Packit fcad23
#endif
Packit fcad23
        *var_len = strlen(string);
Packit fcad23
        /*
Packit fcad23
         * remove trailing newline 
Packit fcad23
         */
Packit fcad23
        if (*var_len) {
Packit fcad23
            cp = string + *var_len - 1;
Packit fcad23
            if (*cp == '\n')
Packit fcad23
                --(*var_len);
Packit fcad23
        }
Packit fcad23
        if (*var_len > 64) { /* MIB limit */
Packit fcad23
            *var_len = 64;
Packit fcad23
            string[64] = '\0';
Packit fcad23
        }
Packit fcad23
        return (u_char *) string;
Packit fcad23
    case HRSWRUN_ID:
Packit fcad23
        *var_len = nullOidLen;
Packit fcad23
        return (u_char *) nullOid;
Packit fcad23
    case HRSWRUN_PATH:
Packit fcad23
#ifdef HAVE_SYS_PSTAT_H
Packit fcad23
        /*
Packit fcad23
         * Path not available - use argv[0] 
Packit fcad23
         */
Packit fcad23
        sprintf(string, "%s", proc_buf.pst_cmd);
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp != NULL)
Packit fcad23
            *cp = '\0';
Packit fcad23
#elif defined(dynix)
Packit fcad23
        /*
Packit fcad23
         * Path not available - use argv[0] 
Packit fcad23
         */
Packit fcad23
        sprintf(string, "%s", lowpsinfo.pr_psargs);
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp != NULL)
Packit fcad23
            *cp = '\0';
Packit fcad23
#elif defined(solaris2)
Packit fcad23
#ifdef _SLASH_PROC_METHOD_
Packit fcad23
        if (proc_buf)
Packit fcad23
            strlcpy(string, proc_buf->pr_psargs, sizeof(string));
Packit fcad23
        else
Packit fcad23
            sprintf(string, "<exited>");
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp)
Packit fcad23
            *cp = 0;
Packit fcad23
#else
Packit fcad23
        cp = proc_buf->p_user.u_psargs;
Packit fcad23
        cp1 = string;
Packit fcad23
        while (*cp && *cp != ' ')
Packit fcad23
            *cp1++ = *cp++;
Packit fcad23
        *cp1 = 0;
Packit fcad23
#endif
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp != NULL)
Packit fcad23
            *cp = '\0';
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
        /* Should be path, but this is not available, just use argv[0] again */
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].p_comm, sizeof(string));
Packit fcad23
        cp = strchr(string, ' ');
Packit fcad23
        if (cp != NULL)
Packit fcad23
            *cp = '\0';
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
    #if defined(freebsd5) && __FreeBSD_version >= 500014
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].ki_comm, sizeof(string));
Packit fcad23
    #elif defined(dragonfly) && __DragonFly_version >= 190000
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].kp_comm, sizeof(string));
Packit fcad23
    #elif defined(openbsd5)
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].p_comm, sizeof(string));
Packit fcad23
    #else
Packit fcad23
        strlcpy(string, proc_table[LowProcIndex].kp_proc.p_comm, sizeof(string));
Packit fcad23
    #endif
Packit fcad23
#elif defined(linux)
Packit fcad23
        cp = get_proc_name_from_cmdline(pid,buf,sizeof(buf)-1);
Packit fcad23
        if (cp != NULL && *cp)    /* argv[0] '\0' argv[1] '\0' .... */
Packit fcad23
            strlcpy(string, cp, sizeof(string));
Packit fcad23
        else {
Packit fcad23
            /*
Packit fcad23
             * swapped out - no cmdline 
Packit fcad23
             */
Packit fcad23
	    if( (cp=get_proc_name_from_status(pid,buf,sizeof(buf)-1)) == NULL ) {
Packit fcad23
		strcpy(string, "<exited>");
Packit fcad23
		*var_len = strlen(string);
Packit fcad23
		return (u_char *) string;
Packit fcad23
	    }
Packit fcad23
            strlcpy(string, cp, sizeof(string));
Packit fcad23
        }
Packit fcad23
#elif defined(cygwin)
Packit fcad23
        /* if (lowproc.process_state & (PID_ZOMBIE | PID_EXITED)) */
Packit fcad23
        if (lowproc.process_state & PID_EXITED || (lowproc.exitcode & ~0xffff))
Packit fcad23
            strcpy(string, "<defunct>");
Packit fcad23
        else if (lowproc.ppid)
Packit fcad23
            cygwin_conv_to_posix_path(lowproc.progname, string);
Packit fcad23
        else if (query == CW_GETPINFO_FULL) {
Packit fcad23
            DWORD           n = lowproc.dwProcessId & 0xFFFF;
Packit fcad23
            HANDLE          h =
Packit fcad23
                OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
Packit fcad23
                            FALSE, n);
Packit fcad23
            if (h) {
Packit fcad23
                HMODULE         hm[1000];
Packit fcad23
                if (!myEnumProcessModules(h, hm, sizeof hm, &n))
Packit fcad23
                    n = 0;
Packit fcad23
                if (!n
Packit fcad23
                    || !myGetModuleFileNameEx(h, hm[0], string,
Packit fcad23
                                              sizeof string))
Packit fcad23
                    strcpy(string, "*** unknown");
Packit fcad23
                CloseHandle(h);
Packit fcad23
            } else
Packit fcad23
                strcpy(string, "** unknown");
Packit fcad23
        } else
Packit fcad23
            strcpy(string, "* unknown");
Packit fcad23
#else
Packit fcad23
#if NETSNMP_NO_DUMMY_VALUES
Packit fcad23
        return NULL;
Packit fcad23
#endif
Packit fcad23
        sprintf(string, "/bin/wombat");
Packit fcad23
#endif
Packit fcad23
        *var_len = strlen(string);
Packit fcad23
        if (*var_len > 128) { /* MIB limit */
Packit fcad23
            *var_len = 128;
Packit fcad23
            string[128] = '\0';
Packit fcad23
        }
Packit fcad23
        return (u_char *) string;
Packit fcad23
    case HRSWRUN_PARAMS:
Packit fcad23
#ifdef HAVE_SYS_PSTAT_H
Packit fcad23
        cp = strchr(proc_buf.pst_cmd, ' ');
Packit fcad23
        if (cp != NULL) {
Packit fcad23
            cp++;
Packit fcad23
            sprintf(string, "%s", cp);
Packit fcad23
        } else
Packit fcad23
            string[0] = '\0';
Packit fcad23
#elif defined(dynix)
Packit fcad23
        cp = strchr(lowpsinfo.pr_psargs, ' ');
Packit fcad23
        if (cp != NULL) {
Packit fcad23
            cp++;
Packit fcad23
            sprintf(string, "%s", cp);
Packit fcad23
        } else
Packit fcad23
            string[0] = '\0';
Packit fcad23
#elif defined(solaris2)
Packit fcad23
#ifdef _SLASH_PROC_METHOD_
Packit fcad23
        if (proc_buf) {
Packit fcad23
            cp = strchr(proc_buf->pr_psargs, ' ');
Packit fcad23
            if (cp)
Packit fcad23
                strlcpy(string, cp + 1, sizeof(string));
Packit fcad23
            else
Packit fcad23
                string[0] = 0;
Packit fcad23
        } else
Packit fcad23
            string[0] = 0;
Packit fcad23
#else
Packit fcad23
        cp = proc_buf->p_user.u_psargs;
Packit fcad23
        while (*cp && *cp != ' ')
Packit fcad23
            cp++;
Packit fcad23
        if (*cp == ' ')
Packit fcad23
            cp++;
Packit fcad23
        strlcpy(string, cp, sizeof(string));
Packit fcad23
#endif
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
        cp = strchr(proc_table[LowProcIndex].pi_comm, ' ');
Packit fcad23
        if (cp != NULL) {
Packit fcad23
            cp++;
Packit fcad23
            sprintf(string, "%s", cp);
Packit fcad23
        } else
Packit fcad23
            string[0] = '\0';
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
        string[0] = 0;
Packit fcad23
        argv = kvm_getargv2(kd, proc_table + LowProcIndex, sizeof(string));
Packit fcad23
        if (argv)
Packit fcad23
            argv++;
Packit fcad23
        while (argv && *argv) {
Packit fcad23
            if (string[0] != 0)
Packit fcad23
                strcat(string, " ");
Packit fcad23
            strcat(string, *argv);
Packit fcad23
            argv++;
Packit fcad23
        }
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
        string[0] = 0;
Packit fcad23
        argv = kvm_getargv(kd, proc_table + LowProcIndex, sizeof(string));
Packit fcad23
        if (argv)
Packit fcad23
            argv++;
Packit fcad23
        while (argv && *argv) {
Packit fcad23
            if (string[0] != 0)
Packit fcad23
                strcat(string, " ");
Packit fcad23
            strcat(string, *argv);
Packit fcad23
            argv++;
Packit fcad23
        }
Packit fcad23
#elif defined(linux)
Packit fcad23
        memset(buf, 0, sizeof(buf));
Packit fcad23
	if( (cp=get_proc_name_from_cmdline(pid,buf,sizeof(buf)-2)) == NULL ) {
Packit fcad23
            strcpy(string, "");
Packit fcad23
            *var_len = 0;
Packit fcad23
            return (u_char *) string;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        /*
Packit fcad23
         * Skip over argv[0] 
Packit fcad23
         */
Packit fcad23
        cp = buf;
Packit fcad23
        while (*cp)
Packit fcad23
            ++cp;
Packit fcad23
        ++cp;
Packit fcad23
        /*
Packit fcad23
         * Now join together separate arguments. 
Packit fcad23
         */
Packit fcad23
        while (1) {
Packit fcad23
            while (*cp)
Packit fcad23
                ++cp;
Packit fcad23
            if (*(cp + 1) == '\0')
Packit fcad23
                break;          /* '\0''\0' => End of command line */
Packit fcad23
            *cp = ' ';
Packit fcad23
        }
Packit fcad23
Packit fcad23
        cp = buf;
Packit fcad23
        while (*cp)
Packit fcad23
            ++cp;
Packit fcad23
        ++cp;
Packit fcad23
        strlcpy(string, cp, sizeof(string));
Packit fcad23
#elif defined(cygwin)
Packit fcad23
        string[0] = 0;
Packit fcad23
#else
Packit fcad23
#if NETSNMP_NO_DUMMY_VALUES
Packit fcad23
        return NULL;
Packit fcad23
#endif
Packit fcad23
        sprintf(string, "-h -q -v");
Packit fcad23
#endif
Packit fcad23
        *var_len = strlen(string);
Packit fcad23
        if (*var_len > 128) { /* MIB limit */
Packit fcad23
            *var_len = 128;
Packit fcad23
            string[128] = '\0';
Packit fcad23
        }
Packit fcad23
        return (u_char *) string;
Packit fcad23
    case HRSWRUN_TYPE:
Packit fcad23
#ifdef PID_MAXSYS
Packit fcad23
        if (pid < PID_MAXSYS)
Packit fcad23
            long_return = 2;    /* operatingSystem */
Packit fcad23
        else
Packit fcad23
            long_return = 4;    /* application */
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
		if (proc_table[LowProcIndex].pi_flags & SKPROC) {
Packit fcad23
			long_return = 2;	/* kernel process */
Packit fcad23
		} else
Packit fcad23
			long_return = 4;	/* application */
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
        if (proc_table[LowProcIndex].p_flag & P_SYSTEM)
Packit fcad23
	    long_return = 2;	/* operatingSystem */
Packit fcad23
	else
Packit fcad23
	    long_return = 4;	/* application */
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
    #if defined(freebsd5) && __FreeBSD_version >= 500014
Packit fcad23
	if (proc_table[LowProcIndex].ki_flag & P_SYSTEM) {
Packit fcad23
	    if (proc_table[LowProcIndex].ki_pri.pri_class == PRI_ITHD)
Packit fcad23
		long_return = 3;/* deviceDriver */
Packit fcad23
	    else
Packit fcad23
		long_return = 2;/* operatingSystem */
Packit fcad23
	} else
Packit fcad23
	    long_return = 4;	/* application */
Packit fcad23
    #elif defined(openbsd5)
Packit fcad23
        if (proc_table[LowProcIndex].p_flag & P_SYSTEM)
Packit fcad23
	    long_return = 2;	/* operatingSystem */
Packit fcad23
	else
Packit fcad23
	    long_return = 4;	/* application */
Packit fcad23
    #else
Packit fcad23
      #if defined(dragonfly) && __DragonFly_version >= 190000
Packit fcad23
        if (proc_table[LowProcIndex].kp_flags & P_SYSTEM)
Packit fcad23
      #else
Packit fcad23
        if (proc_table[LowProcIndex].kp_proc.p_flag & P_SYSTEM)
Packit fcad23
      #endif
Packit fcad23
	    long_return = 2;	/* operatingSystem */
Packit fcad23
	else
Packit fcad23
	    long_return = 4;	/* application */
Packit fcad23
    #endif
Packit fcad23
#else
Packit fcad23
	long_return = 4;	/* application */
Packit fcad23
#endif
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    case HRSWRUN_STATUS:
Packit fcad23
#if defined(cygwin)
Packit fcad23
        if (lowproc.process_state & PID_STOPPED)
Packit fcad23
            long_return = 3;    /* notRunnable */
Packit fcad23
        /* else if (lowproc.process_state & PID_ZOMBIE) */
Packit fcad23
        else if (lowproc.exitcode & ~0xffff)
Packit fcad23
            long_return = 4;    /* invalid */
Packit fcad23
        else
Packit fcad23
            long_return = 1;    /* running */
Packit fcad23
#elif !defined(linux)
Packit fcad23
#if defined(hpux10) || defined(hpux11)
Packit fcad23
        switch (proc_table[LowProcIndex].pst_stat) {
Packit fcad23
        case PS_STOP:
Packit fcad23
            long_return = 3;    /* notRunnable */
Packit fcad23
            break;
Packit fcad23
        case PS_SLEEP:
Packit fcad23
            long_return = 2;    /* runnable */
Packit fcad23
            break;
Packit fcad23
        case PS_RUN:
Packit fcad23
            long_return = 1;    /* running */
Packit fcad23
            break;
Packit fcad23
        case PS_ZOMBIE:
Packit fcad23
        case PS_IDLE:
Packit fcad23
        case PS_OTHER:
Packit fcad23
        default:
Packit fcad23
            long_return = 4;    /* invalid */
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
#else
Packit fcad23
#if HAVE_KVM_GETPROC2
Packit fcad23
        switch (proc_table[LowProcIndex].p_stat) {
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
    #if defined(freebsd5) && __FreeBSD_version >= 500014
Packit fcad23
        switch (proc_table[LowProcIndex].ki_stat) {
Packit fcad23
    #elif defined(dragonfly) && __DragonFly_version >= 190000
Packit fcad23
        switch (proc_table[LowProcIndex].kp_stat) {
Packit fcad23
    #elif defined(openbsd5)
Packit fcad23
        switch (proc_table[LowProcIndex].p_stat) {
Packit fcad23
    #else
Packit fcad23
        switch (proc_table[LowProcIndex].kp_proc.p_stat) {
Packit fcad23
    #endif
Packit fcad23
#elif defined(dynix)
Packit fcad23
        switch (lowpsinfo.pr_state) {
Packit fcad23
#elif defined(solaris2)
Packit fcad23
#if _SLASH_PROC_METHOD_
Packit fcad23
        switch (proc_buf ? proc_buf->pr_lwp.pr_state : SIDL) {
Packit fcad23
#else
Packit fcad23
        switch (proc_buf->p_stat) {
Packit fcad23
#endif
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
        switch (proc_table[LowProcIndex].pi_state) {
Packit fcad23
#else
Packit fcad23
        switch (proc_table[LowProcIndex].p_stat) {
Packit fcad23
#endif
Packit fcad23
        case SSTOP:
Packit fcad23
            long_return = 3;    /* notRunnable */
Packit fcad23
            break;
Packit fcad23
        case 0:
Packit fcad23
#ifdef SSWAP
Packit fcad23
        case SSWAP:
Packit fcad23
#endif
Packit fcad23
#ifdef SSLEEP
Packit fcad23
        case SSLEEP:
Packit fcad23
#endif
Packit fcad23
#ifdef SWAIT
Packit fcad23
        case SWAIT:
Packit fcad23
#endif
Packit fcad23
            long_return = 2;    /* runnable */
Packit fcad23
            break;
Packit fcad23
#ifdef SACTIVE
Packit fcad23
        case SACTIVE:
Packit fcad23
#endif
Packit fcad23
#ifdef SRUN
Packit fcad23
        case SRUN:
Packit fcad23
#endif
Packit fcad23
#ifdef SONPROC
Packit fcad23
        case SONPROC:
Packit fcad23
#endif
Packit fcad23
            long_return = 1;    /* running */
Packit fcad23
            break;
Packit fcad23
        case SIDL:
Packit fcad23
        case SZOMB:
Packit fcad23
        default:
Packit fcad23
            long_return = 4;    /* invalid */
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
#endif
Packit fcad23
#else
Packit fcad23
	if ((cp = get_proc_stat_field(pid,buf,sizeof(buf),2)) != NULL ) {
Packit fcad23
            switch (*cp) {
Packit fcad23
            case 'R':
Packit fcad23
                long_return = 1;        /* running */
Packit fcad23
                break;
Packit fcad23
            case 'S':
Packit fcad23
                long_return = 2;        /* runnable */
Packit fcad23
                break;
Packit fcad23
            case 'D':
Packit fcad23
            case 'T':
Packit fcad23
                long_return = 3;        /* notRunnable */
Packit fcad23
                break;
Packit fcad23
            case 'Z':
Packit fcad23
            default:
Packit fcad23
                long_return = 4;        /* invalid */
Packit fcad23
                break;
Packit fcad23
            }
Packit fcad23
        } else
Packit fcad23
            long_return = 4;    /* invalid */
Packit fcad23
#endif
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
Packit fcad23
    case HRSWRUNPERF_CPU:
Packit fcad23
#ifdef HAVE_SYS_PSTAT_H
Packit fcad23
        long_return = proc_buf.pst_cptickstotal;
Packit fcad23
        /*
Packit fcad23
         * Not convinced this is right, but....
Packit fcad23
         */
Packit fcad23
#elif defined(dynix)
Packit fcad23
        long_return = lowpsinfo.pr_time.tv_sec * 100 +
Packit fcad23
            lowpsinfo.pr_time.tv_nsec / 10000000;
Packit fcad23
#elif defined(solaris2)
Packit fcad23
#if _SLASH_PROC_METHOD_
Packit fcad23
        long_return = proc_buf ? proc_buf->pr_time.tv_sec * 100 +
Packit fcad23
            proc_buf->pr_time.tv_nsec / 10000000 : 0;
Packit fcad23
#else
Packit fcad23
        long_return = proc_buf->p_utime * 100 + proc_buf->p_stime * 100;
Packit fcad23
#endif
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
        long_return = proc_table[LowProcIndex].p_uticks +
Packit fcad23
            proc_table[LowProcIndex].p_sticks +
Packit fcad23
            proc_table[LowProcIndex].p_iticks;
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
    #if defined(NOT_DEFINED) && defined(freebsd5) && __FreeBSD_version >= 500014
Packit fcad23
        /* XXX: Accessing ki_paddr causes sig10 ...
Packit fcad23
        long_return = proc_table[LowProcIndex].ki_paddr->p_uticks +
Packit fcad23
            proc_table[LowProcIndex].ki_paddr->p_sticks +
Packit fcad23
            proc_table[LowProcIndex].ki_paddr->p_iticks; */
Packit fcad23
        long_return = 0;
Packit fcad23
    #elif defined(freebsd5)
Packit fcad23
        long_return = proc_table[LowProcIndex].ki_runtime / 100000;
Packit fcad23
    #elif defined(dragonfly) && __DragonFly_version >= 190000
Packit fcad23
        long_return = proc_table[LowProcIndex].kp_lwp.kl_uticks +
Packit fcad23
            proc_table[LowProcIndex].kp_lwp.kl_sticks +
Packit fcad23
            proc_table[LowProcIndex].kp_lwp.kl_iticks;
Packit fcad23
    #elif defined(openbsd5)
Packit fcad23
        long_return = proc_table[LowProcIndex].p_uticks +
Packit fcad23
            proc_table[LowProcIndex].p_sticks +
Packit fcad23
            proc_table[LowProcIndex].p_iticks;
Packit fcad23
    #elif defined(dragonfly)
Packit fcad23
        long_return = proc_table[LowProcIndex].kp_eproc.e_uticks +
Packit fcad23
            proc_table[LowProcIndex].kp_eproc.e_sticks +
Packit fcad23
            proc_table[LowProcIndex].kp_eproc.e_iticks;
Packit fcad23
    #else
Packit fcad23
        long_return = proc_table[LowProcIndex].kp_proc.p_uticks +
Packit fcad23
            proc_table[LowProcIndex].kp_proc.p_sticks +
Packit fcad23
            proc_table[LowProcIndex].kp_proc.p_iticks;
Packit fcad23
    #endif
Packit fcad23
#elif defined(linux)
Packit fcad23
	if ((cp = get_proc_stat_field(pid,buf,sizeof(buf),13)) == NULL ) {
Packit fcad23
            long_return = 0;
Packit fcad23
            return (u_char *) & long_return;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        long_return = atoi(cp); /* utime */
Packit fcad23
Packit fcad23
        cp = skip_to_next_field(cp);
Packit fcad23
Packit fcad23
        long_return += atoi(cp);        /* + stime */
Packit fcad23
#elif defined(sunos4)
Packit fcad23
        long_return = proc_table[LowProcIndex].p_time;
Packit fcad23
#elif defined(cygwin)
Packit fcad23
        {
Packit fcad23
            DWORD           n = lowproc.dwProcessId;
Packit fcad23
            HANDLE          h =
Packit fcad23
                OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
Packit fcad23
                            FALSE, n);
Packit fcad23
            FILETIME        ct, et, kt, ut;
Packit fcad23
Packit fcad23
            if (h) {
Packit fcad23
                if (GetProcessTimes(h, &ct, &et, &kt, &ut))
Packit fcad23
                    long_return = (to_msec(&kt) + to_msec(&ut)) / 10;
Packit fcad23
                else {
Packit fcad23
                    snmp_log(LOG_INFO, "no process times for %lu (%lu)\n",
Packit fcad23
                             lowproc.pid, n);
Packit fcad23
                    long_return = 0;
Packit fcad23
                }
Packit fcad23
                CloseHandle(h);
Packit fcad23
            } else {
Packit fcad23
                snmp_log(LOG_INFO, "no process handle for %lu (%lu)\n",
Packit fcad23
                         lowproc.pid, n);
Packit fcad23
                long_return = 0;
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
        long_return = proc_table[LowProcIndex].pi_ru.ru_utime.tv_sec * 100 +
Packit fcad23
            proc_table[LowProcIndex].pi_ru.ru_utime.tv_usec / 10000000 + /* nanoseconds */
Packit fcad23
            proc_table[LowProcIndex].pi_ru.ru_stime.tv_sec * 100 +
Packit fcad23
            proc_table[LowProcIndex].pi_ru.ru_stime.tv_usec / 10000000; /* nanoseconds */
Packit fcad23
#else
Packit fcad23
        long_return = proc_table[LowProcIndex].p_utime.tv_sec * 100 +
Packit fcad23
            proc_table[LowProcIndex].p_utime.tv_usec / 10000 +
Packit fcad23
            proc_table[LowProcIndex].p_stime.tv_sec * 100 +
Packit fcad23
            proc_table[LowProcIndex].p_stime.tv_usec / 10000;
Packit fcad23
#endif
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    case HRSWRUNPERF_MEM:
Packit fcad23
#ifdef HAVE_SYS_PSTAT_H
Packit fcad23
# ifdef PGSHIFT
Packit fcad23
        long_return = (proc_buf.pst_rssize << PGSHIFT) / 1024;
Packit fcad23
# else
Packit fcad23
        long_return = proc_buf.pst_rssize * getpagesize() / 1024;
Packit fcad23
# endif
Packit fcad23
#elif defined(dynix)
Packit fcad23
        long_return = (lowpsinfo.pr_rssize * MMU_PAGESIZE) / 1024;
Packit fcad23
#elif defined(solaris2)
Packit fcad23
#if _SLASH_PROC_METHOD_
Packit fcad23
#ifdef _ILP32
Packit fcad23
        if(NULL != proc_buf && 0 == proc_buf->pr_rssize)
Packit fcad23
        { /* Odds on that we are looking with a 32 bit app at a 64 bit psinfo.*/
Packit fcad23
            netsnmp_memory_info *mem;
Packit fcad23
            netsnmp_memory_load();
Packit fcad23
            mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 0 );
Packit fcad23
            if (!mem) 
Packit fcad23
            {
Packit fcad23
                snmp_log(LOG_INFO, "netsnmp_memory_get_byIdx returned NULL pointer\n");
Packit fcad23
                long_return = 0;/* Tried my best, giving up.*/
Packit fcad23
            } 
Packit fcad23
            else 
Packit fcad23
            {/* 0x8000 is the maximum range of pr_pctmem. devision of 1024 is to go from B to kB*/
Packit fcad23
                uint32_t pct_unit = (mem->size/0x8000) * (mem->units/1024);
Packit fcad23
                long_return = proc_buf ? proc_buf->pr_pctmem * pct_unit : 0;
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
        else
Packit fcad23
        {    
Packit fcad23
            long_return = proc_buf ? proc_buf->pr_rssize : 0;
Packit fcad23
        
Packit fcad23
        }
Packit fcad23
#else /*_LP64*/
Packit fcad23
        long_return = proc_buf ? proc_buf->pr_rssize : 0;
Packit fcad23
#endif /*_LP64*/
Packit fcad23
Packit fcad23
#else
Packit fcad23
        long_return = proc_buf->p_swrss;
Packit fcad23
#endif
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
        long_return = proc_table[LowProcIndex].pi_size * getpagesize() / 1024;
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
        long_return = proc_table[LowProcIndex].p_vm_tsize +
Packit fcad23
            proc_table[LowProcIndex].p_vm_ssize +
Packit fcad23
            proc_table[LowProcIndex].p_vm_dsize;
Packit fcad23
        long_return = long_return * (getpagesize() / 1024);
Packit fcad23
#elif HAVE_KVM_GETPROCS && !defined(darwin8)
Packit fcad23
  #if defined(NOT_DEFINED) && defined(freebsd5) && __FreeBSD_version >= 500014
Packit fcad23
	    /* XXX
Packit fcad23
	    long_return = proc_table[LowProcIndex].ki_vmspace->vm_tsize +
Packit fcad23
			  proc_table[LowProcIndex].ki_vmspace->vm_ssize +
Packit fcad23
			  proc_table[LowProcIndex].ki_vmspace->vm_dsize;
Packit fcad23
	    long_return = long_return * (getpagesize() / 1024); */
Packit fcad23
	    long_return = 0;
Packit fcad23
  #elif defined(freebsd3) && !defined(darwin)
Packit fcad23
        long_return =
Packit fcad23
    #if defined(freebsd5)
Packit fcad23
            proc_table[LowProcIndex].ki_size / 1024;
Packit fcad23
    #elif defined(dragonfly) && __DragonFly_version >= 190000
Packit fcad23
            proc_table[LowProcIndex].kp_vm_map_size / 1024;
Packit fcad23
    #else
Packit fcad23
            proc_table[LowProcIndex].kp_eproc.e_vm.vm_map.size / 1024;
Packit fcad23
    #endif
Packit fcad23
  #elif defined(openbsd5)
Packit fcad23
        long_return = proc_table[LowProcIndex].p_vm_tsize +
Packit fcad23
            proc_table[LowProcIndex].p_vm_ssize +
Packit fcad23
            proc_table[LowProcIndex].p_vm_dsize;
Packit fcad23
        long_return = long_return * (getpagesize() / 1024);
Packit fcad23
  #else
Packit fcad23
        long_return = proc_table[LowProcIndex].kp_eproc.e_vm.vm_tsize +
Packit fcad23
            proc_table[LowProcIndex].kp_eproc.e_vm.vm_ssize +
Packit fcad23
            proc_table[LowProcIndex].kp_eproc.e_vm.vm_dsize;
Packit fcad23
        long_return = long_return * (getpagesize() / 1024);
Packit fcad23
  #endif
Packit fcad23
#elif defined(linux)
Packit fcad23
	if ((cp = get_proc_stat_field(pid,buf,sizeof(buf),23)) == NULL ) {
Packit fcad23
            long_return = 0;
Packit fcad23
            return (u_char *) & long_return;
Packit fcad23
        }
Packit fcad23
        long_return = atoi(cp) * (getpagesize() / 1024);        /* rss */
Packit fcad23
#elif defined(cygwin)
Packit fcad23
        {
Packit fcad23
            DWORD           n = lowproc.dwProcessId;
Packit fcad23
            HANDLE          h =
Packit fcad23
                OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
Packit fcad23
                            FALSE, n);
Packit fcad23
            PROCESS_MEMORY_COUNTERS pmc;
Packit fcad23
Packit fcad23
            if (h) {
Packit fcad23
                if (myGetProcessMemoryInfo
Packit fcad23
                    && myGetProcessMemoryInfo(h, &pmc, sizeof pmc))
Packit fcad23
                    long_return = pmc.WorkingSetSize / 1024;
Packit fcad23
                else {
Packit fcad23
                    snmp_log(LOG_INFO, "no process times for %lu (%lu)\n",
Packit fcad23
                             lowproc.pid, n);
Packit fcad23
                    long_return = 0;
Packit fcad23
                }
Packit fcad23
                CloseHandle(h);
Packit fcad23
            } else {
Packit fcad23
                snmp_log(LOG_INFO, "no process handle for %lu (%lu)\n",
Packit fcad23
                         lowproc.pid, n);
Packit fcad23
                long_return = 0;
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
#else
Packit fcad23
#if NETSNMP_NO_DUMMY_VALUES
Packit fcad23
        return NULL;
Packit fcad23
#endif
Packit fcad23
        long_return = 16 * 1024;        /* XXX - 16M! */
Packit fcad23
#endif
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    default:
Packit fcad23
        DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrswrun\n",
Packit fcad23
                    vp->magic));
Packit fcad23
    }
Packit fcad23
    return NULL;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
        /*********************
Packit fcad23
	 *
Packit fcad23
	 *  Internal implementation functions
Packit fcad23
	 *
Packit fcad23
	 *********************/
Packit fcad23
Packit fcad23
#if defined(linux)
Packit fcad23
Packit fcad23
DIR            *procdir = NULL;
Packit fcad23
struct dirent  *procentry_p;
Packit fcad23
Packit fcad23
void
Packit fcad23
Init_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    if (procdir != NULL)
Packit fcad23
        closedir(procdir);
Packit fcad23
    procdir = opendir("/proc");
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
Get_Next_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    int             pid;
Packit fcad23
    if (procdir == NULL)
Packit fcad23
      return -1;
Packit fcad23
    procentry_p = readdir(procdir);
Packit fcad23
Packit fcad23
    if (procentry_p == NULL)
Packit fcad23
        return -1;
Packit fcad23
Packit fcad23
    pid = atoi(procentry_p->d_name);
Packit fcad23
    if (pid == 0)
Packit fcad23
        return (Get_Next_HR_SWRun());
Packit fcad23
    return pid;
Packit fcad23
}
Packit fcad23
Packit fcad23
void
Packit fcad23
End_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    if (procdir)
Packit fcad23
        closedir(procdir);
Packit fcad23
    procdir = NULL;
Packit fcad23
}
Packit fcad23
Packit fcad23
#elif defined(cygwin)
Packit fcad23
Packit fcad23
static pid_t    curpid;
Packit fcad23
Packit fcad23
void
Packit fcad23
Init_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    cygwin_internal(CW_LOCK_PINFO, 1000);
Packit fcad23
    curpid = 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
Get_Next_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    curproc =
Packit fcad23
        (struct external_pinfo *) cygwin_internal(query,
Packit fcad23
                                                  curpid | CW_NEXTPID);
Packit fcad23
    if (curproc)
Packit fcad23
        curpid = curproc->pid;
Packit fcad23
    else {
Packit fcad23
        curpid = -1;
Packit fcad23
    }
Packit fcad23
    return curpid;
Packit fcad23
}
Packit fcad23
Packit fcad23
void
Packit fcad23
End_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    cygwin_internal(CW_UNLOCK_PINFO);
Packit fcad23
}
Packit fcad23
Packit fcad23
#elif defined(dynix)
Packit fcad23
Packit fcad23
void
Packit fcad23
Init_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    nextproc = 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
Get_Next_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    getprpsinfo_t  *select = 0;
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("host/hr_swrun::GetNextHR_SWRun",
Packit fcad23
                "nextproc == %d... &nextproc = %u\n", nextproc,
Packit fcad23
                &nextproc));
Packit fcad23
    if ((nextproc = getprpsinfo(nextproc, select, &mypsinfo)) < 0) {
Packit fcad23
        return -1;
Packit fcad23
    } else {
Packit fcad23
        DEBUGMSGTL(("host/hr_swrun::GetNextHR_SWRun",
Packit fcad23
                    "getprpsinfo returned %d\n", nextproc));
Packit fcad23
        return mypsinfo.pr_pid;
Packit fcad23
    }
Packit fcad23
Packit fcad23
}
Packit fcad23
Packit fcad23
void
Packit fcad23
End_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    /*
Packit fcad23
     * just a stub... because it's declared 
Packit fcad23
     */
Packit fcad23
}
Packit fcad23
Packit fcad23
#else                           /* linux */
Packit fcad23
Packit fcad23
static int      nproc;
Packit fcad23
Packit fcad23
void
Packit fcad23
Init_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    size_t          bytes;
Packit fcad23
    static time_t   iwhen = 0;
Packit fcad23
    time_t          now;
Packit fcad23
Packit fcad23
    time(&now;;
Packit fcad23
    if (now == iwhen) {
Packit fcad23
        current_proc_entry = 0;
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
    iwhen = now;
Packit fcad23
Packit fcad23
#if defined(hpux10) || defined(hpux11)
Packit fcad23
    pstat_getdynamic(&pst_dyn, sizeof(struct pst_dynamic), 1, 0);
Packit fcad23
    nproc = pst_dyn.psd_activeprocs;
Packit fcad23
    bytes = nproc * sizeof(struct pst_status);
Packit fcad23
    if ((proc_table =
Packit fcad23
         (struct pst_status *) realloc(proc_table, bytes)) == NULL) {
Packit fcad23
        current_proc_entry = nproc + 1;
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
    pstat_getproc(proc_table, sizeof(struct pst_status), nproc, 0);
Packit fcad23
Packit fcad23
#elif defined(solaris2)
Packit fcad23
    if (getKstatInt("unix", "system_misc", "nproc", &nproc)) {
Packit fcad23
        current_proc_entry = nproc + 1;
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
    bytes = nproc * sizeof(int);
Packit fcad23
    if ((proc_table = (int *) realloc(proc_table, bytes)) == NULL) {
Packit fcad23
        current_proc_entry = nproc + 1;
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
    {
Packit fcad23
        DIR            *f;
Packit fcad23
        struct dirent  *dp;
Packit fcad23
#if _SLASH_PROC_METHOD_ == 0
Packit fcad23
        if (kd == NULL) {
Packit fcad23
            current_proc_entry = nproc + 1;
Packit fcad23
            return;
Packit fcad23
        }
Packit fcad23
#endif
Packit fcad23
        f = opendir("/proc");
Packit fcad23
        current_proc_entry = 0;
Packit fcad23
        while ((dp = readdir(f)) != NULL && current_proc_entry < nproc)
Packit fcad23
            if (dp->d_name[0] != '.')
Packit fcad23
                proc_table[current_proc_entry++] = atoi(dp->d_name);
Packit fcad23
        /*
Packit fcad23
         * if we are in a Solaris zone, nproc > current_proc_entry !
Packit fcad23
         * but we only want the processes from the local zone
Packit fcad23
         */
Packit fcad23
        if (current_proc_entry != nproc)
Packit fcad23
            nproc = current_proc_entry;
Packit fcad23
        closedir(f);
Packit fcad23
    }
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
    {
Packit fcad23
		pid_t proc_index = 0;
Packit fcad23
		int avail = 1024;
Packit fcad23
		if (proc_table) {
Packit fcad23
			free(proc_table);
Packit fcad23
		}
Packit fcad23
		nproc = 0;
Packit fcad23
		proc_table = malloc(sizeof(proc_table[0]) * avail);
Packit fcad23
		for (;;) {
Packit fcad23
			int got;
Packit fcad23
			if (!proc_table) {
Packit fcad23
				nproc = 0;
Packit fcad23
				snmp_log_perror("Init_HR_SWRun-malloc");
Packit fcad23
				return;
Packit fcad23
			}
Packit fcad23
			got = getprocs(proc_table + nproc, sizeof(proc_table[0]),
Packit fcad23
						   0, sizeof(struct fdsinfo),
Packit fcad23
						   &proc_index, avail - nproc);
Packit fcad23
			nproc += got;
Packit fcad23
			if (nproc < avail) {
Packit fcad23
				break;
Packit fcad23
			}
Packit fcad23
			avail += 1024;
Packit fcad23
			proc_table = realloc(proc_table, avail * sizeof(proc_table[0]));
Packit fcad23
		}
Packit fcad23
    }
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
    {
Packit fcad23
        if (kd == NULL) {
Packit fcad23
            nproc = 0;
Packit fcad23
            return;
Packit fcad23
        }
Packit fcad23
        proc_table = kvm_getproc2(kd, KERN_PROC_ALL, 0, sizeof (struct kinfo_proc2), &nproc);
Packit fcad23
    }
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
    {
Packit fcad23
        if (kd == NULL) {
Packit fcad23
            nproc = 0;
Packit fcad23
            return;
Packit fcad23
        }
Packit fcad23
  #if defined(openbsd5)
Packit fcad23
        proc_table = kvm_getprocs(kd, KERN_PROC_ALL, 0, sizeof (struct kinfo_proc), &nproc);
Packit fcad23
  #else
Packit fcad23
        proc_table = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc);
Packit fcad23
  #endif
Packit fcad23
    }
Packit fcad23
#else
Packit fcad23
Packit fcad23
    current_proc_entry = 1;
Packit fcad23
#ifndef bsdi2
Packit fcad23
    nproc = 0;
Packit fcad23
Packit fcad23
    if (auto_nlist(NPROC_SYMBOL, (char *) &nproc, sizeof(int)) == 0) {
Packit fcad23
        snmp_log_perror("Init_HR_SWRun-auto_nlist NPROC");
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
#endif
Packit fcad23
    bytes = nproc * sizeof(struct proc);
Packit fcad23
Packit fcad23
    if (proc_table)
Packit fcad23
        free((char *) proc_table);
Packit fcad23
    if ((proc_table = (struct proc *) malloc(bytes)) == NULL) {
Packit fcad23
        nproc = 0;
Packit fcad23
        snmp_log_perror("Init_HR_SWRun-malloc");
Packit fcad23
        return;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    {
Packit fcad23
        int             proc_table_base;
Packit fcad23
        if (auto_nlist
Packit fcad23
            (PROC_SYMBOL, (char *) &proc_table_base,
Packit fcad23
             sizeof(proc_table_base)) == 0) {
Packit fcad23
            nproc = 0;
Packit fcad23
            snmp_log_perror("Init_HR_SWRun-auto_nlist PROC");
Packit fcad23
            return;
Packit fcad23
        }
Packit fcad23
        if (NETSNMP_KLOOKUP(proc_table_base, (char *) proc_table, bytes) == 0) {
Packit fcad23
            nproc = 0;
Packit fcad23
            snmp_log_perror("Init_HR_SWRun-klookup");
Packit fcad23
            return;
Packit fcad23
        }
Packit fcad23
    }
Packit fcad23
#endif
Packit fcad23
    current_proc_entry = 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
Get_Next_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    while (current_proc_entry < nproc) {
Packit fcad23
#if defined(hpux10) || defined(hpux11)
Packit fcad23
        return proc_table[current_proc_entry++].pst_pid;
Packit fcad23
#elif defined(solaris2)
Packit fcad23
        return proc_table[current_proc_entry++];
Packit fcad23
#elif HAVE_KVM_GETPROC2
Packit fcad23
        if (proc_table[current_proc_entry].p_stat != 0)
Packit fcad23
            return proc_table[current_proc_entry++].p_pid;
Packit fcad23
#elif HAVE_KVM_GETPROCS
Packit fcad23
    #if defined(freebsd5) && __FreeBSD_version >= 500014
Packit fcad23
        if (proc_table[current_proc_entry].ki_stat != 0)
Packit fcad23
            return proc_table[current_proc_entry++].ki_pid;
Packit fcad23
    #elif defined(dragonfly) && __DragonFly_version >= 190000
Packit fcad23
        if (proc_table[current_proc_entry].kp_stat != 0)
Packit fcad23
            return proc_table[current_proc_entry++].kp_pid;
Packit fcad23
    #elif defined(openbsd5)
Packit fcad23
        if (proc_table[current_proc_entry].p_stat != 0)
Packit fcad23
            return proc_table[current_proc_entry++].p_pid;
Packit fcad23
    #else
Packit fcad23
        if (proc_table[current_proc_entry].kp_proc.p_stat != 0)
Packit fcad23
            return proc_table[current_proc_entry++].kp_proc.p_pid;
Packit fcad23
    #endif
Packit fcad23
#elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
        if (proc_table[current_proc_entry].pi_state != 0)
Packit fcad23
            return proc_table[current_proc_entry++].pi_pid;
Packit fcad23
        else
Packit fcad23
            ++current_proc_entry;
Packit fcad23
#else
Packit fcad23
        if (proc_table[current_proc_entry].p_stat != 0)
Packit fcad23
            return proc_table[current_proc_entry++].p_pid;
Packit fcad23
        else
Packit fcad23
            ++current_proc_entry;
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    }
Packit fcad23
    return -1;
Packit fcad23
}
Packit fcad23
Packit fcad23
void
Packit fcad23
End_HR_SWRun(void)
Packit fcad23
{
Packit fcad23
    current_proc_entry = nproc + 1;
Packit fcad23
}
Packit fcad23
#endif
Packit fcad23
Packit fcad23
int
Packit fcad23
count_processes(void)
Packit fcad23
{
Packit fcad23
#if !(defined(linux) || defined(cygwin) || defined(hpux10) || defined(hpux11) || defined(solaris2) || HAVE_KVM_GETPROCS || HAVE_KVM_GETPROC2 || defined(dynix))
Packit fcad23
    int             i;
Packit fcad23
#endif
Packit fcad23
    int             total = 0;
Packit fcad23
Packit fcad23
    Init_HR_SWRun();
Packit fcad23
#if defined(hpux10) || defined(hpux11) || HAVE_KVM_GETPROCS || HAVE_KVM_GETPROC2 || defined(solaris2)
Packit fcad23
    total = nproc;
Packit fcad23
#else
Packit fcad23
#if defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
Packit fcad23
    for (i = 0; i < nproc; ++i) {
Packit fcad23
        if (proc_table[i].pi_state != 0)
Packit fcad23
#elif !defined(linux) && !defined(cygwin) && !defined(dynix)
Packit fcad23
    for (i = 0; i < nproc; ++i) {
Packit fcad23
        if (proc_table[i].p_stat != 0)
Packit fcad23
#else
Packit fcad23
    while (Get_Next_HR_SWRun() != -1) {
Packit fcad23
#endif
Packit fcad23
        ++total;
Packit fcad23
    }
Packit fcad23
#endif                          /* !hpux10 && !hpux11 && !HAVE_KVM_GETPROCS && !HAVE_KVM_GETPROC2 && !solaris2 */
Packit fcad23
    End_HR_SWRun();
Packit fcad23
    return total;
Packit fcad23
}