X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fprocesses.c;h=5bacd5bd5e3d6b40e3bd39cb91f5c84e95bda4c3;hb=edd9af8a874ebc9f2a7f02846807229a648917db;hp=d759cb7f181858f49e03db298aa620c1a179382f;hpb=8e7d3325c0cf19237f361eb7e74989d62c01938f;p=collectd.git diff --git a/src/processes.c b/src/processes.c index d759cb7f..5bacd5bd 100644 --- a/src/processes.c +++ b/src/processes.c @@ -128,7 +128,13 @@ # undef SAVE_FOB_64 #endif +# include # include + +#ifndef MAXCOMLEN +# define MAXCOMLEN 16 +#endif + /* #endif KERNEL_SOLARIS */ #else @@ -538,6 +544,12 @@ static int ps_config (oconfig_item_t *ci) { int i; +#if KERNEL_LINUX + const size_t max_procname_len = 15; +#elif KERNEL_SOLARIS || KERNEL_FREEBSD + const size_t max_procname_len = MAXCOMLEN -1; +#endif + for (i = 0; i < ci->children_num; ++i) { oconfig_item_t *c = ci->children + i; @@ -558,6 +570,15 @@ static int ps_config (oconfig_item_t *ci) c->children_num, c->values[0].value.string); } +#if KERNEL_LINUX || KERNEL_SOLARIS || KERNEL_FREEBSD + if (strlen (c->values[0].value.string) > max_procname_len) { + WARNING ("processes plugin: this platform has a %zu character limit " + "to process names. The `Process \"%s\"' option will " + "not work as expected.", + max_procname_len, c->values[0].value.string); + } +#endif + ps_list_register (c->values[0].value.string, NULL); } else if (strcasecmp (c->key, "ProcessMatch") == 0) @@ -1038,13 +1059,11 @@ static int ps_read_process (long pid, procstat_t *ps, char *state) * strchr(3) and strrchr(3) to avoid pointer arithmetic which would * otherwise be required to determine name_len. */ name_start_pos = 0; - while ((buffer[name_start_pos] != '(') - && (name_start_pos < buffer_len)) + while (name_start_pos < buffer_len && buffer[name_start_pos] != '(') name_start_pos++; name_end_pos = buffer_len; - while ((buffer[name_end_pos] != ')') - && (name_end_pos > 0)) + while (name_end_pos > 0 && buffer[name_end_pos] != ')') name_end_pos--; /* Either '(' or ')' is not found or they are in the wrong order. @@ -1092,7 +1111,7 @@ static int ps_read_process (long pid, procstat_t *ps, char *state) ps->vmem_code = -1; DEBUG("ps_read_process: did not get vmem data for pid %li", pid); } - if (ps->num_lwp <= 0) + if (ps->num_lwp == 0) ps->num_lwp = 1; ps->num_proc = 1; } @@ -1216,7 +1235,7 @@ static char *ps_get_cmdline (long pid, char *name, char *buf, size_t buf_len) buf_ptr += status; len -= status; - if (len <= 0) + if (len == 0) break; } @@ -1364,6 +1383,10 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) ps->num_proc = 0; ps->num_lwp = 0; *state = (char) 'Z'; + + sfree(myStatus); + sfree(myInfo); + sfree(myUsage); return (0); } else { ps->num_proc = 1;