X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fprocesses.c;h=f029a6c2bff53ef621cbb053c058b3a4bedd157f;hb=028a9dfa0c77ebf3c9219cf38facede3b03a1ebb;hp=efc64d0125af349a115bdd3c9b2bbcae7f8f30d4;hpb=ff9e11ade5cfabf32c63fb19fc76cbbc4186bc5b;p=collectd.git diff --git a/src/processes.c b/src/processes.c index efc64d01..f029a6c2 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 @@ -360,29 +366,25 @@ static int ps_list_match (const char *name, const char *cmdline, procstat_t *ps) return (0); } /* int ps_list_match */ -static void ps_update_counter ( - _Bool init, - derive_t *group_counter, - derive_t *curr_counter, unsigned long *curr_value, - derive_t new_counter, unsigned long new_value) { - if (init) - { - *curr_value = new_value; - *curr_counter += new_value; - *group_counter += new_value; - return; - } - - if (new_counter < *curr_counter) - { - *curr_value = new_counter + (ULONG_MAX - *curr_counter); - } - else - { - *curr_value = new_counter - *curr_counter; - } - *curr_counter = new_counter; - *group_counter += *curr_value; +static void ps_update_counter (_Bool init, derive_t *group_counter, + derive_t *curr_counter, unsigned long *curr_value, + derive_t new_counter, unsigned long new_value) +{ + if (init) + { + *curr_value = new_value; + *curr_counter += new_value; + *group_counter += new_value; + return; + } + + if (new_counter < *curr_counter) + *curr_value = new_counter + (ULONG_MAX - *curr_counter); + else + *curr_value = new_counter - *curr_counter; + + *curr_counter = new_counter; + *group_counter += *curr_value; } /* add process entry to 'instances' of process 'name' (or refresh it) */ @@ -396,7 +398,7 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t for (ps = list_head_g; ps != NULL; ps = ps->next) { - _Bool want_init; + _Bool want_init; if ((ps_list_match (name, cmdline, ps)) == 0) continue; @@ -538,6 +540,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 +566,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) @@ -861,8 +878,8 @@ static procstat_t *ps_read_tasks_status (long pid, procstat_t *ps) if (fclose (fh)) { char errbuf[1024]; - WARNING ("processes: fclose: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); + WARNING ("processes: fclose: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); } } closedir (dh); @@ -1038,13 +1055,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 +1107,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 +1231,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; }