1 #ifndef PROCPS_PROC_READPROC_H 2 #define PROCPS_PROC_READPROC_H 3 /* 4 * New Interface to Process Table -- PROCTAB Stream (a la Directory streams) 5 * Copyright 1996 Charles L. Blake. 6 * Copyright 1998 Michael K. Johnson 7 * Copyright 1998-2002 Albert Cahalan 8 * May be distributed under the terms of the 9 * GNU Library General Public License, a copy of which is provided 10 * in the file COPYING 11 */ 12 13 #include "procps.h" 14 15 #define SIGNAL_STRING 16 17 #ifdef FLASK_LINUX 18 #include <fs_secure.h> 19 #endif 20 21 EXTERN_C_BEGIN 22 23 /* 24 ld cutime, cstime, priority, nice, timeout, it_real_value, rss, 25 c state, 26 d ppid, pgrp, session, tty, tpgid, 27 s signal, blocked, sigignore, sigcatch, 28 lu flags, min_flt, cmin_flt, maj_flt, cmaj_flt, utime, stime, 29 lu rss_rlim, start_code, end_code, start_stack, kstk_esp, kstk_eip, 30 lu start_time, vsize, wchan, nswap, cnswap, 31 */ 32 33 /* Basic data structure which holds all information we can get about a process. 34 * (unless otherwise specified, fields are read from /proc/#/stat) 35 * 36 * Most of it comes from task_struct in linux/sched.h 37 */ 38 typedef struct proc_t { 39 // 1st 16 bytes 40 int 41 pid, /* process id */ 42 ppid; /* pid of parent process */ 43 unsigned 44 pcpu; /* %CPU usage (is not filled in by readproc!!!) */ 45 char 46 state, /* single-char code for process state (S=sleeping) */ 47 pad_1, /* padding */ 48 pad_2, /* padding */ 49 pad_3; /* padding */ 50 // 2nd 16 bytes 51 unsigned long long 52 utime, /* user-mode CPU time accumulated by process */ 53 stime, /* kernel-mode CPU time accumulated by process */ 54 // and so on... 55 cutime, /* cumulative utime of process and reaped children */ 56 cstime, /* cumulative stime of process and reaped children */ 57 start_time; /* start time of process -- seconds since 1-1-70 */ 58 #ifdef SIGNAL_STRING 59 char 60 /* Linux 2.1.7x and up have 64 signals. Allow 64, plus '\0' and padding. */ 61 signal[18], /* mask of pending signals */ 62 blocked[18], /* mask of blocked signals */ 63 sigignore[18], /* mask of ignored signals */ 64 sigcatch[18]; /* mask of caught signals */ 65 #else 66 long long 67 /* Linux 2.1.7x and up have 64 signals. */ 68 signal, /* mask of pending signals */ 69 blocked, /* mask of blocked signals */ 70 sigignore, /* mask of ignored signals */ 71 sigcatch; /* mask of caught signals */ 72 #endif 73 long 74 priority, /* kernel scheduling priority */ 75 timeout, /* ? */ 76 nice, /* standard unix nice level of process */ 77 rss, /* resident set size from /proc/#/stat (pages) */ 78 it_real_value, /* ? */ 79 /* the next 7 members come from /proc/#/statm */ 80 size, /* total # of pages of memory */ 81 resident, /* number of resident set (non-swapped) pages (4k) */ 82 share, /* number of pages of shared (mmap'd) memory */ 83 trs, /* text resident set size */ 84 lrs, /* shared-lib resident set size */ 85 drs, /* data resident set size */ 86 dt; /* dirty pages */ 87 unsigned long 88 vm_size, /* same as vsize in kb */ 89 vm_lock, /* locked pages in kb */ 90 vm_rss, /* same as rss in kb */ 91 vm_data, /* data size */ 92 vm_stack, /* stack size */ 93 vm_exe, /* executable size */ 94 vm_lib, /* library size (all pages, not just used ones) */ 95 rtprio, /* real-time priority */ 96 sched, /* scheduling class */ 97 vsize, /* number of pages of virtual memory ... */ 98 rss_rlim, /* resident set size limit? */ 99 flags, /* kernel flags for the process */ 100 min_flt, /* number of minor page faults since process start */ 101 maj_flt, /* number of major page faults since process start */ 102 cmin_flt, /* cumulative min_flt of process and child processes */ 103 cmaj_flt, /* cumulative maj_flt of process and child processes */ 104 nswap, /* ? */ 105 cnswap, /* cumulative nswap ? */ 106 start_code, /* address of beginning of code segment */ 107 end_code, /* address of end of code segment */ 108 start_stack, /* address of the bottom of stack for the process */ 109 kstk_esp, /* kernel stack pointer */ 110 kstk_eip, /* kernel instruction pointer */ 111 wchan; /* address of kernel wait channel proc is sleeping in */ 112 char 113 **environ, /* environment string vector (/proc/#/environ) */ 114 **cmdline; /* command line string vector (/proc/#/cmdline) */ 115 char 116 /* Be compatible: Digital allows 16 and NT allows 14 ??? */ 117 ruser[16], /* real user name */ 118 euser[16], /* effective user name */ 119 suser[16], /* saved user name */ 120 fuser[16], /* filesystem user name */ 121 rgroup[16], /* real group name */ 122 egroup[16], /* effective group name */ 123 sgroup[16], /* saved group name */ 124 fgroup[16], /* filesystem group name */ 125 cmd[16]; /* basename of executable file in call to exec(2) */ 126 int 127 ruid, rgid, /* real */ 128 euid, egid, /* effective */ 129 suid, sgid, /* saved */ 130 fuid, fgid, /* fs (used for file access only) */ 131 pgrp, /* process group id */ 132 session, /* session id */ 133 tty, /* full device number of controlling terminal */ 134 tpgid, /* terminal process group id */ 135 exit_signal, /* might not be SIGCHLD */ 136 processor; /* current (or most recent?) CPU */ 137 #ifdef FLASK_LINUX 138 security_id_t secsid; 139 #endif 140 } proc_t; 141 142 /* PROCTAB: data structure holding the persistent information readproc needs 143 * from openproc(). The setup is intentionally similar to the dirent interface 144 * and other system table interfaces (utmp+wtmp come to mind). 145 */ 146 #include <sys/types.h> 147 #include <dirent.h> 148 #include <unistd.h> 149 typedef struct PROCTAB { 150 DIR* procfs; 151 int flags; 152 pid_t* pids; /* pids of the procs */ 153 uid_t* uids; /* uids of procs */ 154 int nuid; /* cannot really sentinel-terminate unsigned short[] */ 155 #ifdef FLASK_LINUX 156 security_id_t* sids; /* SIDs of the procs */ 157 #endif 158 } PROCTAB; 159 160 /* initialize a PROCTAB structure holding needed call-to-call persistent data 161 */ 162 extern PROCTAB* openproc(int flags, ... /* pid_t*|uid_t*|dev_t*|char* [, int n] */ ); 163 164 165 /* Convenient wrapper around openproc and readproc to slurp in the whole process 166 * table subset satisfying the constraints of flags and the optional PID list. 167 * Free allocated memory with freeproctab(). Access via tab[N]->member. The 168 * pointer list is NULL terminated. 169 */ 170 extern proc_t** readproctab(int flags, ... /* same as openproc */ ); 171 172 /* clean-up open files, etc from the openproc() 173 */ 174 extern void closeproc(PROCTAB* PT); 175 176 /* retrieve the next process matching the criteria set by the openproc() 177 */ 178 extern proc_t* readproc(PROCTAB* PT, proc_t* return_buf); 179 extern proc_t* ps_readproc(PROCTAB* PT, proc_t* return_buf); 180 181 // warning: interface may change 182 extern int read_cmdline(char *restrict const dst, unsigned sz, unsigned pid); 183 184 extern void look_up_our_self(proc_t *p); 185 186 /* deallocate space allocated by readproc 187 */ 188 extern void freeproc(proc_t* p); 189 190 /* openproc/readproctab: 191 * 192 * Return PROCTAB* / *proc_t[] or NULL on error ((probably) "/proc" cannot be 193 * opened.) By default readproc will consider all processes as valid to parse 194 * and return, but not actually fill in the cmdline, environ, and /proc/#/statm 195 * derived memory fields. 196 * 197 * `flags' (a bitwise-or of PROC_* below) modifies the default behavior. The 198 * "fill" options will cause more of the proc_t to be filled in. The "filter" 199 * options all use the second argument as the pointer to a list of objects: 200 * process status', process id's, user id's. The third 201 * argument is the length of the list (currently only used for lists of user 202 * id's since uid_t supports no convenient termination sentinel.) 203 */ 204 #define PROC_FILLMEM 0x0001 /* read statm */ 205 #define PROC_FILLCOM 0x0002 /* alloc and fill in `cmdline' */ 206 #define PROC_FILLENV 0x0004 /* alloc and fill in `environ' */ 207 #define PROC_FILLUSR 0x0008 /* resolve user id number -> user name */ 208 #define PROC_FILLGRP 0x0010 /* resolve group id number -> group name */ 209 #define PROC_FILLSTATUS 0x0020 /* read status -- currently unconditional */ 210 #define PROC_FILLSTAT 0x0040 /* read stat -- currently unconditional */ 211 #define PROC_FILLWCHAN 0x0080 /* look up WCHAN name */ 212 #define PROC_FILLARG 0x0100 /* alloc and fill in `cmdline' */ 213 214 #define PROC_FILLBUG 0x0fff /* No idea what we need */ 215 #define PROC_FILLANY 0x0000 /* either stat or status will do */ 216 217 /* Obsolete, consider only processes with one of the passed: */ 218 #define PROC_PID 0x1000 /* process id numbers ( 0 terminated) */ 219 #define PROC_UID 0x4000 /* user id numbers ( length needed ) */ 220 221 // it helps to give app code a few spare bits 222 #define PROC_SPARE_1 0x01000000 223 #define PROC_SPARE_2 0x02000000 224 #define PROC_SPARE_3 0x04000000 225 #define PROC_SPARE_4 0x08000000 226 227 EXTERN_C_END 228 #endif 229