summaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorosmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2005-11-04 13:39:28 +0000
committerosmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2005-11-04 13:39:28 +0000
commit767a660b678ce311394f1832ec1d3b9d6385ea44 (patch)
tree62fa7b171f4ac792e7e5568489189942f5baa87b /src/libs
parent680843025efeb838ddbf758031c2c58fa60db436 (diff)
downloadzabbix-767a660b678ce311394f1832ec1d3b9d6385ea44.tar.gz
zabbix-767a660b678ce311394f1832ec1d3b9d6385ea44.tar.xz
zabbix-767a660b678ce311394f1832ec1d3b9d6385ea44.zip
- added support 'proc.mem' for openbsd (Eugene)
git-svn-id: svn://svn.zabbix.com/trunk@2274 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/zbxsysinfo/openbsd/proc.c358
1 files changed, 137 insertions, 221 deletions
diff --git a/src/libs/zbxsysinfo/openbsd/proc.c b/src/libs/zbxsysinfo/openbsd/proc.c
index 1dcaea89..d69d4031 100644
--- a/src/libs/zbxsysinfo/openbsd/proc.c
+++ b/src/libs/zbxsysinfo/openbsd/proc.c
@@ -29,43 +29,39 @@
int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
-#if defined(HAVE_PROC_1_STATUS)
-
- DIR *dir;
- struct dirent *entries;
- struct stat buf;
- char filename[MAX_STRING_LEN];
- char line[MAX_STRING_LEN];
-
- char name1[MAX_STRING_LEN];
- char name2[MAX_STRING_LEN];
-
- char procname[MAX_STRING_LEN];
- char usrname[MAX_STRING_LEN];
- char mode[MAX_STRING_LEN];
+ struct kinfo_proc *proc;
+
+ char procname[MAX_STRING_LEN];
+ char usrname[MAX_STRING_LEN];
+ char mode[MAX_STRING_LEN];
- int proc_ok = 0;
- int usr_ok = 0;
- int do_task = DO_SUM;
+ int proc_ok = 0;
+ int usr_ok = 0;
+ int do_task = DO_SUM;
- struct passwd *usrinfo = NULL;
- long long int llvalue = 0;
+ struct passwd *usrinfo = NULL;
- FILE *f;
+ kvm_t *kp;
- double memsize = -1;
- int proccount = 0;
+ double value = 0.0;
+ double memsize = -1.0;
+
+ int proccount = 0;
+ int count;
+ int i;
+ int ret = SYSINFO_RET_FAIL;
assert(result);
clean_result(result);
+
if(num_param(param) > 3)
{
return SYSINFO_RET_FAIL;
}
-
+
if(get_param(param, 1, procname, MAX_STRING_LEN) != 0)
{
return SYSINFO_RET_FAIL;
@@ -77,211 +73,131 @@ int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RE
}
else
{
- if(usrname[0] != 0)
- {
- usrinfo = getpwnam(usrname);
- if(usrinfo == NULL)
- {
- /* incorrect user name */
- return SYSINFO_RET_FAIL;
- }
- }
- }
-
- if(get_param(param, 3, mode, MAX_STRING_LEN) != 0)
- {
- mode[0] = '\0';
- }
-
- if(mode[0] == '\0')
- {
- strscpy(mode, "sum");
- }
-
- if(strcmp(mode,"avg") == 0)
- {
- do_task = DO_AVG;
- }
- else if(strcmp(mode,"max") == 0)
- {
- do_task = DO_MAX;
- }
- else if(strcmp(mode,"min") == 0)
- {
- do_task = DO_MIN;
- }
- else if(strcmp(mode,"sum") == 0)
- {
- do_task = DO_SUM;
- }
- else
- {
- return SYSINFO_RET_FAIL;
- }
-
- dir=opendir("/proc");
- if(NULL == dir)
- {
- return SYSINFO_RET_FAIL;
- }
-
- while((entries=readdir(dir))!=NULL)
- {
- proc_ok = 0;
- usr_ok = 0;
-
- strscpy(filename,"/proc/");
- strncat(filename,entries->d_name,MAX_STRING_LEN);
- strncat(filename,"/status",MAX_STRING_LEN);
-
- /* Self is a symbolic link. It leads to incorrect results for proc_cnt[zabbix_agentd] */
- /* Better approach: check if /proc/x/ is symbolic link */
- if(strncmp(entries->d_name,"self",MAX_STRING_LEN) == 0)
- {
- continue;
- }
-
- if(stat(filename,&buf)==0)
- {
- f=fopen(filename,"r");
- if(f==NULL)
- {
- continue;
- }
-
- if(procname[0] != 0)
+ if(usrname[0] != 0)
{
- fgets(line,MAX_STRING_LEN,f);
- if(sscanf(line,"%s\t%s\n",name1,name2)==2)
- {
- if(strcmp(name1,"Name:") == 0)
- {
- if(strcmp(procname,name2)==0)
- {
- proc_ok = 1;
- }
- }
- }
-
- if(proc_ok == 0)
+ usrinfo = getpwnam(usrname);
+ if(usrinfo == NULL)
{
- fclose(f);
- continue;
- }
- }
- else
- {
- proc_ok = 1;
- }
-
- if(usrinfo != NULL)
- {
- while(fgets(line, MAX_STRING_LEN, f) != NULL)
- {
-
- if(sscanf(line, "%s\t%lli\n", name1, &llvalue) != 2)
- {
- continue;
- }
-
- if(strcmp(name1,"Uid:") != 0)
- {
- continue;
- }
-
- if(usrinfo->pw_uid == (uid_t)(llvalue))
- {
- usr_ok = 1;
- break;
- }
- }
- }
- else
- {
- usr_ok = 1;
- }
-
- if(proc_ok && usr_ok)
- {
- while(fgets(line, MAX_STRING_LEN, f) != NULL)
- {
-
- if(sscanf(line, "%s\t%lli %s\n", name1, &llvalue, name2) != 3)
- {
- continue;
- }
-
- if(strcmp(name1,"VmSize:") != 0)
- {
- continue;
- }
-
- proccount++;
-
- if(strcasecmp(name2, "kB") == 0)
- {
- llvalue <<= 10;
- }
- else if(strcasecmp(name2, "mB") == 0)
- {
- llvalue <<= 20;
- }
- else if(strcasecmp(name2, "GB") == 0)
- {
- llvalue <<= 30;
- }
- else if(strcasecmp(name2, "TB") == 0)
- {
- llvalue <<= 40;
- }
-
- if(memsize < 0)
- {
- memsize = (double) llvalue;
- }
- else
- {
- if(do_task == DO_MAX)
- {
- memsize = MAX(memsize, (double) llvalue);
- }
- else if(do_task == DO_MIN)
- {
- memsize = MIN(memsize, (double) llvalue);
- }
- else
- {
- memsize += (double) llvalue;
- }
- }
-
- break;
- }
+ /* incorrect user name */
+ return SYSINFO_RET_FAIL;
+ }
}
-
-
- fclose(f);
}
- }
- closedir(dir);
- if(memsize < 0)
- {
- /* incorrect process name */
- memsize = 0;
- }
+ if(get_param(param, 3, mode, MAX_STRING_LEN) != 0)
+ {
+ mode[0] = '\0';
+ }
+
+ if(mode[0] == '\0')
+ {
+ strscpy(mode, "sum");
+ }
+
+ if(strcmp(mode,"avg") == 0)
+ {
+ do_task = DO_AVG;
+ }
+ else if(strcmp(mode,"max") == 0)
+ {
+ do_task = DO_MAX;
+ }
+ else if(strcmp(mode,"min") == 0)
+ {
+ do_task = DO_MIN;
+ }
+ else if(strcmp(mode,"sum") == 0)
+ {
+ do_task = DO_SUM;
+ }
+ else
+ {
+ return SYSINFO_RET_FAIL;
+ }
+
+
+ kp = kvm_open(NULL,NULL,NULL,O_RDONLY,NULL);
+ if(kp)
+ {
+ proc = kvm_getprocs(kp, KERN_PROC_ALL, 0, &count);
+ if (proc)
+ {
+ for (i = 0; i < count; i++)
+ {
+ proc_ok = 0;
+ usr_ok = 0;
+
+ if(procname[0] != 0)
+ {
+ if(strcmp(procname, proc[i].kp_proc.p_comm)==0)
+ {
+ proc_ok = 1;
+ }
+ }
+ else
+ {
+ proc_ok = 1;
+ }
+
+ if(usrinfo != NULL)
+ {
+ if(usrinfo->pw_uid == proc[i].kp_proc.p_cred->p_ruid)
+ {
+ usr_ok = 1;
+ }
+ }
+ else
+ {
+ usr_ok = 1;
+ }
+
+ if(proc_ok && usr_ok)
+ {
+ proccount++;
+
+ value = proc[i].kp_proc.p_vmspace->vm_tsize
+ + proc[i].kp_proc.p_vmspace->vm_dsize
+ + proc[i].kp_proc.p_vmspace->vm_ssize;
+
+ if(memsize < 0)
+ {
+ memsize = value;
+ }
+ else
+ {
+ if(do_task == DO_MAX)
+ {
+ memsize = MAX(memsize, value);
+ }
+ else if(do_task == DO_MIN)
+ {
+ memsize = MIN(memsize, value);
+ }
+ else
+ {
+ memsize += value;
+ }
+ }
+ }
+
+ kvm_close(kp);
+
+ if(memsize < 0)
+ {
+ /* incorrect process name */
+ memsize = 0;
+ }
- if(do_task == DO_AVG)
- {
- memsize /= (double)proccount;
- }
+ if(do_task == DO_AVG)
+ {
+ memsize /= (double)proccount;
+ }
- result->type |= AR_DOUBLE;
- result->dbl = memsize;
- return SYSINFO_RET_OK;
-#else
- return SYSINFO_RET_FAIL;
-#endif
+ result->type |= AR_DOUBLE;
+ result->dbl = memsize;
+ ret = SYSINFO_RET_OK;
+ }
+ return ret;
}
int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)