|
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 |
}
|