ps.c revision 392744175c4de67dc98e72da6745e6351118c985
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 Project
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *nexttoksep(char **strp, char *sep)
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *p = strsep(strp,sep);
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return (p == 0) ? "" : p;
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *nexttok(char **strp)
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return nexttoksep(strp, " ");
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHOW_PRIO 1
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHOW_TIME 2
29392744175c4de67dc98e72da6745e6351118c985San Mehat#define SHOW_POLICY 4
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int display_flags = 0;
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int ps_line(int pid, int tid, char *namefilter)
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char statline[1024];
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char cmdline[1024];
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char user[32];
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct stat stats;
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int fd, r;
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *ptr, *name, *state;
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int ppid, tty;
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    unsigned wchan, rss, vss, eip;
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    unsigned utime, stime;
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int prio, nice, rtprio, sched;
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct passwd *pw;
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    sprintf(statline, "/proc/%d", pid);
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    stat(statline, &stats);
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(tid) {
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        sprintf(statline, "/proc/%d/task/%d/stat", pid, tid);
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        cmdline[0] = 0;
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        sprintf(statline, "/proc/%d/stat", pid);
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        sprintf(cmdline, "/proc/%d/cmdline", pid);
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fd = open(cmdline, O_RDONLY);
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(fd == 0) {
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            r = 0;
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            r = read(fd, cmdline, 1023);
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            close(fd);
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if(r < 0) r = 0;
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        cmdline[r] = 0;
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fd = open(statline, O_RDONLY);
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(fd == 0) return -1;
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    r = read(fd, statline, 1023);
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close(fd);
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(r < 0) return -1;
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    statline[r] = 0;
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ptr = statline;
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // skip pid
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ptr++;          // skip "("
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    name = ptr;
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ptr = strrchr(ptr, ')'); // Skip to *last* occurence of ')',
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    *ptr++ = '\0';           // and null-terminate name.
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ptr++;          // skip " "
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    state = nexttok(&ptr);
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ppid = atoi(nexttok(&ptr));
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // pgrp
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // sid
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tty = atoi(nexttok(&ptr));
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // tpgid
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // flags
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // minflt
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // cminflt
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // majflt
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // cmajflt
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 1
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    utime = atoi(nexttok(&ptr));
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    stime = atoi(nexttok(&ptr));
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // utime
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // stime
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // cutime
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // cstime
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    prio = atoi(nexttok(&ptr));
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nice = atoi(nexttok(&ptr));
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // threads
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // itrealvalue
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // starttime
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    vss = strtoul(nexttok(&ptr), 0, 10); // vsize
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    rss = strtoul(nexttok(&ptr), 0, 10); // rss
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // rlim
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // startcode
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // endcode
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // startstack
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // kstkesp
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    eip = strtoul(nexttok(&ptr), 0, 10); // kstkeip
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // signal
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // blocked
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // sigignore
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // sigcatch
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    wchan = strtoul(nexttok(&ptr), 0, 10); // wchan
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // nswap
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // cnswap
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // exit signal
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    nexttok(&ptr); // processor
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    rtprio = atoi(nexttok(&ptr)); // rt_priority
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    sched = atoi(nexttok(&ptr)); // scheduling policy
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    tty = atoi(nexttok(&ptr));
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(tid != 0) {
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ppid = pid;
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        pid = tid;
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pw = getpwuid(stats.st_uid);
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(pw == 0) {
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        sprintf(user,"%d",(int)stats.st_uid);
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        strcpy(user,pw->pw_name);
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(!namefilter || !strncmp(name, namefilter, strlen(namefilter))) {
144392744175c4de67dc98e72da6745e6351118c985San Mehat        printf("%-9s %-5d %-5d %-6d %-5d", user, pid, ppid, vss / 1024, rss * 4);
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(display_flags&SHOW_PRIO)
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            printf(" %-5d %-5d %-5d %-5d", prio, nice, rtprio, sched);
147392744175c4de67dc98e72da6745e6351118c985San Mehat        if (display_flags & SHOW_POLICY) {
148392744175c4de67dc98e72da6745e6351118c985San Mehat            SchedPolicy p;
149392744175c4de67dc98e72da6745e6351118c985San Mehat            if (get_sched_policy(pid, &p) < 0)
150392744175c4de67dc98e72da6745e6351118c985San Mehat                printf(" un ");
151392744175c4de67dc98e72da6745e6351118c985San Mehat            else {
152392744175c4de67dc98e72da6745e6351118c985San Mehat                if (p == SP_BACKGROUND)
153392744175c4de67dc98e72da6745e6351118c985San Mehat                    printf(" bg ");
154392744175c4de67dc98e72da6745e6351118c985San Mehat                else if (p == SP_FOREGROUND)
155392744175c4de67dc98e72da6745e6351118c985San Mehat                    printf(" fg ");
156392744175c4de67dc98e72da6745e6351118c985San Mehat                else
157392744175c4de67dc98e72da6745e6351118c985San Mehat                    printf(" er ");
158392744175c4de67dc98e72da6745e6351118c985San Mehat            }
159392744175c4de67dc98e72da6745e6351118c985San Mehat        }
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf(" %08x %08x %s %s", wchan, eip, state, cmdline[0] ? cmdline : name);
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(display_flags&SHOW_TIME)
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            printf(" (u:%d, s:%d)", utime, stime);
163392744175c4de67dc98e72da6745e6351118c985San Mehat
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("\n");
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ps_threads(int pid, char *namefilter)
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char tmp[128];
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    DIR *d;
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct dirent *de;
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    sprintf(tmp,"/proc/%d/task",pid);
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    d = opendir(tmp);
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(d == 0) return;
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while((de = readdir(d)) != 0){
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(isdigit(de->d_name[0])){
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            int tid = atoi(de->d_name);
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if(tid == pid) continue;
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ps_line(pid, tid, namefilter);
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    closedir(d);
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ps_main(int argc, char **argv)
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    DIR *d;
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct dirent *de;
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char *namefilter = 0;
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int pidfilter = 0;
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int threads = 0;
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    d = opendir("/proc");
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(d == 0) return -1;
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while(argc > 1){
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(!strcmp(argv[1],"-t")) {
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            threads = 1;
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if(!strcmp(argv[1],"-x")) {
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            display_flags |= SHOW_TIME;
206392744175c4de67dc98e72da6745e6351118c985San Mehat        } else if(!strcmp(argv[1],"-P")) {
207392744175c4de67dc98e72da6745e6351118c985San Mehat            display_flags |= SHOW_POLICY;
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else if(!strcmp(argv[1],"-p")) {
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            display_flags |= SHOW_PRIO;
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }  else if(isdigit(argv[1][0])){
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            pidfilter = atoi(argv[1]);
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        } else {
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            namefilter = argv[1];
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argc--;
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv++;
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
219392744175c4de67dc98e72da6745e6351118c985San Mehat    printf("USER     PID   PPID  VSIZE  RSS   %s %s WCHAN    PC         NAME\n",
220392744175c4de67dc98e72da6745e6351118c985San Mehat           (display_flags&SHOW_PRIO)?"PRIO  NICE  RTPRI SCHED ":"",
221392744175c4de67dc98e72da6745e6351118c985San Mehat           (display_flags&SHOW_POLICY)?"PCY " : "");
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while((de = readdir(d)) != 0){
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(isdigit(de->d_name[0])){
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            int pid = atoi(de->d_name);
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if(!pidfilter || (pidfilter == pid)) {
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                ps_line(pid, 0, namefilter);
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                if(threads) ps_threads(pid, namefilter);
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    closedir(d);
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
235