summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsasha <sasha@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2008-08-06 10:50:54 +0000
committersasha <sasha@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2008-08-06 10:50:54 +0000
commit4b307ca6b94c1ba582ce31961e053d6927a564e6 (patch)
treec454cdebb16c4b80d754ad8037abb9cb489727c7
parentad1a369bf8eea09ea538004977728308ecdbea01 (diff)
downloadzabbix-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
-rw-r--r--src/libs/zbxsysinfo/freebsd/proc.c190
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;