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