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