X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fprocesses.c;h=0513a156a999d4330ca63599b176abc31b68682d;hb=5523a080010dcb7a61dc0dccc3969a2a048e52f9;hp=fac4778487f3fb0820925433c04267fbb5ee4e5b;hpb=4d6ff066b1c60a8e6654e4c74370ef951f37b5f3;p=collectd.git diff --git a/src/processes.c b/src/processes.c index fac47784..0513a156 100644 --- a/src/processes.c +++ b/src/processes.c @@ -35,9 +35,9 @@ **/ #include "collectd.h" + #include "common.h" #include "plugin.h" -#include "configfile.h" /* Include header files for the mach system, if they exist.. */ #if HAVE_THREAD_INFO @@ -128,7 +128,13 @@ # undef SAVE_FOB_64 #endif +# include # include + +#ifndef MAXCOMLEN +# define MAXCOMLEN 16 +#endif + /* #endif KERNEL_SOLARIS */ #else @@ -262,20 +268,19 @@ static void ps_list_register (const char *name, const char *regexp) procstat_t *ptr; int status; - new = (procstat_t *) malloc (sizeof (procstat_t)); + new = calloc (1, sizeof (*new)); if (new == NULL) { - ERROR ("processes plugin: ps_list_register: malloc failed."); + ERROR ("processes plugin: ps_list_register: calloc failed."); return; } - memset (new, 0, sizeof (procstat_t)); sstrncpy (new->name, name, sizeof (new->name)); #if HAVE_REGEX_H if (regexp != NULL) { DEBUG ("ProcessMatch: adding \"%s\" as criteria to process %s.", regexp, name); - new->re = (regex_t *) malloc (sizeof (regex_t)); + new->re = malloc (sizeof (*new->re)); if (new->re == NULL) { ERROR ("processes plugin: ps_list_register: malloc failed."); @@ -314,7 +319,9 @@ static void ps_list_register (const char *name, const char *regexp) "`ProcessMatch' with the same name. " "All but the first setting will be " "ignored."); +#if HAVE_REGEX_H sfree (new->re); +#endif sfree (new); return; } @@ -359,17 +366,39 @@ 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; +} + /* add process entry to 'instances' of process 'name' (or refresh it) */ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t *entry) { - procstat_t *ps; procstat_entry_t *pse; if (entry->id == 0) return; - for (ps = list_head_g; ps != NULL; ps = ps->next) + for (procstat_t *ps = list_head_g; ps != NULL; ps = ps->next) { + _Bool want_init; + if ((ps_list_match (name, cmdline, ps)) == 0) continue; @@ -381,10 +410,9 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t { procstat_entry_t *new; - new = (procstat_entry_t *) malloc (sizeof (procstat_entry_t)); + new = calloc (1, sizeof (*new)); if (new == NULL) return; - memset (new, 0, sizeof (procstat_entry_t)); new->id = entry->id; if (pse == NULL) @@ -426,90 +454,37 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t ps->cswitch_vol += ((pse->cswitch_vol == -1)?0:pse->cswitch_vol); ps->cswitch_invol += ((pse->cswitch_invol == -1)?0:pse->cswitch_invol); - if ((entry->vmem_minflt_counter == 0) - && (entry->vmem_majflt_counter == 0)) - { - pse->vmem_minflt_counter += entry->vmem_minflt; - pse->vmem_minflt = entry->vmem_minflt; - - pse->vmem_majflt_counter += entry->vmem_majflt; - pse->vmem_majflt = entry->vmem_majflt; - } - else - { - if (entry->vmem_minflt_counter < pse->vmem_minflt_counter) - { - pse->vmem_minflt = entry->vmem_minflt_counter - + (ULONG_MAX - pse->vmem_minflt_counter); - } - else - { - pse->vmem_minflt = entry->vmem_minflt_counter - pse->vmem_minflt_counter; - } - pse->vmem_minflt_counter = entry->vmem_minflt_counter; - - if (entry->vmem_majflt_counter < pse->vmem_majflt_counter) - { - pse->vmem_majflt = entry->vmem_majflt_counter - + (ULONG_MAX - pse->vmem_majflt_counter); - } - else - { - pse->vmem_majflt = entry->vmem_majflt_counter - pse->vmem_majflt_counter; - } - pse->vmem_majflt_counter = entry->vmem_majflt_counter; - } - - ps->vmem_minflt_counter += pse->vmem_minflt; - ps->vmem_majflt_counter += pse->vmem_majflt; - - if ((entry->cpu_user_counter == 0) - && (entry->cpu_system_counter == 0)) - { - pse->cpu_user_counter += entry->cpu_user; - pse->cpu_user = entry->cpu_user; - - pse->cpu_system_counter += entry->cpu_system; - pse->cpu_system = entry->cpu_system; - } - else - { - if (entry->cpu_user_counter < pse->cpu_user_counter) - { - pse->cpu_user = entry->cpu_user_counter - + (ULONG_MAX - pse->cpu_user_counter); - } - else - { - pse->cpu_user = entry->cpu_user_counter - pse->cpu_user_counter; - } - pse->cpu_user_counter = entry->cpu_user_counter; - - if (entry->cpu_system_counter < pse->cpu_system_counter) - { - pse->cpu_system = entry->cpu_system_counter - + (ULONG_MAX - pse->cpu_system_counter); - } - else - { - pse->cpu_system = entry->cpu_system_counter - pse->cpu_system_counter; - } - pse->cpu_system_counter = entry->cpu_system_counter; - } - - ps->cpu_user_counter += pse->cpu_user; - ps->cpu_system_counter += pse->cpu_system; + want_init = (entry->vmem_minflt_counter == 0) + && (entry->vmem_majflt_counter == 0); + ps_update_counter (want_init, + &ps->vmem_minflt_counter, + &pse->vmem_minflt_counter, &pse->vmem_minflt, + entry->vmem_minflt_counter, entry->vmem_minflt); + ps_update_counter (want_init, + &ps->vmem_majflt_counter, + &pse->vmem_majflt_counter, &pse->vmem_majflt, + entry->vmem_majflt_counter, entry->vmem_majflt); + + want_init = (entry->cpu_user_counter == 0) + && (entry->cpu_system_counter == 0); + ps_update_counter (want_init, + &ps->cpu_user_counter, + &pse->cpu_user_counter, &pse->cpu_user, + entry->cpu_user_counter, entry->cpu_user); + ps_update_counter (want_init, + &ps->cpu_system_counter, + &pse->cpu_system_counter, &pse->cpu_system, + entry->cpu_system_counter, entry->cpu_system); } } /* remove old entries from instances of processes in list_head_g */ static void ps_list_reset (void) { - procstat_t *ps; procstat_entry_t *pse; procstat_entry_t *pse_prev; - for (ps = list_head_g; ps != NULL; ps = ps->next) + for (procstat_t *ps = list_head_g; ps != NULL; ps = ps->next) { ps->num_proc = 0; ps->num_lwp = 0; @@ -561,9 +536,13 @@ static void ps_list_reset (void) /* put all pre-defined 'Process' names from config to list_head_g tree */ 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) { + for (int i = 0; i < ci->children_num; ++i) { oconfig_item_t *c = ci->children + i; if (strcasecmp (c->key, "Process") == 0) @@ -583,6 +562,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) @@ -815,7 +803,7 @@ static void ps_submit_fork_rate (derive_t value) /* ------- additional functions for KERNEL_LINUX/HAVE_THREAD_INFO ------- */ #if KERNEL_LINUX -static procstat_t *ps_read_tasks_status (int pid, procstat_t *ps) +static procstat_t *ps_read_tasks_status (long pid, procstat_t *ps) { char dirname[64]; DIR *dh; @@ -828,7 +816,7 @@ static procstat_t *ps_read_tasks_status (int pid, procstat_t *ps) char *fields[8]; int numfields; - ssnprintf (dirname, sizeof (dirname), "/proc/%i/task", pid); + ssnprintf (dirname, sizeof (dirname), "/proc/%li/task", pid); if ((dh = opendir (dirname)) == NULL) { @@ -845,7 +833,7 @@ static procstat_t *ps_read_tasks_status (int pid, procstat_t *ps) tpid = ent->d_name; - ssnprintf (filename, sizeof (filename), "/proc/%i/task/%s/status", pid, tpid); + ssnprintf (filename, sizeof (filename), "/proc/%li/task/%s/status", pid, tpid); if ((fh = fopen (filename, "r")) == NULL) { DEBUG ("Failed to open file `%s'", filename); @@ -886,8 +874,8 @@ static procstat_t *ps_read_tasks_status (int 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); @@ -899,7 +887,7 @@ static procstat_t *ps_read_tasks_status (int pid, procstat_t *ps) } /* int *ps_read_tasks_status */ /* Read data from /proc/pid/status */ -static procstat_t *ps_read_status (int pid, procstat_t *ps) +static procstat_t *ps_read_status (long pid, procstat_t *ps) { FILE *fh; char buffer[1024]; @@ -911,7 +899,7 @@ static procstat_t *ps_read_status (int pid, procstat_t *ps) char *fields[8]; int numfields; - ssnprintf (filename, sizeof (filename), "/proc/%i/status", pid); + ssnprintf (filename, sizeof (filename), "/proc/%li/status", pid); if ((fh = fopen (filename, "r")) == NULL) return (NULL); @@ -969,7 +957,7 @@ static procstat_t *ps_read_status (int pid, procstat_t *ps) return (ps); } /* procstat_t *ps_read_vmem */ -static procstat_t *ps_read_io (int pid, procstat_t *ps) +static procstat_t *ps_read_io (long pid, procstat_t *ps) { FILE *fh; char buffer[1024]; @@ -978,7 +966,7 @@ static procstat_t *ps_read_io (int pid, procstat_t *ps) char *fields[8]; int numfields; - ssnprintf (filename, sizeof (filename), "/proc/%i/io", pid); + ssnprintf (filename, sizeof (filename), "/proc/%li/io", pid); if ((fh = fopen (filename, "r")) == NULL) return (NULL); @@ -1024,7 +1012,7 @@ static procstat_t *ps_read_io (int pid, procstat_t *ps) return (ps); } /* procstat_t *ps_read_io */ -int ps_read_process (int pid, procstat_t *ps, char *state) +static int ps_read_process (long pid, procstat_t *ps, char *state) { char filename[64]; char buffer[1024]; @@ -1049,7 +1037,7 @@ int ps_read_process (int pid, procstat_t *ps, char *state) memset (ps, 0, sizeof (procstat_t)); - ssnprintf (filename, sizeof (filename), "/proc/%i/stat", pid); + ssnprintf (filename, sizeof (filename), "/proc/%li/stat", pid); status = read_file_contents (filename, buffer, sizeof(buffer) - 1); if (status <= 0) @@ -1063,13 +1051,11 @@ int ps_read_process (int 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. @@ -1094,9 +1080,9 @@ int ps_read_process (int pid, procstat_t *ps, char *state) fields_len = strsplit (buffer_ptr, fields, STATIC_ARRAY_SIZE (fields)); if (fields_len < 22) { - DEBUG ("processes plugin: ps_read_process (pid = %i):" + DEBUG ("processes plugin: ps_read_process (pid = %li):" " `%s' has only %i fields..", - (int) pid, filename, fields_len); + pid, filename, fields_len); return (-1); } @@ -1115,9 +1101,9 @@ int ps_read_process (int pid, procstat_t *ps, char *state) /* No VMem data */ ps->vmem_data = -1; ps->vmem_code = -1; - DEBUG("ps_read_process: did not get vmem data for pid %i",pid); + 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; } @@ -1125,7 +1111,7 @@ int ps_read_process (int pid, procstat_t *ps, char *state) /* Leave the rest at zero if this is only a zombi */ if (ps->num_proc == 0) { - DEBUG ("processes plugin: This is only a zombi: pid = %i; " + DEBUG ("processes plugin: This is only a zombie: pid = %li; " "name = %s;", pid, ps->name); return (0); } @@ -1165,7 +1151,7 @@ int ps_read_process (int pid, procstat_t *ps, char *state) ps->io_syscr = -1; ps->io_syscw = -1; - DEBUG("ps_read_process: not get io data for pid %i",pid); + DEBUG("ps_read_process: not get io data for pid %li", pid); } if ( report_ctx_switch ) @@ -1176,7 +1162,7 @@ int ps_read_process (int pid, procstat_t *ps, char *state) ps->cswitch_invol = -1; DEBUG("ps_read_tasks_status: not get context " - "switch data for pid %i",pid); + "switch data for pid %li", pid); } } @@ -1184,7 +1170,7 @@ int ps_read_process (int pid, procstat_t *ps, char *state) return (0); } /* int ps_read_process (...) */ -static char *ps_get_cmdline (pid_t pid, char *name, char *buf, size_t buf_len) +static char *ps_get_cmdline (long pid, char *name, char *buf, size_t buf_len) { char *buf_ptr; size_t len; @@ -1197,8 +1183,7 @@ static char *ps_get_cmdline (pid_t pid, char *name, char *buf, size_t buf_len) if ((pid < 1) || (NULL == buf) || (buf_len < 2)) return NULL; - ssnprintf (file, sizeof (file), "/proc/%u/cmdline", - (unsigned int) pid); + ssnprintf (file, sizeof (file), "/proc/%li/cmdline", pid); errno = 0; fd = open (file, O_RDONLY); @@ -1242,7 +1227,7 @@ static char *ps_get_cmdline (pid_t pid, char *name, char *buf, size_t buf_len) buf_ptr += status; len -= status; - if (len <= 0) + if (len == 0) break; } @@ -1279,7 +1264,7 @@ static char *ps_get_cmdline (pid_t pid, char *name, char *buf, size_t buf_len) return buf; } /* char *ps_get_cmdline (...) */ -static int read_fork_rate () +static int read_fork_rate (void) { FILE *proc_stat; char buffer[1024]; @@ -1326,8 +1311,8 @@ static int read_fork_rate () #endif /*KERNEL_LINUX */ #if KERNEL_SOLARIS -static const char *ps_get_cmdline (long pid, /* {{{ */ - char *buffer, size_t buffer_size) +static char *ps_get_cmdline (long pid, char *name __attribute__((unused)), /* {{{ */ + char *buffer, size_t buffer_size) { char path[PATH_MAX]; psinfo_t info; @@ -1372,18 +1357,15 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) snprintf(f_usage, sizeof (f_usage), "/proc/%li/usage", pid); - buffer = malloc(sizeof (pstatus_t)); - memset(buffer, 0, sizeof (pstatus_t)); + buffer = calloc(1, sizeof (pstatus_t)); read_file_contents(filename, buffer, sizeof (pstatus_t)); myStatus = (pstatus_t *) buffer; - buffer = malloc(sizeof (psinfo_t)); - memset(buffer, 0, sizeof(psinfo_t)); + buffer = calloc(1, sizeof (psinfo_t)); read_file_contents(f_psinfo, buffer, sizeof (psinfo_t)); myInfo = (psinfo_t *) buffer; - buffer = malloc(sizeof (prusage_t)); - memset(buffer, 0, sizeof(prusage_t)); + buffer = calloc(1, sizeof (prusage_t)); read_file_contents(f_usage, buffer, sizeof (prusage_t)); myUsage = (prusage_t *) buffer; @@ -1393,6 +1375,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; @@ -1474,16 +1460,15 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) * are retrieved from kstat (module cpu, name sys, class misc, stat nthreads). * The result is the sum for all the threads created on each cpu */ -static int read_fork_rate() +static int read_fork_rate (void) { extern kstat_ctl_t *kc; - kstat_t *ksp_chain = NULL; derive_t result = 0; if (kc == NULL) return (-1); - for (ksp_chain = kc->kc_chain; + for (kstat_t *ksp_chain = kc->kc_chain; ksp_chain != NULL; ksp_chain = ksp_chain->ks_next) { @@ -1549,17 +1534,14 @@ static int ps_read (void) #if HAVE_THREAD_INFO kern_return_t status; - int pset; processor_set_t port_pset_priv; - int task; task_array_t task_list; mach_msg_type_number_t task_list_len; int task_pid; char task_name[MAXCOMLEN + 1]; - int thread; thread_act_array_t thread_list; mach_msg_type_number_t thread_list_len; thread_basic_info_data_t thread_data; @@ -1584,7 +1566,7 @@ static int ps_read (void) * Tasks are assigned to sets of processors, so that's where you go to * get a list. */ - for (pset = 0; pset < pset_list_len; pset++) + for (mach_msg_type_number_t pset = 0; pset < pset_list_len; pset++) { if ((status = host_processor_set_priv (port_host_self, pset_list[pset], @@ -1605,7 +1587,7 @@ static int ps_read (void) continue; } - for (task = 0; task < task_list_len; task++) + for (mach_msg_type_number_t task = 0; task < task_list_len; task++) { ps = NULL; if (mach_get_task_name (task_list[task], @@ -1703,7 +1685,7 @@ static int ps_read (void) continue; /* with next task_list */ } - for (thread = 0; thread < thread_list_len; thread++) + for (mach_msg_type_number_t thread = 0; thread < thread_list_len; thread++) { thread_data_len = THREAD_BASIC_INFO_COUNT; status = thread_info (thread_list[thread], @@ -1825,7 +1807,7 @@ static int ps_read (void) struct dirent *ent; DIR *proc; - int pid; + long pid; char cmdline[CMDLINE_BUFFER_SIZE]; @@ -1834,8 +1816,6 @@ static int ps_read (void) procstat_entry_t pse; char state; - procstat_t *ps_ptr; - running = sleeping = zombies = stopped = paging = blocked = 0; ps_list_reset (); @@ -1852,7 +1832,7 @@ static int ps_read (void) if (!isdigit (ent->d_name[0])) continue; - if ((pid = atoi (ent->d_name)) < 1) + if ((pid = atol (ent->d_name)) < 1) continue; status = ps_read_process (pid, &ps, &state); @@ -1916,7 +1896,7 @@ static int ps_read (void) ps_submit_state ("paging", paging); ps_submit_state ("blocked", blocked); - for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) + for (procstat_t *ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) ps_submit_proc_list (ps_ptr); read_fork_rate(); @@ -1936,9 +1916,7 @@ static int ps_read (void) struct kinfo_proc *procs; /* array of processes */ struct kinfo_proc *proc_ptr = NULL; int count; /* returns number of processes */ - int i; - procstat_t *ps_ptr; procstat_entry_t pse; ps_list_reset (); @@ -1963,7 +1941,7 @@ static int ps_read (void) } /* Iterate through the processes in kinfo_proc */ - for (i = 0; i < count; i++) + for (int i = 0; i < count; i++) { /* Create only one process list entry per _process_, i.e. * filter out threads (duplicate PID entries). */ @@ -2066,7 +2044,7 @@ static int ps_read (void) ps_submit_state ("idle", idle); ps_submit_state ("wait", wait); - for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) + for (procstat_t *ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) ps_submit_proc_list (ps_ptr); /* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */ @@ -2084,9 +2062,7 @@ static int ps_read (void) struct kinfo_proc *procs; /* array of processes */ struct kinfo_proc *proc_ptr = NULL; int count; /* returns number of processes */ - int i; - procstat_t *ps_ptr; procstat_entry_t pse; ps_list_reset (); @@ -2111,7 +2087,7 @@ static int ps_read (void) } /* Iterate through the processes in kinfo_proc */ - for (i = 0; i < count; i++) + for (int i = 0; i < count; i++) { /* Create only one process list entry per _process_, i.e. * filter out threads (duplicate PID entries). */ @@ -2203,7 +2179,7 @@ static int ps_read (void) ps_submit_state ("idle", idle); ps_submit_state ("dead", dead); - for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) + for (procstat_t *ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) ps_submit_proc_list (ps_ptr); /* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_OPENBSD */ @@ -2219,7 +2195,6 @@ static int ps_read (void) pid_t pindex = 0; int nprocs; - procstat_t *ps; procstat_entry_t pse; ps_list_reset (); @@ -2227,9 +2202,7 @@ static int ps_read (void) /* fdsinfo = */ NULL, sizeof(struct fdsinfo64), &pindex, MAXPROCENTRY)) > 0) { - int i; - - for (i = 0; i < nprocs; i++) + for (int i = 0; i < nprocs; i++) { tid64_t thindex; int nthreads; @@ -2340,7 +2313,7 @@ static int ps_read (void) ps_submit_state ("paging", paging); ps_submit_state ("blocked", blocked); - for (ps = list_head_g; ps != NULL; ps = ps->next) + for (procstat_t *ps = list_head_g; ps != NULL; ps = ps->next) ps_submit_proc_list (ps); /* #endif HAVE_PROCINFO_H */ @@ -2364,7 +2337,6 @@ static int ps_read (void) DIR *proc; int status; - procstat_t *ps_ptr; char state; char cmdline[PRARGSZ]; @@ -2440,7 +2412,7 @@ static int ps_read (void) ps_list_add (ps.name, - ps_get_cmdline (pid, cmdline, sizeof (cmdline)), + ps_get_cmdline (pid, ps.name, cmdline, sizeof (cmdline)), &pse); } /* while(readdir) */ closedir (proc); @@ -2454,7 +2426,7 @@ static int ps_read (void) ps_submit_state ("system", system); ps_submit_state ("orphan", orphan); - for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) + for (procstat_t *ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next) ps_submit_proc_list (ps_ptr); read_fork_rate();