📄 hr_swrun.c
字号:
DEBUGMSG(("host/hr_swrun","\n")); return LowPid;} /********************* * * System specific implementation functions * *********************/u_char *var_hrswrun(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ int pid=0; static char string[256];#ifdef HAVE_SYS_PSTAT_H struct pst_status proc_buf;#elif defined(solaris2)#if _SLASH_PROC_METHOD_ static psinfo_t psinfo; static psinfo_t *proc_buf; int procfd; char procfn[sizeof "/proc/00000/psinfo"];#else static struct proc *proc_buf; char *cp1;#endif /* _SLASH_PROC_METHOD_ */ static time_t when = 0; time_t now; static int oldpid = -1;#endif#if HAVE_KVM_GETPROCS char **argv;#endif#ifdef linux FILE *fp; char buf[256]; int i;#endif char *cp; if ( vp->magic == HRSWRUN_OSINDEX ) { if (header_hrswrun(vp, name, length, exact, var_len, write_method) == MATCH_FAILED ) return NULL; } else { pid = header_hrswrunEntry(vp, name, length, exact, var_len, write_method); if ( pid == MATCH_FAILED ) return NULL; }#ifdef HAVE_SYS_PSTAT_H if (pstat_getproc( &proc_buf, sizeof(struct pst_status), 0, pid ) == -1) return NULL;#elif defined(solaris2) time(&now); if (pid == oldpid) { if (now != when) oldpid = -1; } if (oldpid != pid || proc_buf == NULL) {#if _SLASH_PROC_METHOD_ proc_buf = &psinfo; sprintf(procfn, "/proc/%.5d/psinfo", pid); if ((procfd = open(procfn, O_RDONLY)) != -1) { if (read(procfd, proc_buf, sizeof(*proc_buf)) != sizeof(*proc_buf)) abort(); close(procfd); } else proc_buf = NULL;#else if (kd == NULL) return NULL; if ((proc_buf = kvm_getproc(kd, pid)) == NULL) return NULL;#endif oldpid = pid; when = now; }#endif switch (vp->magic){ case HRSWRUN_OSINDEX:#if NO_DUMMY_VALUES return NULL;#else long_return = 1; /* Probably! */ return (u_char *)&long_return;#endif case HRSWRUN_INDEX: long_return = pid; return (u_char *)&long_return; case HRSWRUN_NAME:#ifdef HAVE_SYS_PSTAT_H sprintf(string, "%s", proc_buf.pst_cmd); cp = strchr( string, ' '); if ( cp != NULL ) *cp = '\0';#elif defined(dynix) sprintf(string, "%s", lowpsinfo.pr_fname); cp = strchr( string, ' '); if ( cp != NULL ) *cp = '\0';#elif defined(solaris2)#if _SLASH_PROC_METHOD_ if (proc_buf) strcpy(string, proc_buf->pr_fname); else strcpy(string, "<exited>");#else strcpy(string, proc_buf->p_user.u_comm);#endif#elif HAVE_KVM_GETPROCS strcpy(string, proc_table[LowProcIndex].kp_proc.p_comm);#elif defined(linux) sprintf( string, "/proc/%d/status", pid ); if ((fp = fopen( string, "r")) == NULL) return NULL; fgets( buf, sizeof(buf), fp ); /* Name: process name */ cp = buf; while ( *cp != ':' ) ++cp; ++cp; while ( isspace( *cp )) ++cp; strcpy( string, cp ); fclose(fp);#elif defined(cygwin) if (lowproc.process_state & (PID_ZOMBIE | PID_EXITED)) strcpy(string, "<defunct>"); else if (lowproc.ppid) { cygwin_conv_to_posix_path(lowproc.progname, string); cp = strrchr(string, '/'); if (cp) strcpy(string, cp+1); } else if (query == CW_GETPINFO_FULL) { DWORD n = lowproc.dwProcessId & 0xffff; HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, n); if (h) { HMODULE hm[1000]; if (!myEnumProcessModules(h, hm, sizeof hm, &n)) { snmp_log(LOG_DEBUG, "no module handle for %lu\n", n); n = 0; } if (n && myGetModuleFileNameEx(h, hm[0], string, sizeof string)) { cp = strrchr(string, '\\'); if (cp) strcpy(string, cp+1); } else strcpy(string, "*** unknown"); CloseHandle(h); } else { snmp_log(LOG_INFO, "no process handle for %lu\n", n); strcpy(string, "** unknown"); } } else strcpy(string, "* unknown"); cp = strchr(string, '\0') - 4; if (cp > string && strcasecmp(cp, ".exe") == 0) *cp = '\0';#else#if NO_DUMMY_VALUES return NULL;#endif sprintf(string, "process name");#endif *var_len = strlen(string); /* remove trailing newline */ if (*var_len) { cp = string + *var_len -1; if (*cp == '\n') --(*var_len); } return (u_char *) string; case HRSWRUN_ID: *var_len = nullOidLen; return (u_char *) nullOid; case HRSWRUN_PATH:#ifdef HAVE_SYS_PSTAT_H /* Path not available - use argv[0] */ sprintf(string, "%s", proc_buf.pst_cmd); cp = strchr( string, ' '); if ( cp != NULL ) *cp = '\0';#elif defined(dynix) /* Path not available - use argv[0] */ sprintf(string, "%s", lowpsinfo.pr_psargs); cp = strchr( string, ' '); if ( cp != NULL ) *cp = '\0';#elif defined(solaris2)#ifdef _SLASH_PROC_METHOD_ if (proc_buf) strcpy(string, proc_buf->pr_psargs); else sprintf(string, "<exited>"); cp = strchr(string, ' '); if (cp) *cp = 0;#else cp = proc_buf->p_user.u_psargs; cp1 = string; while (*cp && *cp != ' ') *cp1++ = *cp++; *cp1 = 0;#endif#elif HAVE_KVM_GETPROCS strcpy(string, proc_table[LowProcIndex].kp_proc.p_comm);#elif defined(linux) sprintf( string, "/proc/%d/cmdline", pid ); if ((fp = fopen( string, "r")) == NULL) return NULL; if (fgets( buf, sizeof(buf)-1, fp )) /* argv[0] '\0' argv[1] '\0' .... */ strcpy( string, buf ); else { /* swapped out - no cmdline */ fclose(fp); sprintf( string, "/proc/%d/status", pid ); if ((fp = fopen( string, "r")) == NULL) return NULL; fgets( buf, sizeof(buf), fp ); /* Name: process name */ cp = strchr(buf, ':'); ++cp; while ( isspace( *cp )) ++cp; strcpy( string, cp ); cp = strchr(string, '\n'); if (cp) *cp = 0; } fclose(fp);#elif defined(cygwin) if (lowproc.process_state & (PID_ZOMBIE | PID_EXITED)) strcpy(string, "<defunct>"); else if (lowproc.ppid) cygwin_conv_to_posix_path(lowproc.progname, string); else if (query == CW_GETPINFO_FULL) { DWORD n = lowproc.dwProcessId & 0xFFFF; HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, n); if (h) { HMODULE hm[1000]; if (!myEnumProcessModules(h, hm, sizeof hm, &n)) n = 0; if (!n || !myGetModuleFileNameEx(h, hm[0], string, sizeof string)) strcpy(string, "*** unknown"); CloseHandle(h); } else strcpy(string, "** unknown"); } else strcpy(string, "* unknown");#else#if NO_DUMMY_VALUES return NULL;#endif sprintf(string, "/bin/wombat");#endif *var_len = strlen(string); return (u_char *) string; case HRSWRUN_PARAMS:#ifdef HAVE_SYS_PSTAT_H cp = strchr( proc_buf.pst_cmd, ' '); if ( cp != NULL ) { cp++; snprintf(string, HRSWRUN_PARAMS_MAX, "%s", cp); } else string[0] = '\0';#elif defined(dynix) cp = strchr( lowpsinfo.pr_psargs, ' '); if ( cp != NULL ) { cp++; snprintf(string, HRSWRUN_PARAMS_MAX, "%s", cp); } else string[0] = '\0';#elif defined(solaris2)#ifdef _SLASH_PROC_METHOD_ if (proc_buf) { cp = strchr(proc_buf->pr_psargs, ' '); if (cp) strncpy(string, cp+1, HRSWRUN_PARAMS_MAX); else string[0] = 0; } else string[0] = 0;#else cp = proc_buf->p_user.u_psargs; while (*cp && *cp != ' ') cp++; if (*cp == ' ') cp++; strncpy (string, cp, HRSWRUN_PARAMS_MAX);#endif#elif HAVE_KVM_GETPROCS string[0] = 0; argv = kvm_getargv(kd, proc_table+LowProcIndex, sizeof(string)); if (argv) argv++; while (argv && *argv) { int len = strlen(string); if (string[0] != 0) strcat(string, " "); strncpy(string+len, *argv, HRSWRUN_PARAMS_MAX-len); string[127] = 0; argv++; }#elif defined(linux) sprintf( string, "/proc/%d/cmdline", pid ); if ((fp = fopen( string, "r")) == NULL) return NULL; memset( buf, 0, sizeof(buf) ); /* argv[0] '\0' argv[1] '\0' .... */ if(!fgets( buf, sizeof(buf)-2, fp )) { /* maybe be empty (even argv[0] is missing) */ string[0] = '\0'; *var_len = 0; fclose(fp); return string; } /* Skip over argv[0] */ cp = buf; while ( *cp ) ++cp; ++cp; /* Now join together separate arguments. */ while ( 1 ) { while ( *cp ) ++cp; if ( *(cp+1) == '\0' ) break; /* '\0''\0' => End of command line */ *cp = ' '; } cp = buf; while ( *cp ) ++cp; ++cp; strncpy( string, cp, HRSWRUN_PARAMS_MAX ); fclose(fp);#elif defined(cygwin) string[0] = 0;#else#if NO_DUMMY_VALUES return NULL;#endif sprintf(string, "-h -q -v");#endif string[HRSWRUN_PARAMS_MAX] = 0; *var_len = strlen(string); return (u_char *) string; case HRSWRUN_TYPE:#ifdef PID_MAXSYS if ( pid < PID_MAXSYS ) long_return = 2; /* operatingSystem */ else#endif long_return = 4; /* application */ return (u_char *)&long_return; case HRSWRUN_STATUS:#if defined(cygwin) if (lowproc.process_state & PID_STOPPED) long_return = 3; /* notRunnable */ else if (lowproc.process_state & PID_ZOMBIE) long_return = 4; /* invalid */ else long_return = 1; /* running */#elif !defined(linux)#if defined(hpux10) || defined(hpux11) switch ( proc_table[LowProcIndex].pst_stat ) { case PS_STOP: long_return = 3; /* notRunnable */ break; case PS_SLEEP: long_return = 2; /* runnable */ break; case PS_RUN: long_return = 1; /* running */ break; case PS_ZOMBIE: case PS_IDLE: case PS_OTHER: default: long_return = 4; /* invalid */ break; }#else#if HAVE_KVM_GETPROCS switch ( proc_table[LowProcIndex].kp_proc.p_stat ) {#elif defined(dynix) switch ( lowpsinfo.pr_state ) {#elif defined(solaris2)#if _SLASH_PROC_METHOD_ switch (proc_buf ? proc_buf->pr_lwp.pr_state : SIDL) {#else switch ( proc_buf->p_stat ) {#endif#else switch ( proc_table[LowProcIndex].p_stat ) {#endif case SSTOP: long_return = 3; /* notRunnable */ break; case 0:#ifdef SSWAP case SSWAP:#endif#ifdef SSLEEP case SSLEEP:#endif#ifdef SWAIT case SWAIT:#endif long_return = 2; /* runnable */ break;#ifdef SACTIVE case SACTIVE:#endif#ifdef SRUN case SRUN:#endif#ifdef SONPROC case SONPROC:#endif long_return = 1; /* running */ break; case SIDL: case SZOMB: default: long_return = 4; /* invalid */ break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -