diff options
author | sasha <sasha@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2008-08-06 10:50:54 +0000 |
---|---|---|
committer | sasha <sasha@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2008-08-06 10:50:54 +0000 |
commit | 4b307ca6b94c1ba582ce31961e053d6927a564e6 (patch) | |
tree | c454cdebb16c4b80d754ad8037abb9cb489727c7 /src/libs/zbxsysinfo | |
parent | ad1a369bf8eea09ea538004977728308ecdbea01 (diff) | |
download | zabbix-4b307ca6b94c1ba582ce31961e053d6927a564e6.tar.gz zabbix-4b307ca6b94c1ba582ce31961e053d6927a564e6.tar.xz zabbix-4b307ca6b94c1ba582ce31961e053d6927a564e6.zip |
- [DEV-168] More supported items
FreeBSD: proc.num[], proc.mem[]
git-svn-id: svn://svn.zabbix.com/trunk@5879 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src/libs/zbxsysinfo')
-rw-r--r-- | src/libs/zbxsysinfo/freebsd/proc.c | 190 |
1 files changed, 129 insertions, 61 deletions
diff --git a/src/libs/zbxsysinfo/freebsd/proc.c b/src/libs/zbxsysinfo/freebsd/proc.c index 616c5e42..93f2cdc4 100644 --- a/src/libs/zbxsysinfo/freebsd/proc.c +++ b/src/libs/zbxsysinfo/freebsd/proc.c @@ -31,47 +31,77 @@ #define ZBX_PROC_STAT_RUN 1 #define ZBX_PROC_STAT_SLEEP 2 #define ZBX_PROC_STAT_ZOMB 3 - + static kvm_t *kd = NULL; -static char *proc_argv(struct kinfo_proc *proc) +static char *get_commandline(struct kinfo_proc *proc) { - static struct pargs pa; - size_t sz, s; - static char *argv = NULL; - static size_t argv_alloc = 0; + struct pargs pa; + size_t sz; + char *p; + static char *args = NULL; + static int args_alloc = 128; + + if (NULL == kd) + return NULL; sz = sizeof(pa); - if (sz == kvm_read(kd, (unsigned long)proc->ki_args, &pa, sz)) { - if (NULL == argv || argv_alloc < pa.ar_length) { - argv_alloc = pa.ar_length; - if (NULL == argv) - argv = zbx_malloc(argv, argv_alloc); - else - argv = zbx_realloc(argv, argv_alloc); - } - sz = pa.ar_length; - if (sz == kvm_read(kd, (unsigned long)proc->ki_args + sizeof(pa.ar_ref) + sizeof(pa.ar_length), argv, sz)) { - for (s = 0; s < sz - 1; s++) - if (argv[s] == '\0') - argv[s] = ' '; - return argv; - } + if (kvm_read(kd, (unsigned long)proc->ki_args, &pa, sz) != sz) + return NULL; + + if (NULL == args) + args = zbx_malloc(args, args_alloc); + + if (args_alloc < pa.ar_length) + { + args_alloc = pa.ar_length; + args = zbx_realloc(args, args_alloc); } - return NULL; + if (pa.ar_length != kvm_read(kd, (unsigned long)proc->ki_args + + sizeof(pa.ar_ref) + sizeof(pa.ar_length), args, pa.ar_length)) + return NULL; + + p = args; + sz = 1; /* do not change last '\0' */ + + do { + if (*p == '\0') + *p = ' '; + p++; + } while (++sz < pa.ar_length); + + return args; } +static void init_kernel_access() +{ + static int already = 0; + + if (1 == already) + return; + + kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL); + + already = 1; +} + +/* + * proc.mem[<process_name><,user_name><,mode><,command_line>] + * <mode> : *sum, avg, max, min + * + * Tested: FreeBSD 7.0 + */ + int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { char procname[MAX_STRING_LEN], buffer[MAX_STRING_LEN], - proccomm[MAX_STRING_LEN], - *args; - int do_task, count, i, + proccomm[MAX_STRING_LEN], *args; + int do_task, pagesize, count, i, proc_ok, comm_ok, - op, arg; + mib[4], mibs; double value = 0.0, memsize = 0; @@ -79,20 +109,22 @@ int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RE size_t sz; - struct kinfo_proc *proc, *pproc; + struct kinfo_proc *proc = NULL; struct passwd *usrinfo; assert(result); init_result(result); + init_kernel_access(); + if (num_param(param) > 4) return SYSINFO_RET_FAIL; if (0 != get_param(param, 1, procname, sizeof(procname))) *procname = '\0'; - else if (strlen(procname) > MAXCOMLEN) - procname[MAXCOMLEN] = '\0'; + else if (strlen(procname) > COMMLEN) + procname[COMMLEN] = '\0'; if (0 != get_param(param, 2, buffer, sizeof(buffer))) *buffer = '\0'; @@ -124,37 +156,53 @@ int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RE if (0 != get_param(param, 4, proccomm, sizeof(proccomm))) *proccomm = '\0'; - if (NULL == kd && NULL == (kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL))) + if (*proccomm != '\0' && kd == NULL) return SYSINFO_RET_FAIL; + pagesize = getpagesize(); + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; if (NULL != usrinfo) { - op = KERN_PROC_UID; - arg = (int)usrinfo->pw_uid; + mib[2] = KERN_PROC_UID; + mib[3] = usrinfo->pw_uid; + mibs = 4; } else { - op = KERN_PROC_ALL; - arg = 0; + mib[2] = KERN_PROC_ALL; + mib[3] = 0; + mibs = 3; } - if (NULL == (proc = kvm_getprocs(kd, op, arg, &count))) + sz = 0; + if (0 != sysctl(mib, mibs, NULL, &sz, NULL, 0)) return SYSINFO_RET_FAIL; - for (pproc = proc, i = 0; i < count; pproc++, i++) { + proc = (struct kinfo_proc *)zbx_malloc(proc, sz); + if (0 != sysctl(mib, mibs, proc, &sz, NULL, 0)) { + zbx_free(proc); + return SYSINFO_RET_FAIL; + } + + count = sz / sizeof(struct kinfo_proc); + + for (i = 0; i < count; i++) { proc_ok = 0; comm_ok = 0; - - if (*procname == '\0' || 0 == strcmp(procname, pproc->ki_comm)) + if (*procname == '\0' || 0 == strcmp(procname, proc[i].ki_comm)) proc_ok = 1; if (*proccomm != '\0') { - if (NULL != (args = proc_argv(pproc))) { - if (NULL != zbx_regexp_match(args, proccomm, NULL)) + if (NULL != (args = get_commandline(&proc[i]))) + if (zbx_regexp_match(args, proccomm, NULL) != NULL) comm_ok = 1; - } } else comm_ok = 1; if (proc_ok && comm_ok) { - value = pproc->ki_size; + value = proc[i].ki_tsize + + proc[i].ki_dsize + + proc[i].ki_ssize; + value *= pagesize; if (0 == proccount++) memsize = value; @@ -179,34 +227,42 @@ int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RE return SYSINFO_RET_OK; } +/* + * proc.num[<process_name><,user_name><,state><,command_line>] + * <state> : *all, sleep, zomb, run + * + * Tested: FreeBSD 7.0 + */ + int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { char procname[MAX_STRING_LEN], buffer[MAX_STRING_LEN], - proccomm[MAX_STRING_LEN], - *args; + proccomm[MAX_STRING_LEN], *args; int zbx_proc_stat, count, i, proc_ok, stat_ok, comm_ok, - op, arg; + mib[4], mibs; int proccount = 0; size_t sz; - struct kinfo_proc *proc, *pproc; + struct kinfo_proc *proc = NULL; struct passwd *usrinfo; assert(result); init_result(result); + init_kernel_access(); + if (num_param(param) > 4) return SYSINFO_RET_FAIL; if (0 != get_param(param, 1, procname, sizeof(procname))) *procname = '\0'; - else if (strlen(procname) > MAXCOMLEN) - procname[MAXCOMLEN] = '\0'; + else if (strlen(procname) > COMMLEN) + procname[COMMLEN] = '\0'; if (0 != get_param(param, 2, buffer, sizeof(buffer))) *buffer = '\0'; @@ -238,40 +294,53 @@ int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *r if (0 != get_param(param, 4, proccomm, sizeof(proccomm))) *proccomm = '\0'; - if (NULL == kd && NULL == (kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open"))) + if (*proccomm != '\0' && kd == NULL) return SYSINFO_RET_FAIL; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; if (NULL != usrinfo) { - op = KERN_PROC_UID; - arg = (int)usrinfo->pw_uid; + mib[2] = KERN_PROC_UID; + mib[3] = usrinfo->pw_uid; + mibs = 4; } else { - op = KERN_PROC_ALL; - arg = 0; + mib[2] = KERN_PROC_ALL; + mib[3] = 0; + mibs = 3; } - if (NULL == (proc = kvm_getprocs(kd, op, arg, &count))) + sz = 0; + if (0 != sysctl(mib, mibs, NULL, &sz, NULL, 0)) + return SYSINFO_RET_FAIL; + + proc = (struct kinfo_proc *)zbx_malloc(proc, sz); + if (0 != sysctl(mib, mibs, proc, &sz, NULL, 0)) { + zbx_free(proc); return SYSINFO_RET_FAIL; + } - for (pproc = proc, i = 0; i < count; pproc++, i++) { + count = sz / sizeof(struct kinfo_proc); + + for (i = 0; i < count; i++) { proc_ok = 0; stat_ok = 0; comm_ok = 0; - if (*procname == '\0' || 0 == strcmp(procname, pproc->ki_comm)) + if (*procname == '\0' || 0 == strcmp(procname, proc[i].ki_comm)) proc_ok = 1; if (zbx_proc_stat != ZBX_PROC_STAT_ALL) { switch (zbx_proc_stat) { case ZBX_PROC_STAT_RUN: - if (pproc->ki_stat == SRUN) + if (proc[i].ki_stat == SRUN) stat_ok = 1; break; case ZBX_PROC_STAT_SLEEP: - if (pproc->ki_stat == SSLEEP) + if (proc[i].ki_stat == SSLEEP) stat_ok = 1; break; case ZBX_PROC_STAT_ZOMB: - if (pproc->ki_stat == SZOMB) + if (proc[i].ki_stat == SZOMB) stat_ok = 1; break; } @@ -279,10 +348,9 @@ int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *r stat_ok = 1; if (*proccomm != '\0') { - if (NULL != (args = proc_argv(pproc))) { + if (NULL != (args = get_commandline(&proc[i]))) if (zbx_regexp_match(args, proccomm, NULL) != NULL) comm_ok = 1; - } } else comm_ok = 1; |