ps.c revision 0badbd6565fea17be39d82eba858fa76d28920a4
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ctype.h> 20badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <dirent.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 40badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <pwd.h> 50badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <stdio.h> 60badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <stdlib.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 100badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <unistd.h> 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 12392744175c4de67dc98e72da6745e6351118c985San Mehat#include <cutils/sched_policy.h> 13392744175c4de67dc98e72da6745e6351118c985San Mehat 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *nexttoksep(char **strp, char *sep) 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p = strsep(strp,sep); 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (p == 0) ? "" : p; 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *nexttok(char **strp) 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return nexttoksep(strp, " "); 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHOW_PRIO 1 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHOW_TIME 2 26392744175c4de67dc98e72da6745e6351118c985San Mehat#define SHOW_POLICY 4 278b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt#define SHOW_CPU 8 288290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#define SHOW_MACLABEL 16 29377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen#define SHOW_NUMERIC_UID 32 307c01585339ef8ccbfb33e9886689e4018ae58978Kenny Root#define SHOW_ABI 64 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int display_flags = 0; 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 348f197e65790265b362fc01c5f730365dc7dc1809Kenny Rootstatic void print_exe_abi(int pid); 358f197e65790265b362fc01c5f730365dc7dc1809Kenny Root 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int ps_line(int pid, int tid, char *namefilter) 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char statline[1024]; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char cmdline[1024]; 408290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley char macline[1024]; 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char user[32]; 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat stats; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, r; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *ptr, *name, *state; 45aa907768af7ba9e29901d356cdcac6a436970323Mark Salyzyn int ppid; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned wchan, rss, vss, eip; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned utime, stime; 488b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt int prio, nice, rtprio, sched, psr; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct passwd *pw; 50377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d", pid); 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stat(statline, &stats); 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid) { 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d/task/%d/stat", pid, tid); 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cmdline[0] = 0; 578290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley snprintf(macline, sizeof(macline), "/proc/%d/task/%d/attr/current", pid, tid); 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d/stat", pid); 608290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley sprintf(cmdline, "/proc/%d/cmdline", pid); 618290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley snprintf(macline, sizeof(macline), "/proc/%d/attr/current", pid); 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open(cmdline, O_RDONLY); 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == 0) { 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = 0; 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = read(fd, cmdline, 1023); 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) r = 0; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cmdline[r] = 0; 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 72377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open(statline, O_RDONLY); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == 0) return -1; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = read(fd, statline, 1023); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) return -1; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project statline[r] = 0; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr = statline; 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // skip pid 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr++; // skip "(" 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name = ptr; 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr = strrchr(ptr, ')'); // Skip to *last* occurence of ')', 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *ptr++ = '\0'; // and null-terminate name. 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr++; // skip " " 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = nexttok(&ptr); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppid = atoi(nexttok(&ptr)); 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // pgrp 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sid 93aa907768af7ba9e29901d356cdcac6a436970323Mark Salyzyn nexttok(&ptr); // tty 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // tpgid 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // flags 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // minflt 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cminflt 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // majflt 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cmajflt 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 1 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project utime = atoi(nexttok(&ptr)); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stime = atoi(nexttok(&ptr)); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // utime 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // stime 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cutime 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cstime 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prio = atoi(nexttok(&ptr)); 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nice = atoi(nexttok(&ptr)); 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // threads 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // itrealvalue 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // starttime 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vss = strtoul(nexttok(&ptr), 0, 10); // vsize 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rss = strtoul(nexttok(&ptr), 0, 10); // rss 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // rlim 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // startcode 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // endcode 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // startstack 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // kstkesp 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project eip = strtoul(nexttok(&ptr), 0, 10); // kstkeip 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // signal 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // blocked 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sigignore 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sigcatch 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project wchan = strtoul(nexttok(&ptr), 0, 10); // wchan 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // nswap 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cnswap 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // exit signal 1308b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt psr = atoi(nexttok(&ptr)); // processor 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rtprio = atoi(nexttok(&ptr)); // rt_priority 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sched = atoi(nexttok(&ptr)); // scheduling policy 133377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 134aa907768af7ba9e29901d356cdcac6a436970323Mark Salyzyn nexttok(&ptr); // tty 135377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid != 0) { 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppid = pid; 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid = tid; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pw = getpwuid(stats.st_uid); 142377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen if(pw == 0 || (display_flags & SHOW_NUMERIC_UID)) { 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(user,"%d",(int)stats.st_uid); 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(user,pw->pw_name); 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 147377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 14865267bcc27b81088ab6183f7c4abf06c3ce3b297Dmitriy Ivanov if(!namefilter || !strncmp(cmdline[0] ? cmdline : name, namefilter, strlen(namefilter))) { 1498290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley if (display_flags & SHOW_MACLABEL) { 1508290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley fd = open(macline, O_RDONLY); 1518290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley strcpy(macline, "-"); 1528290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley if (fd >= 0) { 1538290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley r = read(fd, macline, sizeof(macline)-1); 1548290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley close(fd); 1558290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley if (r > 0) 1568290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley macline[r] = 0; 1578290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } 1588290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley printf("%-30s %-9s %-5d %-5d %s\n", macline, user, pid, ppid, cmdline[0] ? cmdline : name); 1598290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley return 0; 1608290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } 1618290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley 162392744175c4de67dc98e72da6745e6351118c985San Mehat printf("%-9s %-5d %-5d %-6d %-5d", user, pid, ppid, vss / 1024, rss * 4); 1638b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt if (display_flags & SHOW_CPU) 1648b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt printf(" %-2d", psr); 1658b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt if (display_flags & SHOW_PRIO) 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf(" %-5d %-5d %-5d %-5d", prio, nice, rtprio, sched); 167392744175c4de67dc98e72da6745e6351118c985San Mehat if (display_flags & SHOW_POLICY) { 168392744175c4de67dc98e72da6745e6351118c985San Mehat SchedPolicy p; 169392744175c4de67dc98e72da6745e6351118c985San Mehat if (get_sched_policy(pid, &p) < 0) 170392744175c4de67dc98e72da6745e6351118c985San Mehat printf(" un "); 17186c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten else 17286c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten printf(" %.2s ", get_sched_policy_name(p)); 173392744175c4de67dc98e72da6745e6351118c985San Mehat } 1748f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf(" %08x %08x %s ", wchan, eip, state); 1758f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if (display_flags & SHOW_ABI) { 1768f197e65790265b362fc01c5f730365dc7dc1809Kenny Root print_exe_abi(pid); 1778f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 1788f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("%s", cmdline[0] ? cmdline : name); 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(display_flags&SHOW_TIME) 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf(" (u:%d, s:%d)", utime, stime); 181392744175c4de67dc98e72da6745e6351118c985San Mehat 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("\n"); 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1878f197e65790265b362fc01c5f730365dc7dc1809Kenny Rootstatic void print_exe_abi(int pid) 1888f197e65790265b362fc01c5f730365dc7dc1809Kenny Root{ 1898f197e65790265b362fc01c5f730365dc7dc1809Kenny Root int fd, r; 1908f197e65790265b362fc01c5f730365dc7dc1809Kenny Root char exeline[1024]; 1918f197e65790265b362fc01c5f730365dc7dc1809Kenny Root 1928f197e65790265b362fc01c5f730365dc7dc1809Kenny Root sprintf(exeline, "/proc/%d/exe", pid); 1938f197e65790265b362fc01c5f730365dc7dc1809Kenny Root fd = open(exeline, O_RDONLY); 1948f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if(fd == 0) { 1958f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf(" "); 1968f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 1978f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 1988f197e65790265b362fc01c5f730365dc7dc1809Kenny Root r = read(fd, exeline, 5 /* 4 byte ELFMAG + 1 byte EI_CLASS */); 1998f197e65790265b362fc01c5f730365dc7dc1809Kenny Root close(fd); 2008f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if(r < 0) { 2018f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf(" "); 2028f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2038f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2048f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if (memcmp("\177ELF", exeline, 4) != 0) { 2058f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("?? "); 2068f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2078f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2088f197e65790265b362fc01c5f730365dc7dc1809Kenny Root switch (exeline[4]) { 2098f197e65790265b362fc01c5f730365dc7dc1809Kenny Root case 1: 2108f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("32 "); 2118f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2128f197e65790265b362fc01c5f730365dc7dc1809Kenny Root case 2: 2138f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("64 "); 2148f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2158f197e65790265b362fc01c5f730365dc7dc1809Kenny Root default: 2168f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("?? "); 2178f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2188f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2198f197e65790265b362fc01c5f730365dc7dc1809Kenny Root} 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ps_threads(int pid, char *namefilter) 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char tmp[128]; 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *d; 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(tmp,"/proc/%d/task",pid); 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = opendir(tmp); 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(d == 0) return; 230377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((de = readdir(d)) != 0){ 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(isdigit(de->d_name[0])){ 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tid = atoi(de->d_name); 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid == pid) continue; 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ps_line(pid, tid, namefilter); 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 238377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen closedir(d); 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ps_main(int argc, char **argv) 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *d; 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *namefilter = 0; 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pidfilter = 0; 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int threads = 0; 248377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = opendir("/proc"); 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(d == 0) return -1; 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc > 1){ 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[1],"-t")) { 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project threads = 1; 255377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen } else if(!strcmp(argv[1],"-n")) { 256377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen display_flags |= SHOW_NUMERIC_UID; 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[1],"-x")) { 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project display_flags |= SHOW_TIME; 2598290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } else if(!strcmp(argv[1], "-Z")) { 2608290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley display_flags |= SHOW_MACLABEL; 261392744175c4de67dc98e72da6745e6351118c985San Mehat } else if(!strcmp(argv[1],"-P")) { 262392744175c4de67dc98e72da6745e6351118c985San Mehat display_flags |= SHOW_POLICY; 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[1],"-p")) { 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project display_flags |= SHOW_PRIO; 2658b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt } else if(!strcmp(argv[1],"-c")) { 2668b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt display_flags |= SHOW_CPU; 2678f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } else if(!strcmp(argv[1],"--abi")) { 2688f197e65790265b362fc01c5f730365dc7dc1809Kenny Root display_flags |= SHOW_ABI; 2698f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } else if(isdigit(argv[1][0])){ 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pidfilter = atoi(argv[1]); 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project namefilter = argv[1]; 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 2788290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley if (display_flags & SHOW_MACLABEL) { 2798290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley printf("LABEL USER PID PPID NAME\n"); 2808290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } else { 2818f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("USER PID PPID VSIZE RSS %s%s %s WCHAN PC %sNAME\n", 2828290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley (display_flags&SHOW_CPU)?"CPU ":"", 2838290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley (display_flags&SHOW_PRIO)?"PRIO NICE RTPRI SCHED ":"", 2848f197e65790265b362fc01c5f730365dc7dc1809Kenny Root (display_flags&SHOW_POLICY)?"PCY " : "", 2858f197e65790265b362fc01c5f730365dc7dc1809Kenny Root (display_flags&SHOW_ABI)?"ABI " : ""); 2868290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((de = readdir(d)) != 0){ 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(isdigit(de->d_name[0])){ 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pid = atoi(de->d_name); 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!pidfilter || (pidfilter == pid)) { 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ps_line(pid, 0, namefilter); 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(threads) ps_threads(pid, namefilter); 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project closedir(d); 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 300