/* Proc::ProcessTable functions */ void ppt_warn(const char*, ...); void bless_into_proc(char* , char**, ...); /* it also gets used by init_static_vars at the way top of the file, * I wanted init_static_vars to be at the way top close to the global vars */ static char *read_file(const char *path, const char *extra_path, off_t *len, struct obstack *mem_pool); struct procstat { /* user/group id of the user running it */ int uid; int gid; /* values scraped from /proc/{$pid}/stat */ pid_t pid; char comm[16]; /* limit in kernel, likewise in procps */ char state_c; int ppid; int pgrp; int sid; int tty; unsigned flags; unsigned long minflt, cminflt, majflt, cmajflt; unsigned long long utime, stime; long long cutime, cstime; long priority; unsigned long long start_time; unsigned long vsize; long rss; unsigned long wchan; /* these are derived from above time values */ unsigned long long time, ctime; /* from above state_c but fixed up elese where */ const char *state; /* values scraped from /proc/{$pid}/status */ int euid, suid, fuid; int egid, sgid, fgid; /* cwd, cmdline & exec files; values allocated at the end of obstacks */ char *cwd; char *cmndline; char *exec; /* other values */ char pctcpu[sizeof("100.00")]; /* precent cpu, without '%' char */ char pctmem[sizeof("100.00")]; /* precent memory, without '%' char */ }; enum state { SLEEP, WAIT, RUN, IDLE, DEFUNCT, STOP, UWAIT, }; /* strings, to make sure they get placed in read only memory, * ditto for pointers to them and so we avoid relocations */ static const char strings[] = { /* process state */ "sleep\0" "wait\0" "run\0" "idle\0" "defunct\0" "stop\0" "uwait\0" /* error messages */ "/proc unavailable\0" "intilization failed\0" /* fields */ "uid\0" "gid\0" "pid\0" "fname\0" "ppid\0" "pgrp\0" "sess\0" "ttynum\0" "flags\0" "minflt\0" "cminflt\0" "majflt\0" "cmajflt\0" "utime\0" "stime\0" "cutime\0" "cstime\0" "priority\0" "start\0" "size\0" "rss\0" "wchan\0" "time\0" "ctime\0" "state\0" "euid\0" "suid\0" "fuid\0" "egid\0" "sgid\0" "fgid\0" "pctcpu\0" "pctmem\0" "cmndline\0" "exec\0" "cwd\0" /* format string */ "IIISIIIILLLLLJJJJIJLLLJJSIIIIIISSSSS\0" }; /* I generated this array with a perl script processing the above char array, * and then performed cross string optimization (by hand) for: * pid, time, uid, gid, minflt, majflt, */ static const size_t strings_index[] = { /* process status strings */ 0, 6, 11, 15, 20, 28, 33, /* error messages */ 39, 57, /* fields */ 77, 81, 85, 89, 95, 100, 105, 110, 117, 123, 130, 138, 145, 153, 159, 165, 172, 179, 188, 194, 199, 203, 209, 214, 220, 226, 231, 236, 241, 246, 251, 256, 263, 270, 279, 284, /* default format string (pre lower casing) */ 288 }; enum string_name { /* NOTE: we start this enum at 7, so we can use still keep using the * state enum, and have those correspond to the static strings */ /* error messages */ STR_ERR_PROC_STATFS = 7, STR_ERR_INIT, /* fields */ STR_FIELD_UID, STR_FIELD_GID, STR_FIELD_PID, STR_FIELD_FNAME, STR_FIELD_PPID, STR_FIELD_PGRP, STR_FIELD_SESS, STR_FIELD_TTYNUM, STR_FIELD_FLAGS, STR_FIELD_MINFLT, STR_FIELD_CMINFLT, STR_FIELD_MAJFLT, STR_FIELD_CMAJFLT, STR_FIELD_UTIME, STR_FIELD_STIME, STR_FIELD_CUTIME, STR_FIELD_CSTIME, STR_FIELD_PRIORITY, STR_FIELD_START, STR_FIELD_SIZE, STR_FIELD_RSS, STR_FIELD_WCHAN, STR_FIELD_TIME, STR_FIELD_CTIME, STR_FIELD_STATE, STR_FIELD_EUID, STR_FIELD_SUID, STR_FIELD_FUID, STR_FIELD_EGID, STR_FIELD_SGID, STR_FIELD_FGID, STR_FIELD_PCTCPU, STR_FIELD_PCTMEM, STR_FIELD_CMNDLINE, STR_FIELD_EXEC, STR_FIELD_CWD, /* format string */ STR_DEFAULT_FORMAT }; enum field { F_UID, F_GID, F_PID, F_FNAME, F_PPID, F_PGRP, F_SESS, F_TTYNUM, F_FLAGS, F_MINFLT, F_CMINFLT, F_MAJFLT, F_CMAJFLT, F_UTIME, F_STIME, F_CUTIME, F_CSTIME, F_PRIORITY, F_START, F_SIZE, F_RSS, F_WCHAN, F_TIME, F_CTIME, F_STATE, F_EUID, F_SUID, F_FUID, F_EGID, F_SGID, F_FGID, F_PCTCPU, F_PCTMEM, F_CMNDLINE, F_EXEC, F_CWD }; static const char* const field_names[] = { strings + 77, strings + 81, strings + 85, strings + 89, strings + 95, strings + 100, strings + 105, strings + 110, strings + 117, strings + 123, strings + 130, strings + 138, strings + 145, strings + 153, strings + 159, strings + 165, strings + 172, strings + 179, strings + 188, strings + 194, strings + 199, strings + 203, strings + 209, strings + 214, strings + 220, strings + 226, strings + 231, strings + 236, strings + 241, strings + 246, strings + 251, strings + 256, strings + 263, strings + 270, strings + 279, strings + 284 };