diff options
author | osmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2005-11-04 13:39:28 +0000 |
---|---|---|
committer | osmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2005-11-04 13:39:28 +0000 |
commit | 767a660b678ce311394f1832ec1d3b9d6385ea44 (patch) | |
tree | 62fa7b171f4ac792e7e5568489189942f5baa87b /src/libs | |
parent | 680843025efeb838ddbf758031c2c58fa60db436 (diff) | |
download | zabbix-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.c | 358 |
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) |