ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/process_stats.c
(Generate patch)

Comparing projects/libstatgrab/src/libstatgrab/process_stats.c (file contents):
Revision 1.28 by tdb, Sat Apr 3 16:57:32 2004 UTC vs.
Revision 1.29 by tdb, Sat Apr 3 20:33:45 2004 UTC

# Line 57 | Line 57
57   #else
58   #include <sys/proc.h>
59   #endif
60 + #include <string.h>
61 + #include <paths.h>
62 + #include <fcntl.h>
63 + #include <limits.h>
64 + #include <kvm.h>
65   #endif
66  
67   int get_proc_snapshot(proc_state_t **ps){
# Line 67 | Line 72 | int get_proc_snapshot(proc_state_t **ps){
72          int mib[3];
73          size_t size;
74          struct kinfo_proc *kp_stats;
75 <        int procs, i;
75 >        int procs, i, alloc;
76 >        static kvm_t *kvmd;
77 >        char **args;
78 >        char *proctitle;
79   #endif
80   #if defined(SOLARIS) || defined(LINUX)
81          DIR *proc_dir;
# Line 199 | Line 207 | int get_proc_snapshot(proc_state_t **ps){
207   #endif
208  
209   #ifdef ALLBSD
210 <        mib[0] = CTL_KERN;
203 <        mib[1] = KERN_PROC;
204 <        mib[2] = KERN_PROC_ALL;
210 >        kvmd = kvm_openfiles(_PATH_DEVNULL, _PATH_DEVNULL, NULL, O_RDONLY, NULL);
211  
212 <        if (sysctl(mib, 3, NULL, &size, NULL, 0) < 0) {
207 <                return NULL;
208 <        }
212 >        if(kvmd == NULL) return NULL;
213  
214 <        procs = size / sizeof(struct kinfo_proc);
214 >        kp_stats = kvm_getprocs(kvmd, KERN_PROC_ALL, 0, &procs);
215  
216 <        kp_stats = malloc(size);
213 <        if (kp_stats == NULL) {
216 >        if (kp_stats == NULL || procs < 0) {
217                  return NULL;
218          }
219  
217        if (sysctl(mib, 3, kp_stats, &size, NULL, 0) < 0) {
218                free(kp_stats);
219                return NULL;
220        }
221
220          for (i = 0; i < procs; i++) {
221 +                /* replace with something more sensible */
222                  proc_state = realloc(proc_state, (1+proc_state_size)*sizeof(proc_state_t));
223 +                if(proc_state == NULL ) {
224 +                        return NULL;
225 +                }
226                  proc_state_ptr = proc_state+proc_state_size;
227                  
228                  proc_state_ptr->process_name = strdup(kp_stats[i].ki_comm);
229 <                /* Seems we don't have access to that bit of memory */
230 <                /*proc_state_ptr->proctitle = strdup(kp_stats[i].ki_args->ar_args);*/
231 <                proc_state_ptr->proctitle = NULL;
229 >
230 >                args = kvm_getargv(kvmd, &(kp_stats[i]), 0);
231 >                if(args != NULL) {
232 >                        alloc = 1;
233 >                        proctitle = malloc(alloc);
234 >                        if(proctitle == NULL) {
235 >                                return NULL;
236 >                        }
237 >                        while(*args != NULL) {
238 >                                if(strlen(proctitle) + strlen(*args) >= alloc) {
239 >                                        alloc = (alloc + strlen(*args)) << 1;
240 >                                        proctitle = realloc(proctitle, alloc);
241 >                                        if(proctitle == NULL) {
242 >                                                return NULL;
243 >                                        }
244 >                                }
245 >                                strncat(proctitle, *args, strlen(*args));
246 >                                strncat(proctitle, " ", 1);
247 >                                args++;
248 >                        }
249 >                        /* remove trailing space */
250 >                        proctitle[strlen(proctitle)-1] = NULL;
251 >                        proc_state_ptr->proctitle = proctitle;
252 >                }
253 >                else {
254 >                        proc_state_ptr->proctitle = malloc(strlen(kp_stats[i].ki_comm)+4);
255 >                        if(proc_state_ptr->proctitle == NULL) {
256 >                                return NULL;
257 >                        }
258 >                        sprintf(proc_state_ptr->proctitle, " (%s)", kp_stats[i].ki_comm);
259 >                }
260  
261                  proc_state_ptr->pid = kp_stats[i].ki_pid;
262                  proc_state_ptr->parent = kp_stats[i].ki_ppid;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines