diff --git a/sysdeps/solaris/proclist.c b/sysdeps/solaris/proclist.c index e6089cba..e22876d9 100644 --- a/sysdeps/solaris/proclist.c +++ b/sysdeps/solaris/proclist.c @@ -41,7 +41,7 @@ static const unsigned long _glibtop_sysdeps_proclist = int glibtop_init_proclist_s (glibtop *server) { - server->sysdeps.proclist = _glibtop_sysdeps_proclist; + server->sysdeps.proclist = _glibtop_sysdeps_proclist; } #define BLOCK_COUNT 256 @@ -58,194 +58,192 @@ unsigned * glibtop_get_proclist_s (glibtop *server, glibtop_proclist *buf, int64_t which, int64_t arg) { - DIR *proc; - struct dirent *entry; - char buffer [BUFSIZ]; - unsigned count, total, pid, mask; - unsigned pids [BLOCK_COUNT], *pids_chain = NULL; - unsigned pids_size = 0, pids_offset = 0, new_size; - struct stat statb; - int len, i, ok; + DIR *proc; + struct dirent *entry; + char buffer [BUFSIZ]; + unsigned count, total, pid, mask; + unsigned pids [BLOCK_COUNT], *pids_chain = NULL; + unsigned pids_size = 0, pids_offset = 0, new_size; + struct stat statb; + int len, i, ok; - memset (buf, 0, sizeof (glibtop_proclist)); - mask = which & ~GLIBTOP_KERN_PROC_MASK; - which &= GLIBTOP_KERN_PROC_MASK; + memset (buf, 0, sizeof (glibtop_proclist)); + mask = which & ~GLIBTOP_KERN_PROC_MASK; + which &= GLIBTOP_KERN_PROC_MASK; - /* Check if the user wanted only one process */ + /* Check if the user wanted only one process */ - if(which == GLIBTOP_KERN_PROC_PID) - { - if(mask) - { + if(which == GLIBTOP_KERN_PROC_PID) { + if(mask) { #ifdef HAVE_PROCFS_H - struct psinfo psinfo; + struct psinfo psinfo; #else - struct prpsinfo psinfo; + struct prpsinfo psinfo; #endif - if(glibtop_get_proc_data_psinfo_s(server, &psinfo, pid)) - return NULL; - if(mask & GLIBTOP_EXCLUDE_IDLE && !psinfo.pr_pctcpu) - return NULL; - if(mask & GLIBTOP_EXCLUDE_SYSTEM && psinfo.pr_flag & SSYS) - return NULL; - if(mask & GLIBTOP_EXCLUDE_NOTTY && psinfo.pr_ttydev == PRNODEV) - return NULL; - } - else - { - sprintf(buffer, "/proc/%d", arg); - if(s_stat(buffer, &statb) < 0) - return NULL; - } - if(!(pids_chain = glibtop_malloc(sizeof(unsigned)))) - return NULL; - *pids_chain = pid; - return pids_chain; + if(glibtop_get_proc_data_psinfo_s(server, &psinfo, pid)) + return NULL; + if(mask & GLIBTOP_EXCLUDE_IDLE && !psinfo.pr_pctcpu) + return NULL; + if(mask & GLIBTOP_EXCLUDE_SYSTEM && psinfo.pr_flag & SSYS) + return NULL; + if(mask & GLIBTOP_EXCLUDE_NOTTY && psinfo.pr_ttydev == PRNODEV) + return NULL; + } else { + sprintf(buffer, "/proc/%d", arg); + if(s_stat(buffer, &statb) < 0) + return NULL; } - - proc = opendir ("/proc"); - if (!proc) return NULL; - - /* read every every entry in /proc */ - - for (count = total = 0, entry = readdir (proc); - entry; entry = readdir (proc)) { - ok = 1; len = strlen (entry->d_name); - - /* does it consist entirely of digits? */ -#if 0 - /* It does, except for "." and "..". Let's speed up */ - - for (i = 0; i < len; i++) - if (!isdigit (entry->d_name [i])) ok = 0; - if (!ok) continue; -#else - if(entry->d_name[0] == '.') - continue; -#endif - - /* convert it in a number */ -#if 0 - if (sscanf (entry->d_name, "%u", &pid) != 1) continue; -#else - pid = (unsigned)atol(entry->d_name); -#endif - -#ifdef HAVE_PROCFS_H - - /* Can we skip it based on the request? We have - RUID and RGID in struct stat. But we can't do it - like this for LP64 process, because stat() will fail. - XXX Unimplemented for now */ - - if(!mask && which == GLIBTOP_KERN_PROC_RUID) - { - sprintf (buffer, "/proc/%d", pid); - if (s_stat (buffer, &statb)) continue; - - if (!S_ISDIR (statb.st_mode)) continue; - - if(statb.st_uid != arg) continue; - } - - if(mask || which != GLIBTOP_KERN_PROC_ALL) - { - struct psinfo psinfo; - - if(glibtop_get_proc_data_psinfo_s(server, &psinfo, pid)) - continue; - if(mask) - { - if(mask & GLIBTOP_EXCLUDE_IDLE && !psinfo.pr_pctcpu) - continue; - if(mask & GLIBTOP_EXCLUDE_SYSTEM && psinfo.pr_flag & SSYS) - continue; - if(mask & GLIBTOP_EXCLUDE_NOTTY - && psinfo.pr_ttydev == PRNODEV) - continue; - } - switch(which) - { - case GLIBTOP_KERN_PROC_PGRP: if(psinfo.pr_pgid != arg) - continue; - break; - case GLIBTOP_KERN_PROC_SESSION: if(psinfo.pr_sid != arg) - continue; - break; - case GLIBTOP_KERN_PROC_TTY: if(psinfo.pr_ttydev != arg) - continue; - break; - case GLIBTOP_KERN_PROC_UID: if(psinfo.pr_euid != arg) - continue; - break; - case GLIBTOP_KERN_PROC_RUID: if(psinfo.pr_uid != arg) - continue; - break; - default: break; - } - } -#endif - /* Fine. Now we first try to store it in pids. If this buffer is - * full, we copy it to the pids_chain. */ - - if (count >= BLOCK_COUNT) { - /* The following call to glibtop_realloc will be - * equivalent to glibtop_malloc () if `pids_chain' is - * NULL. We just calculate the new size and copy `pids' - * to the beginning of the newly allocated block. */ - - new_size = pids_size + BLOCK_SIZE; - - pids_chain = glibtop_realloc_r - (server, pids_chain, new_size); - - memcpy (pids_chain + pids_offset, pids, BLOCK_SIZE); - - pids_size = new_size; - - pids_offset += BLOCK_COUNT; - - count = 0; - } - - /* pids is now big enough to hold at least one single pid. */ - - pids [count++] = pid; - - total++; - } - - s_closedir (proc); - - /* count is only zero if an error occured (one a running Linux system, - * we have at least one single process). */ - - if (!count) return NULL; - - /* The following call to glibtop_realloc will be equivalent to - * glibtop_malloc if pids_chain is NULL. We just calculate the - * new size and copy pids to the beginning of the newly allocated - * block. */ - - new_size = pids_size + count * sizeof (unsigned); - - pids_chain = glibtop_realloc_r (server, pids_chain, new_size); - - memcpy (pids_chain + pids_offset, pids, count * sizeof (unsigned)); - - pids_size = new_size; - - pids_offset += BLOCK_COUNT; - - /* Since everything is ok now, we can set buf->flags, fill in the - * remaining fields and return the `pids_chain'. */ - - buf->flags = _glibtop_sysdeps_proclist; - - buf->size = sizeof (unsigned); - buf->number = total; - - buf->total = total * sizeof (unsigned); - + if(!(pids_chain = glibtop_malloc(sizeof(unsigned)))) + return NULL; + *pids_chain = pid; return pids_chain; + } + + proc = opendir ("/proc"); + if (!proc) return NULL; + + /* read every every entry in /proc */ + + for (count = total = 0, entry = readdir (proc); + entry; entry = readdir (proc)) { + ok = 1; len = strlen (entry->d_name); + + /* does it consist entirely of digits? */ +#if 0 + /* It does, except for "." and "..". Let's speed up */ + + for (i = 0; i < len; i++) + if (!isdigit (entry->d_name [i])) ok = 0; + if (!ok) continue; +#else + if(entry->d_name[0] == '.') + continue; +#endif + + /* convert it in a number */ +#if 0 + if (sscanf (entry->d_name, "%u", &pid) != 1) continue; +#else + pid = (unsigned)atol(entry->d_name); +#endif + +#ifdef HAVE_PROCFS_H + + /* Can we skip it based on the request? We have + RUID and RGID in struct stat. But we can't do it + like this for LP64 process, because stat() will fail. + XXX Unimplemented for now */ + + if(!mask && which == GLIBTOP_KERN_PROC_RUID) { + sprintf (buffer, "/proc/%d", pid); + if (s_stat (buffer, &statb)) continue; + + if (!S_ISDIR (statb.st_mode)) continue; + + if(statb.st_uid != arg) continue; + } + + if(mask || which != GLIBTOP_KERN_PROC_ALL) { + struct psinfo psinfo; + + if(glibtop_get_proc_data_psinfo_s(server, &psinfo, pid)) + continue; + if(mask) { + if(mask & GLIBTOP_EXCLUDE_IDLE && !psinfo.pr_pctcpu) + continue; + if(mask & GLIBTOP_EXCLUDE_SYSTEM && psinfo.pr_flag & SSYS) + continue; + if(mask & GLIBTOP_EXCLUDE_NOTTY + && psinfo.pr_ttydev == PRNODEV) + continue; + } + switch(which) { + case GLIBTOP_KERN_PROC_PGRP: + if(psinfo.pr_pgid != arg) + continue; + break; + case GLIBTOP_KERN_PROC_SESSION: + if(psinfo.pr_sid != arg) + continue; + break; + case GLIBTOP_KERN_PROC_TTY: + if(psinfo.pr_ttydev != arg) + continue; + break; + case GLIBTOP_KERN_PROC_UID: + if(psinfo.pr_euid != arg) + continue; + break; + case GLIBTOP_KERN_PROC_RUID: + if(psinfo.pr_uid != arg) + continue; + break; + default: + break; + } + } +#endif + /* Fine. Now we first try to store it in pids. If this buffer is + * full, we copy it to the pids_chain. */ + + if (count >= BLOCK_COUNT) { + /* The following call to glibtop_realloc will be + * equivalent to glibtop_malloc () if `pids_chain' is + * NULL. We just calculate the new size and copy `pids' + * to the beginning of the newly allocated block. */ + + new_size = pids_size + BLOCK_SIZE; + + pids_chain = glibtop_realloc_r + (server, pids_chain, new_size); + + memcpy (pids_chain + pids_offset, pids, BLOCK_SIZE); + + pids_size = new_size; + + pids_offset += BLOCK_COUNT; + + count = 0; + } + + /* pids is now big enough to hold at least one single pid. */ + + pids [count++] = pid; + + total++; + } + + s_closedir (proc); + + /* count is only zero if an error occured (one a running Linux system, + * we have at least one single process). */ + + if (!count) return NULL; + + /* The following call to glibtop_realloc will be equivalent to + * glibtop_malloc if pids_chain is NULL. We just calculate the + * new size and copy pids to the beginning of the newly allocated + * block. */ + + new_size = pids_size + count * sizeof (unsigned); + + pids_chain = glibtop_realloc_r (server, pids_chain, new_size); + + memcpy (pids_chain + pids_offset, pids, count * sizeof (unsigned)); + + pids_size = new_size; + + pids_offset += BLOCK_COUNT; + + /* Since everything is ok now, we can set buf->flags, fill in the + * remaining fields and return the `pids_chain'. */ + + buf->flags = _glibtop_sysdeps_proclist; + + buf->size = sizeof (unsigned); + buf->number = total; + + buf->total = total * sizeof (unsigned); + + return pids_chain; }