ps.c revision 8f197e65790265b362fc01c5f730365dc7dc1809
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ctype.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <dirent.h> 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pwd.h> 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 14392744175c4de67dc98e72da6745e6351118c985San Mehat#include <cutils/sched_policy.h> 15392744175c4de67dc98e72da6745e6351118c985San Mehat 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *nexttoksep(char **strp, char *sep) 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p = strsep(strp,sep); 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (p == 0) ? "" : p; 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *nexttok(char **strp) 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return nexttoksep(strp, " "); 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHOW_PRIO 1 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHOW_TIME 2 28392744175c4de67dc98e72da6745e6351118c985San Mehat#define SHOW_POLICY 4 298b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt#define SHOW_CPU 8 308290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#define SHOW_MACLABEL 16 318f197e65790265b362fc01c5f730365dc7dc1809Kenny Root#define SHOW_ABI 32 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int display_flags = 0; 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 358f197e65790265b362fc01c5f730365dc7dc1809Kenny Rootstatic void print_exe_abi(int pid); 368f197e65790265b362fc01c5f730365dc7dc1809Kenny Root 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int ps_line(int pid, int tid, char *namefilter) 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char statline[1024]; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char cmdline[1024]; 418290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley char macline[1024]; 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char user[32]; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat stats; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, r; 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *ptr, *name, *state; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ppid, tty; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned wchan, rss, vss, eip; 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned utime, stime; 498b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt int prio, nice, rtprio, sched, psr; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct passwd *pw; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d", pid); 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stat(statline, &stats); 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid) { 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d/task/%d/stat", pid, tid); 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cmdline[0] = 0; 588290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley snprintf(macline, sizeof(macline), "/proc/%d/task/%d/attr/current", pid, tid); 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d/stat", pid); 618290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley sprintf(cmdline, "/proc/%d/cmdline", pid); 628290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley snprintf(macline, sizeof(macline), "/proc/%d/attr/current", pid); 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open(cmdline, O_RDONLY); 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == 0) { 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = 0; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = read(fd, cmdline, 1023); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) r = 0; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cmdline[r] = 0; 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open(statline, O_RDONLY); 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == 0) return -1; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = read(fd, statline, 1023); 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) return -1; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project statline[r] = 0; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr = statline; 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // skip pid 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr++; // skip "(" 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name = ptr; 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr = strrchr(ptr, ')'); // Skip to *last* occurence of ')', 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *ptr++ = '\0'; // and null-terminate name. 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr++; // skip " " 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = nexttok(&ptr); 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppid = atoi(nexttok(&ptr)); 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // pgrp 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sid 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tty = atoi(nexttok(&ptr)); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // tpgid 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // flags 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // minflt 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cminflt 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // majflt 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cmajflt 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 1 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project utime = atoi(nexttok(&ptr)); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stime = atoi(nexttok(&ptr)); 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // utime 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // stime 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cutime 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cstime 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prio = atoi(nexttok(&ptr)); 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nice = atoi(nexttok(&ptr)); 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // threads 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // itrealvalue 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // starttime 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vss = strtoul(nexttok(&ptr), 0, 10); // vsize 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rss = strtoul(nexttok(&ptr), 0, 10); // rss 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // rlim 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // startcode 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // endcode 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // startstack 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // kstkesp 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project eip = strtoul(nexttok(&ptr), 0, 10); // kstkeip 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // signal 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // blocked 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sigignore 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sigcatch 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project wchan = strtoul(nexttok(&ptr), 0, 10); // wchan 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // nswap 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cnswap 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // exit signal 1328b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt psr = atoi(nexttok(&ptr)); // processor 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rtprio = atoi(nexttok(&ptr)); // rt_priority 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sched = atoi(nexttok(&ptr)); // scheduling policy 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tty = atoi(nexttok(&ptr)); 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid != 0) { 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppid = pid; 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid = tid; 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pw = getpwuid(stats.st_uid); 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(pw == 0) { 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(user,"%d",(int)stats.st_uid); 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(user,pw->pw_name); 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!namefilter || !strncmp(name, namefilter, strlen(namefilter))) { 1518290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley if (display_flags & SHOW_MACLABEL) { 1528290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley fd = open(macline, O_RDONLY); 1538290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley strcpy(macline, "-"); 1548290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley if (fd >= 0) { 1558290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley r = read(fd, macline, sizeof(macline)-1); 1568290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley close(fd); 1578290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley if (r > 0) 1588290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley macline[r] = 0; 1598290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } 1608290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley printf("%-30s %-9s %-5d %-5d %s\n", macline, user, pid, ppid, cmdline[0] ? cmdline : name); 1618290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley return 0; 1628290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } 1638290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley 164392744175c4de67dc98e72da6745e6351118c985San Mehat printf("%-9s %-5d %-5d %-6d %-5d", user, pid, ppid, vss / 1024, rss * 4); 1658b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt if (display_flags & SHOW_CPU) 1668b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt printf(" %-2d", psr); 1678b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt if (display_flags & SHOW_PRIO) 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf(" %-5d %-5d %-5d %-5d", prio, nice, rtprio, sched); 169392744175c4de67dc98e72da6745e6351118c985San Mehat if (display_flags & SHOW_POLICY) { 170392744175c4de67dc98e72da6745e6351118c985San Mehat SchedPolicy p; 171392744175c4de67dc98e72da6745e6351118c985San Mehat if (get_sched_policy(pid, &p) < 0) 172392744175c4de67dc98e72da6745e6351118c985San Mehat printf(" un "); 17386c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten else 17486c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten printf(" %.2s ", get_sched_policy_name(p)); 175392744175c4de67dc98e72da6745e6351118c985San Mehat } 1768f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf(" %08x %08x %s ", wchan, eip, state); 1778f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if (display_flags & SHOW_ABI) { 1788f197e65790265b362fc01c5f730365dc7dc1809Kenny Root print_exe_abi(pid); 1798f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 1808f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("%s", cmdline[0] ? cmdline : name); 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(display_flags&SHOW_TIME) 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf(" (u:%d, s:%d)", utime, stime); 183392744175c4de67dc98e72da6745e6351118c985San Mehat 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("\n"); 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1898f197e65790265b362fc01c5f730365dc7dc1809Kenny Rootstatic void print_exe_abi(int pid) 1908f197e65790265b362fc01c5f730365dc7dc1809Kenny Root{ 1918f197e65790265b362fc01c5f730365dc7dc1809Kenny Root int fd, r; 1928f197e65790265b362fc01c5f730365dc7dc1809Kenny Root char exeline[1024]; 1938f197e65790265b362fc01c5f730365dc7dc1809Kenny Root 1948f197e65790265b362fc01c5f730365dc7dc1809Kenny Root sprintf(exeline, "/proc/%d/exe", pid); 1958f197e65790265b362fc01c5f730365dc7dc1809Kenny Root fd = open(exeline, O_RDONLY); 1968f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if(fd == 0) { 1978f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf(" "); 1988f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 1998f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2008f197e65790265b362fc01c5f730365dc7dc1809Kenny Root r = read(fd, exeline, 5 /* 4 byte ELFMAG + 1 byte EI_CLASS */); 2018f197e65790265b362fc01c5f730365dc7dc1809Kenny Root close(fd); 2028f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if(r < 0) { 2038f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf(" "); 2048f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2058f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2068f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if (memcmp("\177ELF", exeline, 4) != 0) { 2078f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("?? "); 2088f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2098f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2108f197e65790265b362fc01c5f730365dc7dc1809Kenny Root switch (exeline[4]) { 2118f197e65790265b362fc01c5f730365dc7dc1809Kenny Root case 1: 2128f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("32 "); 2138f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2148f197e65790265b362fc01c5f730365dc7dc1809Kenny Root case 2: 2158f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("64 "); 2168f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2178f197e65790265b362fc01c5f730365dc7dc1809Kenny Root default: 2188f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("?? "); 2198f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2208f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2218f197e65790265b362fc01c5f730365dc7dc1809Kenny Root} 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ps_threads(int pid, char *namefilter) 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char tmp[128]; 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *d; 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(tmp,"/proc/%d/task",pid); 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = opendir(tmp); 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(d == 0) return; 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((de = readdir(d)) != 0){ 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(isdigit(de->d_name[0])){ 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tid = atoi(de->d_name); 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid == pid) continue; 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ps_line(pid, tid, namefilter); 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project closedir(d); 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ps_main(int argc, char **argv) 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *d; 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *namefilter = 0; 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pidfilter = 0; 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int threads = 0; 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = opendir("/proc"); 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(d == 0) return -1; 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc > 1){ 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[1],"-t")) { 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project threads = 1; 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