summaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorosmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2005-11-04 12:20:41 +0000
committerosmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2005-11-04 12:20:41 +0000
commitede3aacf530535f7663b5b8daa691f08aea176c5 (patch)
tree911a8ad30fa2126b114d3fd988b30e0a65fef63b /src/libs
parentfe983de869b773807b40060e7a08e4a7259765c1 (diff)
downloadzabbix-ede3aacf530535f7663b5b8daa691f08aea176c5.tar.gz
zabbix-ede3aacf530535f7663b5b8daa691f08aea176c5.tar.xz
zabbix-ede3aacf530535f7663b5b8daa691f08aea176c5.zip
- added support proc.num for openbsd (Eugene)
git-svn-id: svn://svn.zabbix.com/trunk@2270 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/zbxsysinfo/openbsd/openbsd.c2
-rw-r--r--src/libs/zbxsysinfo/openbsd/proc.c203
-rw-r--r--src/libs/zbxsysinfo/openbsd/swap.c8
3 files changed, 73 insertions, 140 deletions
diff --git a/src/libs/zbxsysinfo/openbsd/openbsd.c b/src/libs/zbxsysinfo/openbsd/openbsd.c
index ebfb28e7..6f39793e 100644
--- a/src/libs/zbxsysinfo/openbsd/openbsd.c
+++ b/src/libs/zbxsysinfo/openbsd/openbsd.c
@@ -55,7 +55,7 @@ ZBX_METRIC parameters_specific[]=
{"kern[maxfiles]", 0, 0, 0, 0},
{"kern[maxproc]", 0, 0, 0, 0},
*/
- {"memory", CF_USEUPARAM, OLD_MEMORY, 0, "buffers"},
+ {"memory", CF_USEUPARAM, OLD_MEMORY, 0, "total"},
/*
{"memory[buffers]", 0, 0, 0, 0},
{"memory[cached]", 0, 0, 0, 0},
diff --git a/src/libs/zbxsysinfo/openbsd/proc.c b/src/libs/zbxsysinfo/openbsd/proc.c
index 5153605c..f5e9fce6 100644
--- a/src/libs/zbxsysinfo/openbsd/proc.c
+++ b/src/libs/zbxsysinfo/openbsd/proc.c
@@ -286,29 +286,21 @@ int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RE
int PROC_NUM(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 procstat[MAX_STRING_LEN];
+ char procname[MAX_STRING_LEN];
+ char usrname[MAX_STRING_LEN];
+ char procstat[MAX_STRING_LEN];
- int proc_ok = 0;
- int usr_ok = 0;
- int stat_ok = 0;
+ char p_stat = 0;;
+
+ int proc_ok = 0;
+ int usr_ok = 0;
+ int stat_ok = 0;
- struct passwd *usrinfo = NULL;
- long int lvalue = 0;
+ struct passwd *usrinfo = NULL;
- FILE *f;
+ kvm_t *kp;
+
int proccount = 0;
assert(result);
@@ -355,15 +347,15 @@ int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESUL
if(strcmp(procstat,"run") == 0)
{
- strscpy(procstat,"R");
+ p_stat = SRUN;
}
else if(strcmp(procstat,"sleep") == 0)
{
- strscpy(procstat,"S");
+ p_stat = SSLEEP;
}
else if(strcmp(procstat,"zomb") == 0)
{
- strscpy(procstat,"Z");
+ p_stat = SZOMB;
}
else if(strcmp(procstat,"all") == 0)
{
@@ -380,124 +372,65 @@ int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESUL
return SYSINFO_RET_FAIL;
}
- while((entries=readdir(dir))!=NULL)
- {
- proc_ok = 0;
- stat_ok = 0;
- usr_ok = 0;
-
-/* 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;
- }
-
- strscpy(filename,"/proc/");
- strncat(filename,entries->d_name,MAX_STRING_LEN);
- strncat(filename,"/status",MAX_STRING_LEN);
-
- if(stat(filename,&buf)==0)
- {
- f=fopen(filename,"r");
- if(f==NULL)
- {
- continue;
- }
-
- if(procname[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)
- {
- fclose(f);
- continue;
- }
- }
- else
- {
- proc_ok = 1;
- }
-
- if(procstat[0] != 0)
- {
- while(fgets(line, MAX_STRING_LEN, f) != NULL)
- {
-
- if(sscanf(line, "%s\t%s\n", name1, name2) != 2)
- {
- continue;
- }
-
- if(strcmp(name1,"State:") != 0)
- {
- continue;
- }
-
- if(strcmp(name2, procstat))
- {
- stat_ok = 1;
- break;
- }
- }
- }
- else
- {
- stat_ok = 1;
- }
+ kp = kvm_open(NULL,NULL,NULL,O_RDONLY,NULL);
+ if(kp)
+ {
+ proc = kvm_getproc2(kp,KERN_PROC_ALL,0,sizeof(struct kinfo_proc2),&count);
+ if (proc)
+ {
+ for (i = 0; i < count; i++)
+ {
+ proc_ok = 0;
+ stat_ok = 0;
+ usr_ok = 0;
- if(usrinfo != NULL)
- {
- while(fgets(line, MAX_STRING_LEN, f) != NULL)
- {
-
- if(sscanf(line, "%s\t%li\n", name1, &lvalue) != 2)
- {
- continue;
- }
-
- if(strcmp(name1,"Uid:") != 0)
- {
- continue;
- }
-
- if(usrinfo->pw_uid == (uid_t)(lvalue))
- {
- usr_ok = 1;
- break;
- }
- }
- }
- else
- {
- usr_ok = 1;
- }
+ if(procname[0] != 0)
+ {
+ if(strcmp(procname, kp_proc[i].proc.p_comm)==0)
+ {
+ proc_ok = 1;
+ }
+ }
+ else
+ {
+ proc_ok = 1;
+ }
+
+ if(procstat[0] != 0)
+ {
+ if(p_stat == kp_proc[i].proc.p_stat
+ || (kp_proc[i].proc.p_stat == SDEAD && p_stat == SZOMB))
+ {
+ stat_ok = 1;
+ }
+ }
+ else
+ {
+ stat_ok = 1;
+ }
- if(proc_ok && stat_ok && usr_ok)
- {
- proccount++;
- }
+ if(usrinfo != NULL)
+ {
+ if(usrinfo->pw_uid == kp_proc[i].proc.p_cred->p_ruid)
+ {
+ usr_ok = 1;
+ }
+ }
+ else
+ {
+ usr_ok = 1;
+ }
- fclose(f);
- }
- }
- closedir(dir);
+ if(proc_ok && stat_ok && usr_ok)
+ {
+ proccount++;
+ }
+ }
+ }
+ }
result->type |= AR_DOUBLE;
result->dbl = (double) proccount;
return SYSINFO_RET_OK;
-#else
- return SYSINFO_RET_FAIL;
-#endif
}
+
diff --git a/src/libs/zbxsysinfo/openbsd/swap.c b/src/libs/zbxsysinfo/openbsd/swap.c
index eccdcd39..d2c68cde 100644
--- a/src/libs/zbxsysinfo/openbsd/swap.c
+++ b/src/libs/zbxsysinfo/openbsd/swap.c
@@ -218,22 +218,22 @@ int get_swap_io(double *swapin, double *pgswapin, double *swapout, double *pgswa
if(swapin)
{
/* int swapins; swapins */
- (*swapin) += (double) vm.swapins;
+ (*swapin) = (double) vm.swapins;
}
if(pgswapin)
{
/* int pgswapin; pages swapped in */
- (*pgswapin) += (double) vm.pgswapin;
+ (*pgswapin) = (double) vm.pgswapin;
}
if(swapout)
{
/* int swapouts; swapouts */
- (*swapout) += (double) vm.swapouts;
+ (*swapout) = (double) vm.swapouts;
}
if(pgswapout)
{
/* int pgswapout; pages swapped out */
- (*pgswapout) += (double) vm.pgswapout;
+ (*pgswapout) = (double) vm.pgswapout;
}
return SYSINFO_RET_OK;