int main(int ac, char **av, char **env) { t_all all; char *str; char **mav; int check; int l; all.hist = NULL; check = (init_main(ac, av, &all.lenv, &str)); all.cd.previous = NULL; environ_copy(&all.lenv, env); init_caps(&all.caps, env); while (check != -1) { manwhile(&str, &l, &all.lenv, &check); str = (char *)get_commandline(&all.caps, l, end_hist(all.hist)); my_history(&all.hist, str); write(1, "\n", 1); if (str[my_strlen(str)] == '\0') if (before_manif(&str, &mav) != 0) if (mav[0]) check = big_manif(mav, &all.path, &all.lenv, &all.cd); } finish_main(&all.lenv); free_list_history(all.hist); return (1); }
int PROC_MEM(AGENT_REQUEST *request, AGENT_RESULT *result) { #define ZBX_SIZE 1 #define ZBX_RSS 2 #define ZBX_VSIZE 3 #define ZBX_PMEM 4 #define ZBX_TSIZE 5 #define ZBX_DSIZE 6 #define ZBX_SSIZE 7 char *procname, *proccomm, *param, *args, *mem_type = NULL; int do_task, pagesize, count, i, proccount = 0, invalid_user = 0, mem_type_code, mib[4]; unsigned int mibs; zbx_uint64_t mem_size = 0, byte_value = 0; double pct_size = 0.0, pct_value = 0.0; #if (__FreeBSD_version) < 500000 int mem_pages; #else unsigned long mem_pages; #endif size_t sz; struct kinfo_proc *proc = NULL; struct passwd *usrinfo; if (5 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } procname = get_rparam(request, 0); param = get_rparam(request, 1); if (NULL != param && '\0' != *param) { errno = 0; if (NULL == (usrinfo = getpwnam(param))) { if (0 != errno) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain user information: %s", zbx_strerror(errno))); return SYSINFO_RET_FAIL; } invalid_user = 1; } } else usrinfo = NULL; param = get_rparam(request, 2); if (NULL == param || '\0' == *param || 0 == strcmp(param, "sum")) do_task = ZBX_DO_SUM; else if (0 == strcmp(param, "avg")) do_task = ZBX_DO_AVG; else if (0 == strcmp(param, "max")) do_task = ZBX_DO_MAX; else if (0 == strcmp(param, "min")) do_task = ZBX_DO_MIN; else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid third parameter.")); return SYSINFO_RET_FAIL; } proccomm = get_rparam(request, 3); mem_type = get_rparam(request, 4); if (NULL == mem_type || '\0' == *mem_type || 0 == strcmp(mem_type, "size")) { mem_type_code = ZBX_SIZE; /* size of process (code + data + stack) */ } else if (0 == strcmp(mem_type, "rss")) { mem_type_code = ZBX_RSS; /* resident set size */ } else if (0 == strcmp(mem_type, "vsize")) { mem_type_code = ZBX_VSIZE; /* virtual size */ } else if (0 == strcmp(mem_type, "pmem")) { mem_type_code = ZBX_PMEM; /* percentage of real memory used by process */ } else if (0 == strcmp(mem_type, "tsize")) { mem_type_code = ZBX_TSIZE; /* text size */ } else if (0 == strcmp(mem_type, "dsize")) { mem_type_code = ZBX_DSIZE; /* data size */ } else if (0 == strcmp(mem_type, "ssize")) { mem_type_code = ZBX_SSIZE; /* stack size */ } else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid fifth parameter.")); return SYSINFO_RET_FAIL; } if (1 == invalid_user) /* handle 0 for non-existent user after all parameters have been parsed and validated */ goto out; pagesize = getpagesize(); mib[0] = CTL_KERN; mib[1] = KERN_PROC; if (NULL != usrinfo) { mib[2] = KERN_PROC_UID; mib[3] = usrinfo->pw_uid; mibs = 4; } else { #if (__FreeBSD_version) < 500000 mib[2] = KERN_PROC_ALL; #else mib[2] = KERN_PROC_PROC; #endif mib[3] = 0; mibs = 3; } if (ZBX_PMEM == mem_type_code) { sz = sizeof(mem_pages); if (0 != sysctlbyname("hw.availpages", &mem_pages, &sz, NULL, (size_t)0)) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain number of physical pages: %s", zbx_strerror(errno))); return SYSINFO_RET_FAIL; } } sz = 0; if (0 != sysctl(mib, mibs, NULL, &sz, NULL, (size_t)0)) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain necessary buffer size from system: %s", zbx_strerror(errno))); return SYSINFO_RET_FAIL; } proc = (struct kinfo_proc *)zbx_malloc(proc, sz); if (0 != sysctl(mib, mibs, proc, &sz, NULL, (size_t)0)) { zbx_free(proc); SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain process information: %s", zbx_strerror(errno))); return SYSINFO_RET_FAIL; } count = sz / sizeof(struct kinfo_proc); for (i = 0; i < count; i++) { if (NULL != procname && '\0' != *procname && 0 != strcmp(procname, proc[i].ZBX_PROC_COMM)) continue; if (NULL != proccomm && '\0' != *proccomm) { if (NULL == (args = get_commandline(&proc[i]))) continue; if (NULL == zbx_regexp_match(args, proccomm, NULL)) continue; } switch (mem_type_code) { case ZBX_SIZE: byte_value = (proc[i].ZBX_PROC_TSIZE + proc[i].ZBX_PROC_DSIZE + proc[i].ZBX_PROC_SSIZE) * pagesize; break; case ZBX_RSS: byte_value = proc[i].ZBX_PROC_RSSIZE * pagesize; break; case ZBX_VSIZE: byte_value = proc[i].ZBX_PROC_VSIZE; break; case ZBX_PMEM: if (0 != (proc[i].ZBX_PROC_FLAG & ZBX_PROC_MASK)) #if (__FreeBSD_version) < 500000 pct_value = ((float)(proc[i].ZBX_PROC_RSSIZE + UPAGES) / mem_pages) * 100.0; #else pct_value = ((float)proc[i].ZBX_PROC_RSSIZE / mem_pages) * 100.0; #endif else pct_value = 0.0; break; case ZBX_TSIZE: byte_value = proc[i].ZBX_PROC_TSIZE * pagesize; break; case ZBX_DSIZE: byte_value = proc[i].ZBX_PROC_DSIZE * pagesize; break; case ZBX_SSIZE: byte_value = proc[i].ZBX_PROC_SSIZE * pagesize; break; } if (ZBX_PMEM != mem_type_code) { if (0 != proccount++) { if (ZBX_DO_MAX == do_task) mem_size = MAX(mem_size, byte_value); else if (ZBX_DO_MIN == do_task) mem_size = MIN(mem_size, byte_value); else mem_size += byte_value; } else mem_size = byte_value; } else { if (0 != proccount++) { if (ZBX_DO_MAX == do_task) pct_size = MAX(pct_size, pct_value); else if (ZBX_DO_MIN == do_task) pct_size = MIN(pct_size, pct_value); else pct_size += pct_value; } else pct_size = pct_value; } }
int PROC_MEM(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, pagesize, count, i, proc_ok, comm_ok, mib[4], mibs; double value = 0.0, memsize = 0; int proccount = 0; size_t sz; struct kinfo_proc *proc = NULL; struct passwd *usrinfo; if (num_param(param) > 4) return SYSINFO_RET_FAIL; if (0 != get_param(param, 1, procname, sizeof(procname))) *procname = '\0'; else if (strlen(procname) > ZBX_COMMLEN) procname[ZBX_COMMLEN] = '\0'; if (0 != get_param(param, 2, buffer, sizeof(buffer))) *buffer = '\0'; if (*buffer != '\0') { usrinfo = getpwnam(buffer); if (usrinfo == NULL) /* incorrect user name */ return SYSINFO_RET_FAIL; } else usrinfo = NULL; if (0 != get_param(param, 3, buffer, sizeof(buffer))) *buffer = '\0'; if (*buffer != '\0') { if (0 == strcmp(buffer, "avg")) do_task = DO_AVG; else if (0 == strcmp(buffer, "max")) do_task = DO_MAX; else if (0 == strcmp(buffer, "min")) do_task = DO_MIN; else if (0 == strcmp(buffer, "sum")) do_task = DO_SUM; else return SYSINFO_RET_FAIL; } else do_task = DO_SUM; if (0 != get_param(param, 4, proccomm, sizeof(proccomm))) *proccomm = '\0'; pagesize = getpagesize(); mib[0] = CTL_KERN; mib[1] = KERN_PROC; if (NULL != usrinfo) { mib[2] = KERN_PROC_UID; mib[3] = usrinfo->pw_uid; mibs = 4; } else { mib[2] = KERN_PROC_ALL; mib[3] = 0; mibs = 3; } 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; } count = sz / sizeof(struct kinfo_proc); for (i = 0; i < count; i++) { #if(__FreeBSD_version > 500000) if (proc[i].ki_flag & P_KTHREAD) /* skip a system thread */ continue; #endif proc_ok = 0; comm_ok = 0; if (*procname == '\0' || 0 == strcmp(procname, proc[i].ZBX_PROC_COMM)) proc_ok = 1; if (*proccomm != '\0') { 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 = proc[i].ZBX_PROC_TSIZE + proc[i].ZBX_PROC_DSIZE + proc[i].ZBX_PROC_SSIZE; value *= pagesize; if (0 == proccount++) 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; } } } zbx_free(proc); if (do_task == DO_AVG) SET_DBL_RESULT(result, proccount == 0 ? 0 : memsize/proccount); else SET_UI64_RESULT(result, memsize); return SYSINFO_RET_OK; }
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; int zbx_proc_stat, count, i, proc_ok, stat_ok, comm_ok, mib[4], mibs; int proccount = 0; size_t sz; struct kinfo_proc *proc = NULL; struct passwd *usrinfo; if (num_param(param) > 4) return SYSINFO_RET_FAIL; if (0 != get_param(param, 1, procname, sizeof(procname))) *procname = '\0'; else if (strlen(procname) > ZBX_COMMLEN) procname[ZBX_COMMLEN] = '\0'; if (0 != get_param(param, 2, buffer, sizeof(buffer))) *buffer = '\0'; if (*buffer != '\0') { usrinfo = getpwnam(buffer); if (usrinfo == NULL) /* incorrect user name */ return SYSINFO_RET_FAIL; } else usrinfo = NULL; if (0 != get_param(param, 3, buffer, sizeof(buffer))) *buffer = '\0'; if (*buffer != '\0') { if (0 == strcmp(buffer, "run")) zbx_proc_stat = ZBX_PROC_STAT_RUN; else if (0 == strcmp(buffer, "sleep")) zbx_proc_stat = ZBX_PROC_STAT_SLEEP; else if (0 == strcmp(buffer, "zomb")) zbx_proc_stat = ZBX_PROC_STAT_ZOMB; else if (0 == strcmp(buffer, "all")) zbx_proc_stat = ZBX_PROC_STAT_ALL; else return SYSINFO_RET_FAIL; } else zbx_proc_stat = ZBX_PROC_STAT_ALL; if (0 != get_param(param, 4, proccomm, sizeof(proccomm))) *proccomm = '\0'; mib[0] = CTL_KERN; mib[1] = KERN_PROC; if (NULL != usrinfo) { mib[2] = KERN_PROC_UID; mib[3] = usrinfo->pw_uid; mibs = 4; } else { mib[2] = KERN_PROC_ALL; mib[3] = 0; mibs = 3; } 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; } count = sz / sizeof(struct kinfo_proc); for (i = 0; i < count; i++) { #if(__FreeBSD_version > 500000) if (proc[i].ki_flag & P_KTHREAD) /* skip a system thread */ continue; #endif proc_ok = 0; stat_ok = 0; comm_ok = 0; if (*procname == '\0' || 0 == strcmp(procname, proc[i].ZBX_PROC_COMM)) proc_ok = 1; if (zbx_proc_stat != ZBX_PROC_STAT_ALL) { switch (zbx_proc_stat) { case ZBX_PROC_STAT_RUN: if (proc[i].ZBX_PROC_STAT == SRUN) stat_ok = 1; break; case ZBX_PROC_STAT_SLEEP: if (proc[i].ZBX_PROC_STAT == SSLEEP) stat_ok = 1; break; case ZBX_PROC_STAT_ZOMB: if (proc[i].ZBX_PROC_STAT == SZOMB) stat_ok = 1; break; } } else stat_ok = 1; if (*proccomm != '\0') { 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 && stat_ok && comm_ok) proccount++; } zbx_free(proc); SET_UI64_RESULT(result, proccount); return SYSINFO_RET_OK; }
int PROC_MEM(AGENT_REQUEST *request, AGENT_RESULT *result) { char *procname, *proccomm, *param, *args; int do_task, pagesize, count, i, proc_ok, comm_ok, mib[4], mibs; double value, memsize = 0; int proccount = 0; size_t sz; struct kinfo_proc *proc = NULL; struct passwd *usrinfo; if (4 < request->nparam) return SYSINFO_RET_FAIL; procname = get_rparam(request, 0); param = get_rparam(request, 1); if (NULL != param && '\0' != *param) { if (NULL == (usrinfo = getpwnam(param))) /* incorrect user name */ return SYSINFO_RET_FAIL; } else usrinfo = NULL; param = get_rparam(request, 2); if (NULL == param || '\0' == *param || 0 == strcmp(param, "sum")) do_task = DO_SUM; else if (0 == strcmp(param, "avg")) do_task = DO_AVG; else if (0 == strcmp(param, "max")) do_task = DO_MAX; else if (0 == strcmp(param, "min")) do_task = DO_MIN; else return SYSINFO_RET_FAIL; proccomm = get_rparam(request, 3); pagesize = getpagesize(); mib[0] = CTL_KERN; mib[1] = KERN_PROC; if (NULL != usrinfo) { mib[2] = KERN_PROC_UID; mib[3] = usrinfo->pw_uid; mibs = 4; } else { #if(__FreeBSD_version > 500000) mib[2] = KERN_PROC_PROC; #else mib[2] = KERN_PROC_ALL; #endif mib[3] = 0; mibs = 3; } 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; } count = sz / sizeof(struct kinfo_proc); for (i = 0; i < count; i++) { proc_ok = 0; comm_ok = 0; if (NULL == procname || '\0' == *procname || 0 == strcmp(procname, proc[i].ZBX_PROC_COMM)) proc_ok = 1; if (NULL != proccomm && '\0' != *proccomm) { if (NULL != (args = get_commandline(&proc[i]))) if (NULL != zbx_regexp_match(args, proccomm, NULL)) comm_ok = 1; } else comm_ok = 1; if (proc_ok && comm_ok) { value = proc[i].ZBX_PROC_TSIZE + proc[i].ZBX_PROC_DSIZE + proc[i].ZBX_PROC_SSIZE; value *= pagesize; if (0 == proccount++) 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; } } } zbx_free(proc); if (do_task == DO_AVG) SET_DBL_RESULT(result, proccount == 0 ? 0 : memsize/proccount); else SET_UI64_RESULT(result, memsize); return SYSINFO_RET_OK; }
int PROC_NUM(AGENT_REQUEST *request, AGENT_RESULT *result) { char *procname, *proccomm, *param, *args; int zbx_proc_stat, count, i, proc_ok, stat_ok, comm_ok, mib[4], mibs; int proccount = 0; size_t sz; struct kinfo_proc *proc = NULL; struct passwd *usrinfo; if (4 < request->nparam) return SYSINFO_RET_FAIL; procname = get_rparam(request, 0); param = get_rparam(request, 1); if (NULL != param && '\0' != *param) { if (NULL == (usrinfo = getpwnam(param))) /* incorrect user name */ return SYSINFO_RET_FAIL; } else usrinfo = NULL; param = get_rparam(request, 2); if (NULL == param || '\0' == *param || 0 == strcmp(param, "all")) zbx_proc_stat = ZBX_PROC_STAT_ALL; else if (0 == strcmp(param, "run")) zbx_proc_stat = ZBX_PROC_STAT_RUN; else if (0 == strcmp(param, "sleep")) zbx_proc_stat = ZBX_PROC_STAT_SLEEP; else if (0 == strcmp(param, "zomb")) zbx_proc_stat = ZBX_PROC_STAT_ZOMB; else return SYSINFO_RET_FAIL; proccomm = get_rparam(request, 3); mib[0] = CTL_KERN; mib[1] = KERN_PROC; if (NULL != usrinfo) { mib[2] = KERN_PROC_UID; mib[3] = usrinfo->pw_uid; mibs = 4; } else { #if(__FreeBSD_version > 500000) mib[2] = KERN_PROC_PROC; #else mib[2] = KERN_PROC_ALL; #endif mib[3] = 0; mibs = 3; } 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; } count = sz / sizeof(struct kinfo_proc); for (i = 0; i < count; i++) { proc_ok = 0; stat_ok = 0; comm_ok = 0; if (NULL == procname || '\0' == *procname || 0 == strcmp(procname, proc[i].ZBX_PROC_COMM)) proc_ok = 1; if (zbx_proc_stat != ZBX_PROC_STAT_ALL) { switch (zbx_proc_stat) { case ZBX_PROC_STAT_RUN: if (proc[i].ZBX_PROC_STAT == SRUN) stat_ok = 1; break; case ZBX_PROC_STAT_SLEEP: if (proc[i].ZBX_PROC_STAT == SSLEEP) stat_ok = 1; break; case ZBX_PROC_STAT_ZOMB: if (proc[i].ZBX_PROC_STAT == SZOMB) stat_ok = 1; break; } } else stat_ok = 1; if (NULL != proccomm && '\0' != *proccomm) { if (NULL != (args = get_commandline(&proc[i]))) if (NULL != zbx_regexp_match(args, proccomm, NULL)) comm_ok = 1; } else comm_ok = 1; if (proc_ok && stat_ok && comm_ok) proccount++; } zbx_free(proc); SET_UI64_RESULT(result, proccount); return SYSINFO_RET_OK; }