2 * Host Resources MIB - Running Software group implementation - hr_swrun.c
3 * (also includes Running Software Performance group )
7 #include <net-snmp/net-snmp-config.h>
16 #include <sys/param.h>
19 #include <sys/pstat.h>
34 #include <sys/sysctl.h>
36 #if HAVE_DIRENT_H && !defined(cygwin)
39 # define dirent direct
41 # include <sys/ndir.h>
52 #include <sys/cygwin.h>
57 #if _SLASH_PROC_METHOD_
69 #include <net-snmp/output_api.h>
72 #include <net-snmp/agent/auto_nlist.h>
75 #include "kernel_sunos5.h"
78 /*********************
80 * Initialisation & common implementation functions
82 *********************/
83 void Init_HR_SWRun(void);
84 int Get_Next_HR_SWRun(void);
85 void End_HR_SWRun(void);
86 int header_hrswrun(struct variable *, oid *, size_t *, int,
87 size_t *, WriteMethod **);
88 int header_hrswrunEntry(struct variable *, oid *, size_t *,
89 int, size_t *, WriteMethod **);
93 static prpsinfo_t lowpsinfo, mypsinfo;
96 static struct external_pinfo *curproc;
97 static struct external_pinfo lowproc;
99 static int LowProcIndex;
101 #if defined(hpux10) || defined(hpux11)
102 struct pst_status *proc_table;
103 struct pst_dynamic pst_dyn;
104 #elif HAVE_KVM_GETPROCS
105 struct kinfo_proc *proc_table;
106 #elif defined(solaris2)
109 struct proc *proc_table;
112 int current_proc_entry;
116 #define HRSWRUN_OSINDEX 1
118 #define HRSWRUN_INDEX 2
119 #define HRSWRUN_NAME 3
121 #define HRSWRUN_PATH 5
122 #define HRSWRUN_PARAMS 6
123 #define HRSWRUN_TYPE 7
124 #define HRSWRUN_STATUS 8
126 #define HRSWRUNPERF_CPU 9
127 #define HRSWRUNPERF_MEM 10
129 struct variable4 hrswrun_variables[] = {
130 {HRSWRUN_OSINDEX, ASN_INTEGER, RONLY, var_hrswrun, 1, {1}},
131 {HRSWRUN_INDEX, ASN_INTEGER, RONLY, var_hrswrun, 3, {2, 1, 1}},
132 {HRSWRUN_NAME, ASN_OCTET_STR, RONLY, var_hrswrun, 3, {2, 1, 2}},
133 {HRSWRUN_ID, ASN_OBJECT_ID, RONLY, var_hrswrun, 3, {2, 1, 3}},
134 {HRSWRUN_PATH, ASN_OCTET_STR, RONLY, var_hrswrun, 3, {2, 1, 4}},
135 {HRSWRUN_PARAMS, ASN_OCTET_STR, RONLY, var_hrswrun, 3, {2, 1, 5}},
136 {HRSWRUN_TYPE, ASN_INTEGER, RONLY, var_hrswrun, 3, {2, 1, 6}},
137 {HRSWRUN_STATUS, ASN_INTEGER, RONLY, var_hrswrun, 3, {2, 1, 7}}
140 struct variable4 hrswrunperf_variables[] = {
141 {HRSWRUNPERF_CPU, ASN_INTEGER, RONLY, var_hrswrun, 3, {1, 1, 1}},
142 {HRSWRUNPERF_MEM, ASN_INTEGER, RONLY, var_hrswrun, 3, {1, 1, 2}}
145 oid hrswrun_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 4 };
146 oid hrswrunperf_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 5 };
151 * a lot of this is "stolen" from cygwin ps.cc
154 typedef BOOL(WINAPI * ENUMPROCESSMODULES) (HANDLE hProcess,
159 typedef DWORD(WINAPI * GETMODULEFILENAME) (HANDLE hProcess,
161 LPTSTR lpstrFIleName,
164 typedef DWORD(WINAPI * GETPROCESSMEMORYINFO) (HANDLE hProcess,
165 PPROCESS_MEMORY_COUNTERS
168 typedef HANDLE(WINAPI * CREATESNAPSHOT) (DWORD dwFlags,
169 DWORD th32ProcessID);
171 typedef BOOL(WINAPI * PROCESSWALK) (HANDLE hSnapshot,
172 LPPROCESSENTRY32 lppe);
174 ENUMPROCESSMODULES myEnumProcessModules;
175 GETMODULEFILENAME myGetModuleFileNameEx;
176 CREATESNAPSHOT myCreateToolhelp32Snapshot;
177 PROCESSWALK myProcess32First;
178 PROCESSWALK myProcess32Next;
179 GETPROCESSMEMORYINFO myGetProcessMemoryInfo = NULL;
180 cygwin_getinfo_types query = CW_GETPINFO;
183 dummyprocessmodules(HANDLE hProcess,
184 HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded)
186 lphModule[0] = (HMODULE) * lpcbNeeded;
192 GetModuleFileNameEx95(HANDLE hProcess,
193 HMODULE hModule, LPTSTR lpstrFileName, DWORD n)
196 DWORD pid = (DWORD) hModule;
199 h = myCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
202 proc.dwSize = sizeof(proc);
203 if (myProcess32First(h, &proc))
205 if (proc.th32ProcessID == pid) {
207 strcpy(lpstrFileName, proc.szExeFile);
210 while (myProcess32Next(h, &proc));
215 #define FACTOR (0x19db1ded53ea710LL)
216 #define NSPERSEC 10000000LL
217 #define NSPERMSEC 10000LL
219 static time_t __stdcall
220 to_time_t(PFILETIME ptr)
224 ((long long) ptr->dwHighDateTime << 32) +
225 ((unsigned) ptr->dwLowDateTime);
235 to_msec(PFILETIME ptr)
238 ((long long) ptr->dwHighDateTime << 32) +
239 (unsigned) ptr->dwLowDateTime;
254 memset(&ver, 0, sizeof ver);
255 ver.dwOSVersionInfoSize = sizeof ver;
258 if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
259 h = LoadLibrary("psapi.dll");
261 myEnumProcessModules =
262 (ENUMPROCESSMODULES) GetProcAddress(h,
263 "EnumProcessModules");
264 myGetModuleFileNameEx =
265 (GETMODULEFILENAME) GetProcAddress(h,
266 "GetModuleFileNameExA");
267 myGetProcessMemoryInfo =
268 (GETPROCESSMEMORYINFO) GetProcAddress(h,
269 "GetProcessMemoryInfo");
270 if (myEnumProcessModules && myGetModuleFileNameEx)
271 query = CW_GETPINFO_FULL;
273 snmp_log(LOG_ERR, "hr_swrun failed NT init\n");
275 snmp_log(LOG_ERR, "hr_swrun failed to load psapi.dll\n");
277 h = GetModuleHandle("KERNEL32.DLL");
278 myCreateToolhelp32Snapshot =
279 (CREATESNAPSHOT) GetProcAddress(h, "CreateToolhelp32Snapshot");
281 (PROCESSWALK) GetProcAddress(h, "Process32First");
282 myProcess32Next = (PROCESSWALK) GetProcAddress(h, "Process32Next");
283 myEnumProcessModules = dummyprocessmodules;
284 myGetModuleFileNameEx = GetModuleFileNameEx95;
285 if (myCreateToolhelp32Snapshot && myProcess32First
289 * This doesn't work after all on Win98 SE
291 query = CW_GETPINFO_FULL;
296 snmp_log(LOG_ERR, "hr_swrun failed non-NT init\n");
300 auto_nlist(PROC_SYMBOL, 0, 0);
303 auto_nlist(NPROC_SYMBOL, 0, 0);
308 REGISTER_MIB("host/hr_swrun", hrswrun_variables, variable4,
309 hrswrun_variables_oid);
310 REGISTER_MIB("host/hr_swrun", hrswrunperf_variables, variable4,
311 hrswrunperf_variables_oid);
317 * vp IN - pointer to variable entry that points here
318 * name IN/OUT - IN/name requested, OUT/name found
319 * length IN/OUT - length of IN/OUT oid's
320 * exact IN - TRUE if an exact match was requested
321 * var_len OUT - length of variable or 0 if function returned
327 header_hrswrun(struct variable *vp,
330 int exact, size_t * var_len, WriteMethod ** write_method)
332 #define HRSWRUN_NAME_LENGTH 9
333 oid newname[MAX_OID_LEN];
336 DEBUGMSGTL(("host/hr_swrun", "var_hrswrun: "));
337 DEBUGMSGOID(("host/hr_swrun", name, *length));
338 DEBUGMSG(("host/hr_swrun", " %d\n", exact));
340 memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
341 newname[HRSWRUN_NAME_LENGTH] = 0;
342 result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
343 if ((exact && (result != 0)) || (!exact && (result >= 0)))
344 return (MATCH_FAILED);
345 memcpy((char *) name, (char *) newname,
346 (vp->namelen + 1) * sizeof(oid));
347 *length = vp->namelen + 1;
350 *var_len = sizeof(long); /* default to 'long' results */
351 return (MATCH_SUCCEEDED);
355 header_hrswrunEntry(struct variable *vp,
359 size_t * var_len, WriteMethod ** write_method)
361 #define HRSWRUN_ENTRY_NAME_LENGTH 11
362 oid newname[MAX_OID_LEN];
363 int pid, LowPid = -1;
366 DEBUGMSGTL(("host/hr_swrun", "var_hrswrunEntry: "));
367 DEBUGMSGOID(("host/hr_swrun", name, *length));
368 DEBUGMSG(("host/hr_swrun", " %d\n", exact));
370 memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
373 * Find the "next" running process
377 pid = Get_Next_HR_SWRun();
380 DEBUGMSG(("host/hr_swrun",
381 "(index %d (entry #%d) ....", pid, current_proc_entry));
383 DEBUGMSG(("host/hr_swrun", "pid %d; nextproc %d ....", pid,
389 newname[HRSWRUN_ENTRY_NAME_LENGTH] = pid;
390 DEBUGMSGOID(("host/hr_swrun", newname, *length));
391 DEBUGMSG(("host/hr_swrun", "\n"));
392 result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
393 if (exact && (result == 0)) {
398 memcpy(&lowpsinfo, &mypsinfo, sizeof(prpsinfo_t));
399 #elif !defined(linux)
400 LowProcIndex = current_proc_entry - 1;
402 DEBUGMSGTL(("host/hr_swrun", " saved\n"));
404 * Save process status information
408 if ((!exact && (result < 0)) && (LowPid == -1 || pid < LowPid)) {
412 #elif !defined(linux)
413 LowProcIndex = current_proc_entry - 1;
416 * Save process status information
418 DEBUGMSG(("host/hr_swrun", " saved"));
420 DEBUGMSG(("host/hr_swrun", "\n"));
425 DEBUGMSGTL(("host/hr_swrun", "... index out of range\n"));
426 return (MATCH_FAILED);
429 newname[HRSWRUN_ENTRY_NAME_LENGTH] = LowPid;
430 memcpy((char *) name, (char *) newname,
431 (vp->namelen + 1) * sizeof(oid));
432 *length = vp->namelen + 1;
434 *var_len = sizeof(long); /* default to 'long' results */
436 DEBUGMSGTL(("host/hr_swrun", "... get process stats "));
437 DEBUGMSGOID(("host/hr_swrun", name, *length));
438 DEBUGMSG(("host/hr_swrun", "\n"));
442 /*********************
444 * System specific implementation functions
446 *********************/
450 var_hrswrun(struct variable * vp,
453 int exact, size_t * var_len, WriteMethod ** write_method)
456 static char string[256];
457 #ifdef HAVE_SYS_PSTAT_H
458 struct pst_status proc_buf;
459 #elif defined(solaris2)
460 #if _SLASH_PROC_METHOD_
461 static psinfo_t psinfo;
462 static psinfo_t *proc_buf;
464 char procfn[sizeof "/proc/00000/psinfo"];
466 static struct proc *proc_buf;
468 #endif /* _SLASH_PROC_METHOD_ */
469 static time_t when = 0;
471 static int oldpid = -1;
473 #if HAVE_KVM_GETPROCS
483 if (vp->magic == HRSWRUN_OSINDEX) {
484 if (header_hrswrun(vp, name, length, exact, var_len, write_method)
490 header_hrswrunEntry(vp, name, length, exact, var_len,
492 if (pid == MATCH_FAILED)
496 #ifdef HAVE_SYS_PSTAT_H
497 if (pstat_getproc(&proc_buf, sizeof(struct pst_status), 0, pid) == -1)
499 #elif defined(solaris2)
505 if (oldpid != pid || proc_buf == NULL) {
506 #if _SLASH_PROC_METHOD_
508 sprintf(procfn, "/proc/%.5d/psinfo", pid);
509 if ((procfd = open(procfn, O_RDONLY)) != -1) {
510 if (read(procfd, proc_buf, sizeof(*proc_buf)) !=
519 if ((proc_buf = kvm_getproc(kd, pid)) == NULL)
528 case HRSWRUN_OSINDEX:
532 long_return = 1; /* Probably! */
533 return (u_char *) & long_return;
538 return (u_char *) & long_return;
540 #ifdef HAVE_SYS_PSTAT_H
541 snprintf(string, sizeof(string), "%s", proc_buf.pst_cmd);
542 string[ sizeof(string)-1 ] = 0;
543 cp = strchr(string, ' ');
547 snprintf(string, sizeof(string), "%s", lowpsinfo.pr_fname);
548 string[ sizeof(string)-1 ] = 0;
549 cp = strchr(string, ' ');
552 #elif defined(solaris2)
553 #if _SLASH_PROC_METHOD_
555 strncpy(string, proc_buf->pr_fname, sizeof(string));
557 strcpy(string, "<exited>");
558 string[ sizeof(string)-1 ] = 0;
560 strncpy(string, proc_buf->p_user.u_comm, sizeof(string));
561 string[ sizeof(string)-1 ] = 0;
563 #elif HAVE_KVM_GETPROCS
564 strcpy(string, proc_table[LowProcIndex].kp_proc.p_comm);
566 sprintf(string, "/proc/%d/status", pid);
567 if ((fp = fopen(string, "r")) == NULL)
569 fgets(buf, sizeof(buf), fp); /* Name: process name */
578 #elif defined(cygwin)
579 if (lowproc.process_state & (PID_ZOMBIE | PID_EXITED))
580 strcpy(string, "<defunct>");
581 else if (lowproc.ppid) {
582 cygwin_conv_to_posix_path(lowproc.progname, string);
583 cp = strrchr(string, '/');
585 strcpy(string, cp + 1);
586 } else if (query == CW_GETPINFO_FULL) {
587 DWORD n = lowproc.dwProcessId & 0xffff;
589 OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
594 if (!myEnumProcessModules(h, hm, sizeof hm, &n)) {
595 snmp_log(LOG_DEBUG, "no module handle for %lu\n", n);
599 && myGetModuleFileNameEx(h, hm[0], string,
601 cp = strrchr(string, '\\');
603 strcpy(string, cp + 1);
605 strcpy(string, "*** unknown");
608 snmp_log(LOG_INFO, "no process handle for %lu\n", n);
609 strcpy(string, "** unknown");
612 strcpy(string, "* unknown");
613 cp = strchr(string, '\0') - 4;
614 if (cp > string && strcasecmp(cp, ".exe") == 0)
620 sprintf(string, "process name");
622 *var_len = strlen(string);
624 * remove trailing newline
627 cp = string + *var_len - 1;
631 return (u_char *) string;
633 *var_len = nullOidLen;
634 return (u_char *) nullOid;
636 #ifdef HAVE_SYS_PSTAT_H
638 * Path not available - use argv[0]
640 sprintf(string, "%s", proc_buf.pst_cmd);
641 cp = strchr(string, ' ');
646 * Path not available - use argv[0]
648 sprintf(string, "%s", lowpsinfo.pr_psargs);
649 cp = strchr(string, ' ');
652 #elif defined(solaris2)
653 #ifdef _SLASH_PROC_METHOD_
655 strcpy(string, proc_buf->pr_psargs);
657 sprintf(string, "<exited>");
658 cp = strchr(string, ' ');
662 cp = proc_buf->p_user.u_psargs;
664 while (*cp && *cp != ' ')
668 #elif HAVE_KVM_GETPROCS
669 strcpy(string, proc_table[LowProcIndex].kp_proc.p_comm);
671 sprintf(string, "/proc/%d/cmdline", pid);
672 if ((fp = fopen(string, "r")) == NULL)
674 if (fgets(buf, sizeof(buf) - 1, fp)) /* argv[0] '\0' argv[1] '\0' .... */
678 * swapped out - no cmdline
681 sprintf(string, "/proc/%d/status", pid);
682 if ((fp = fopen(string, "r")) == NULL)
684 fgets(buf, sizeof(buf), fp); /* Name: process name */
685 cp = strchr(buf, ':');
690 cp = strchr(string, '\n');
695 #elif defined(cygwin)
696 if (lowproc.process_state & (PID_ZOMBIE | PID_EXITED))
697 strcpy(string, "<defunct>");
698 else if (lowproc.ppid)
699 cygwin_conv_to_posix_path(lowproc.progname, string);
700 else if (query == CW_GETPINFO_FULL) {
701 DWORD n = lowproc.dwProcessId & 0xFFFF;
703 OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
707 if (!myEnumProcessModules(h, hm, sizeof hm, &n))
710 || !myGetModuleFileNameEx(h, hm[0], string,
712 strcpy(string, "*** unknown");
715 strcpy(string, "** unknown");
717 strcpy(string, "* unknown");
722 sprintf(string, "/bin/wombat");
724 *var_len = strlen(string);
725 return (u_char *) string;
727 #ifdef HAVE_SYS_PSTAT_H
728 cp = strchr(proc_buf.pst_cmd, ' ');
731 sprintf(string, "%s", cp);
735 cp = strchr(lowpsinfo.pr_psargs, ' ');
738 sprintf(string, "%s", cp);
741 #elif defined(solaris2)
742 #ifdef _SLASH_PROC_METHOD_
744 cp = strchr(proc_buf->pr_psargs, ' ');
746 strcpy(string, cp + 1);
752 cp = proc_buf->p_user.u_psargs;
753 while (*cp && *cp != ' ')
759 #elif HAVE_KVM_GETPROCS
761 argv = kvm_getargv(kd, proc_table + LowProcIndex, sizeof(string));
764 while (argv && *argv) {
767 strcat(string, *argv);
771 sprintf(string, "/proc/%d/cmdline", pid);
772 if ((fp = fopen(string, "r")) == NULL)
774 memset(buf, 0, sizeof(buf));
777 * argv[0] '\0' argv[1] '\0' ....
779 if (!fgets(buf, sizeof(buf) - 2, fp)) {
781 * maybe be empty (even argv[0] is missing)
797 * Now join together separate arguments.
802 if (*(cp + 1) == '\0')
803 break; /* '\0''\0' => End of command line */
813 #elif defined(cygwin)
819 sprintf(string, "-h -q -v");
821 *var_len = strlen(string);
822 return (u_char *) string;
825 if (pid < PID_MAXSYS)
826 long_return = 2; /* operatingSystem */
829 long_return = 4; /* application */
830 return (u_char *) & long_return;
833 if (lowproc.process_state & PID_STOPPED)
834 long_return = 3; /* notRunnable */
835 else if (lowproc.process_state & PID_ZOMBIE)
836 long_return = 4; /* invalid */
838 long_return = 1; /* running */
839 #elif !defined(linux)
840 #if defined(hpux10) || defined(hpux11)
841 switch (proc_table[LowProcIndex].pst_stat) {
843 long_return = 3; /* notRunnable */
846 long_return = 2; /* runnable */
849 long_return = 1; /* running */
855 long_return = 4; /* invalid */
859 #if HAVE_KVM_GETPROCS
860 switch (proc_table[LowProcIndex].kp_proc.p_stat) {
862 switch (lowpsinfo.pr_state) {
863 #elif defined(solaris2)
864 #if _SLASH_PROC_METHOD_
865 switch (proc_buf ? proc_buf->pr_lwp.pr_state : SIDL) {
867 switch (proc_buf->p_stat) {
870 switch (proc_table[LowProcIndex].p_stat) {
873 long_return = 3; /* notRunnable */
885 long_return = 2; /* runnable */
896 long_return = 1; /* running */
901 long_return = 4; /* invalid */
906 sprintf(string, "/proc/%d/stat", pid);
907 if ((fp = fopen(string, "r")) != NULL) {
908 fgets(buf, sizeof(buf), fp);
910 for (i = 0; i < 2; ++i) { /* skip two fields */
918 long_return = 1; /* running */
921 long_return = 2; /* runnable */
925 long_return = 3; /* notRunnable */
929 long_return = 4; /* invalid */
934 long_return = 4; /* invalid */
936 return (u_char *) & long_return;
938 case HRSWRUNPERF_CPU:
939 #ifdef HAVE_SYS_PSTAT_H
940 long_return = proc_buf.pst_cptickstotal;
942 * Not convinced this is right, but....
945 long_return = lowpsinfo.pr_time.tv_sec * 100 +
946 lowpsinfo.pr_time.tv_nsec / 10000000;
947 #elif defined(solaris2)
948 #if _SLASH_PROC_METHOD_
949 long_return = proc_buf ? proc_buf->pr_time.tv_sec * 100 +
950 proc_buf->pr_time.tv_nsec / 10000000 : 0;
952 long_return = proc_buf->p_utime * 100 + proc_buf->p_stime * 100;
954 #elif HAVE_KVM_GETPROCS
955 long_return = proc_table[LowProcIndex].kp_proc.p_uticks +
956 proc_table[LowProcIndex].kp_proc.p_sticks +
957 proc_table[LowProcIndex].kp_proc.p_iticks;
959 sprintf(string, "/proc/%d/stat", pid);
960 if ((fp = fopen(string, "r")) == NULL)
962 fgets(buf, sizeof(buf), fp);
964 for (i = 0; i < 13; ++i) { /* skip 13 fields */
970 long_return = atoi(cp); /* utime */
975 long_return += atoi(cp); /* + stime */
977 #elif defined(sunos4)
978 long_return = proc_table[LowProcIndex].p_time;
979 #elif defined(cygwin)
981 DWORD n = lowproc.dwProcessId;
983 OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
985 FILETIME ct, et, kt, ut;
988 if (GetProcessTimes(h, &ct, &et, &kt, &ut))
989 long_return = (to_msec(&kt) + to_msec(&ut)) / 10;
991 snmp_log(LOG_INFO, "no process times for %lu (%lu)\n",
997 snmp_log(LOG_INFO, "no process handle for %lu (%lu)\n",
1003 long_return = proc_table[LowProcIndex].p_ru.ru_utime.tv_sec * 100 +
1004 proc_table[LowProcIndex].p_ru.ru_utime.tv_usec / 10000 +
1005 proc_table[LowProcIndex].p_ru.ru_stime.tv_sec * 100 +
1006 proc_table[LowProcIndex].p_ru.ru_stime.tv_usec / 10000;
1008 long_return = proc_table[LowProcIndex].p_utime.tv_sec * 100 +
1009 proc_table[LowProcIndex].p_utime.tv_usec / 10000 +
1010 proc_table[LowProcIndex].p_stime.tv_sec * 100 +
1011 proc_table[LowProcIndex].p_stime.tv_usec / 10000;
1013 return (u_char *) & long_return;
1014 case HRSWRUNPERF_MEM:
1015 #ifdef HAVE_SYS_PSTAT_H
1016 long_return = (proc_buf.pst_rssize << PGSHIFT) / 1024;
1017 #elif defined(dynix)
1018 long_return = (lowpsinfo.pr_rssize * MMU_PAGESIZE) / 1024;
1019 #elif defined(solaris2)
1020 #if _SLASH_PROC_METHOD_
1021 long_return = proc_buf ? proc_buf->pr_rssize : 0;
1023 long_return = proc_buf->p_swrss;
1025 #elif HAVE_KVM_GETPROCS
1026 #if defined(freebsd3) && !defined(darwin)
1028 proc_table[LowProcIndex].kp_eproc.e_vm.vm_map.size / 1024;
1030 long_return = proc_table[LowProcIndex].kp_eproc.e_vm.vm_tsize +
1031 proc_table[LowProcIndex].kp_eproc.e_vm.vm_ssize +
1032 proc_table[LowProcIndex].kp_eproc.e_vm.vm_dsize;
1033 long_return = long_return * (getpagesize() / 1024);
1035 #elif defined(linux)
1036 sprintf(string, "/proc/%d/stat", pid);
1037 if ((fp = fopen(string, "r")) == NULL)
1039 fgets(buf, sizeof(buf), fp);
1041 for (i = 0; i < 23; ++i) { /* skip 23 fields */
1046 long_return = atoi(cp) * (getpagesize() / 1024); /* rss */
1048 #elif defined(cygwin)
1050 DWORD n = lowproc.dwProcessId;
1052 OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
1054 PROCESS_MEMORY_COUNTERS pmc;
1057 if (myGetProcessMemoryInfo
1058 && myGetProcessMemoryInfo(h, &pmc, sizeof pmc))
1059 long_return = pmc.WorkingSetSize / 1024;
1061 snmp_log(LOG_INFO, "no process times for %lu (%lu)\n",
1067 snmp_log(LOG_INFO, "no process handle for %lu (%lu)\n",
1076 long_return = 16 * 1024; /* XXX - 16M! */
1078 return (u_char *) & long_return;
1080 DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrswrun\n",
1087 /*********************
1089 * Internal implementation functions
1091 *********************/
1095 DIR *procdir = NULL;
1096 struct dirent *procentry_p;
1101 if (procdir != NULL)
1103 procdir = opendir("/proc");
1107 Get_Next_HR_SWRun(void)
1110 procentry_p = readdir(procdir);
1112 if (procentry_p == NULL)
1115 pid = atoi(procentry_p->d_name);
1117 return (Get_Next_HR_SWRun());
1129 #elif defined(cygwin)
1131 static pid_t curpid;
1136 cygwin_internal(CW_LOCK_PINFO, 1000);
1141 Get_Next_HR_SWRun(void)
1144 (struct external_pinfo *) cygwin_internal(query,
1145 curpid | CW_NEXTPID);
1147 curpid = curproc->pid;
1157 cygwin_internal(CW_UNLOCK_PINFO);
1160 #elif defined(dynix)
1169 Get_Next_HR_SWRun(void)
1171 getprpsinfo_t *select = 0;
1173 DEBUGMSGTL(("host/hr_swrun::GetNextHR_SWRun",
1174 "nextproc == %d... &nextproc = %u\n", nextproc,
1176 if ((nextproc = getprpsinfo(nextproc, select, &mypsinfo)) < 0) {
1179 DEBUGMSGTL(("host/hr_swrun::GetNextHR_SWRun",
1180 "getprpsinfo returned %d\n", nextproc));
1181 return mypsinfo.pr_pid;
1190 * just a stub... because it's declared
1202 static time_t iwhen = 0;
1207 current_proc_entry = 0;
1212 #if defined(hpux10) || defined(hpux11)
1213 pstat_getdynamic(&pst_dyn, sizeof(struct pst_dynamic), 1, 0);
1214 nproc = pst_dyn.psd_activeprocs;
1215 bytes = nproc * sizeof(struct pst_status);
1217 (struct pst_status *) realloc(proc_table, bytes)) == NULL) {
1218 current_proc_entry = nproc + 1;
1221 pstat_getproc(proc_table, sizeof(struct pst_status), nproc, 0);
1223 #elif defined(solaris2)
1224 if (!getKstatInt("unix", "system_misc", "nproc", &nproc)) {
1225 current_proc_entry = nproc + 1;
1228 bytes = nproc * sizeof(int);
1229 if ((proc_table = (int *) realloc(proc_table, bytes)) == NULL) {
1230 current_proc_entry = nproc + 1;
1236 #if _SLASH_PROC_METHOD_ == 0
1238 current_proc_entry = nproc + 1;
1242 f = opendir("/proc");
1243 current_proc_entry = 0;
1244 while ((dp = readdir(f)) != NULL && current_proc_entry < nproc)
1245 if (dp->d_name[0] != '.')
1246 proc_table[current_proc_entry++] = atoi(dp->d_name);
1249 #elif HAVE_KVM_GETPROCS
1255 proc_table = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc);
1259 current_proc_entry = 1;
1263 if (auto_nlist(NPROC_SYMBOL, (char *) &nproc, sizeof(int)) == 0) {
1264 snmp_log_perror("Init_HR_SWRun-auto_nlist NPROC");
1268 bytes = nproc * sizeof(struct proc);
1271 free((char *) proc_table);
1272 if ((proc_table = (struct proc *) malloc(bytes)) == NULL) {
1274 snmp_log_perror("Init_HR_SWRun-malloc");
1279 int proc_table_base;
1281 (PROC_SYMBOL, (char *) &proc_table_base,
1282 sizeof(proc_table_base)) == 0) {
1284 snmp_log_perror("Init_HR_SWRun-auto_nlist PROC");
1287 if (klookup(proc_table_base, (char *) proc_table, bytes) == 0) {
1289 snmp_log_perror("Init_HR_SWRun-klookup");
1294 current_proc_entry = 0;
1298 Get_Next_HR_SWRun(void)
1300 while (current_proc_entry < nproc) {
1301 #if defined(hpux10) || defined(hpux11)
1302 return proc_table[current_proc_entry++].pst_pid;
1303 #elif defined(solaris2)
1304 return proc_table[current_proc_entry++];
1305 #elif HAVE_KVM_GETPROCS
1306 if (proc_table[current_proc_entry].kp_proc.p_stat != 0)
1307 return proc_table[current_proc_entry++].kp_proc.p_pid;
1309 if (proc_table[current_proc_entry].p_stat != 0)
1310 return proc_table[current_proc_entry++].p_pid;
1312 ++current_proc_entry;
1322 current_proc_entry = nproc + 1;
1327 count_processes(void)
1329 #if !(defined(linux) || defined(cygwin)) || defined(hpux10) || defined(hpux11) || defined(solaris2) || HAVE_KVM_GETPROCS
1335 #if defined(hpux10) || defined(hpux11) || HAVE_KVM_GETPROCS || defined(solaris2)
1338 #if !defined(linux) && !defined(cygwin) && !defined(dynix)
1339 for (i = 0; i < nproc; ++i) {
1340 if (proc_table[i].p_stat != 0)
1342 while (Get_Next_HR_SWRun() != -1) {
1346 #endif /* !hpux10 && !hpux11 && !HAVE_KVM_GETPROCS && !solaris2 */