65 |
|
#include <limits.h> |
66 |
|
#if (defined(FREEBSD) && !defined(FREEBSD5)) || defined(DFBSD) |
67 |
|
#include <kvm.h> |
68 |
– |
#include <tools.h> |
68 |
|
#endif |
69 |
|
#include <unistd.h> |
70 |
|
#ifdef NETBSD2 |
120 |
|
char ps_name[4096]; |
121 |
|
char *ptr; |
122 |
|
VECTOR_DECLARE_STATIC(psargs, char, 128, NULL, NULL); |
123 |
< |
unsigned long stime, utime; |
123 |
> |
unsigned long stime, utime, starttime; |
124 |
|
int x; |
125 |
|
int fn; |
126 |
|
int len; |
127 |
|
int rc; |
128 |
+ |
time_t uptime; |
129 |
|
#endif |
130 |
|
|
131 |
+ |
#ifdef LINUX |
132 |
+ |
if ((f=fopen("/proc/uptime", "r")) == NULL) { |
133 |
+ |
return NULL; |
134 |
+ |
} |
135 |
+ |
if((fscanf(f,"%lu %*d",&uptime)) != 1){ |
136 |
+ |
return NULL; |
137 |
+ |
} |
138 |
+ |
fclose(f); |
139 |
+ |
#endif |
140 |
+ |
|
141 |
|
if((proc_dir=opendir(PROC_LOCATION))==NULL){ |
142 |
|
return NULL; |
143 |
|
} |
177 |
|
proc_state_ptr->proc_resident = (process_info.pr_rssize) * 1024; |
178 |
|
proc_state_ptr->time_spent = process_info.pr_time.tv_sec; |
179 |
|
proc_state_ptr->cpu_percent = (process_info.pr_pctcpu * 100.0) / 0x8000; |
180 |
< |
proc_state_ptr->process_name = strdup(process_info.pr_fname); |
181 |
< |
proc_state_ptr->proctitle = strdup(process_info.pr_psargs); |
180 |
> |
if (sg_update_string(&proc_state_ptr->process_name, |
181 |
> |
process_info.pr_fname) < 0) { |
182 |
> |
return NULL; |
183 |
> |
} |
184 |
> |
if (sg_update_string(&proc_state_ptr->proctitle, |
185 |
> |
process_info.pr_psargs) < 0) { |
186 |
> |
return NULL; |
187 |
> |
} |
188 |
|
|
189 |
|
if(process_info.pr_lwp.pr_state==1) proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING; |
190 |
|
if(process_info.pr_lwp.pr_state==2) proc_state_ptr->state = SG_PROCESS_STATE_RUNNING; |
193 |
|
if(process_info.pr_lwp.pr_state==6) proc_state_ptr->state = SG_PROCESS_STATE_RUNNING; |
194 |
|
#endif |
195 |
|
#ifdef LINUX |
196 |
< |
x = fscanf(f, "%d %4096s %c %d %d %*d %*d %*d %*u %*u %*u %*u %*u %lu %lu %*d %*d %*d %d %*d %*d %*u %llu %llu %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %*d\n", &(proc_state_ptr->pid), ps_name, &s, &(proc_state_ptr->parent), &(proc_state_ptr->pgid), &utime, &stime, &(proc_state_ptr->nice), &(proc_state_ptr->proc_size), &(proc_state_ptr->proc_resident)); |
197 |
< |
proc_state_ptr->proc_resident = proc_state_ptr->proc_resident * getpagesize(); |
196 |
> |
x = fscanf(f, "%d %4096s %c %d %d %*d %*d %*d %*u %*u %*u %*u %*u %lu %lu %*d %*d %*d %d %*d %*d %lu %llu %llu %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %*d\n", &(proc_state_ptr->pid), ps_name, &s, &(proc_state_ptr->parent), &(proc_state_ptr->pgid), &utime, &stime, &(proc_state_ptr->nice), &starttime, &(proc_state_ptr->proc_size), &(proc_state_ptr->proc_resident)); |
197 |
> |
/* +3 becuase man page says "Resident Set Size: number of pages the process has in real memory, minus 3 for administrative purposes." */ |
198 |
> |
proc_state_ptr->proc_resident = (proc_state_ptr->proc_resident + 3) * getpagesize(); |
199 |
|
if(s == 'S') proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING; |
200 |
|
if(s == 'R') proc_state_ptr->state = SG_PROCESS_STATE_RUNNING; |
201 |
|
if(s == 'Z') proc_state_ptr->state = SG_PROCESS_STATE_ZOMBIE; |
211 |
|
return NULL; |
212 |
|
} |
213 |
|
|
214 |
< |
/* Need to do cpu */ |
215 |
< |
|
214 |
> |
/* cpu */ |
215 |
> |
proc_state_ptr->cpu_percent = (100.0 * (utime + stime)) / ((uptime * 100.0) - starttime); |
216 |
|
|
217 |
|
fclose(f); |
218 |
|
|
219 |
+ |
/* uid / gid */ |
220 |
+ |
snprintf(filename, MAX_FILE_LENGTH, "/proc/%s/status", dir_entry->d_name); |
221 |
+ |
if ((f=fopen(filename, "r")) == NULL) { |
222 |
+ |
/* Open failed.. Process since vanished, or the path was too long. |
223 |
+ |
* Ah well, move onwards to the next one */ |
224 |
+ |
continue; |
225 |
+ |
} |
226 |
+ |
|
227 |
+ |
if((ptr=sg_f_read_line(f, "Uid:"))==NULL){ |
228 |
+ |
fclose(f); |
229 |
+ |
continue; |
230 |
+ |
} |
231 |
+ |
sscanf(ptr, "Uid:\t%d\t%d\t%*d\t%*d\n", &(proc_state_ptr->uid), &(proc_state_ptr->euid)); |
232 |
+ |
|
233 |
+ |
if((ptr=sg_f_read_line(f, "Gid:"))==NULL){ |
234 |
+ |
fclose(f); |
235 |
+ |
continue; |
236 |
+ |
} |
237 |
+ |
sscanf(ptr, "Gid:\t%d\t%d\t%*d\t%*d\n", &(proc_state_ptr->gid), &(proc_state_ptr->egid)); |
238 |
+ |
|
239 |
+ |
fclose(f); |
240 |
+ |
|
241 |
|
/* proctitle */ |
242 |
|
snprintf(filename, MAX_FILE_LENGTH, "/proc/%s/cmdline", dir_entry->d_name); |
243 |
|
|
306 |
|
|
307 |
|
procs = size / sizeof(struct kinfo_proc); |
308 |
|
|
309 |
< |
kp_stats = malloc(size); |
309 |
> |
kp_stats = sg_malloc(size); |
310 |
|
if(kp_stats == NULL) { |
311 |
|
return NULL; |
312 |
|
} |
371 |
|
} |
372 |
|
#endif |
373 |
|
|
374 |
< |
proctitle = malloc(buflen); |
374 |
> |
proctitle = sg_malloc(buflen); |
375 |
|
if(proctitle == NULL) { |
376 |
|
return NULL; |
377 |
|
} |
393 |
|
proc_state_ptr->proctitle = NULL; |
394 |
|
} |
395 |
|
else if(size > 0) { |
396 |
< |
proc_state_ptr->proctitle = malloc(size+1); |
396 |
> |
proc_state_ptr->proctitle = sg_malloc(size+1); |
397 |
|
if(proc_state_ptr->proctitle == NULL) { |
398 |
|
return NULL; |
399 |
|
} |
422 |
|
argslen += strlen(*argsp) + 1; |
423 |
|
argsp++; |
424 |
|
} |
425 |
< |
proctitle = malloc(argslen + 1); |
425 |
> |
proctitle = sg_malloc(argslen + 1); |
426 |
|
proctitle[0] = '\0'; |
427 |
|
if(proctitle == NULL) { |
428 |
|
return NULL; |
524 |
|
lwps = size / sizeof(struct kinfo_lwp); |
525 |
|
mib[4] = lwps; |
526 |
|
|
527 |
< |
kl_stats = malloc(size); |
527 |
> |
kl_stats = sg_malloc(size); |
528 |
|
if(kl_stats == NULL) { |
529 |
|
return NULL; |
530 |
|
} |