aboutsummaryrefslogtreecommitdiff
path: root/procps/ps.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-11-05 00:43:51 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-11-05 00:43:51 +0000
commit459e4d6cf77940977a064edab60c7162731554fb (patch)
tree5deb7d2b82c280440761cceb4281738867d5631a /procps/ps.c
parentfa07680091d20f9da1f8fa2c145dd92b5d62ae09 (diff)
downloadbusybox-w32-459e4d6cf77940977a064edab60c7162731554fb.tar.gz
busybox-w32-459e4d6cf77940977a064edab60c7162731554fb.tar.bz2
busybox-w32-459e4d6cf77940977a064edab60c7162731554fb.zip
replace /proc scanning code by more versatile one.
Use it where appropriate. Stop scanning /etc/passwd *for every process*!!! (uid->username) top: reduce memory usage - we won't save unneeded fields from /proc info anymore. Downside: ~+250 bytes of code
Diffstat (limited to 'procps/ps.c')
-rw-r--r--procps/ps.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/procps/ps.c b/procps/ps.c
index 9d6e42d79..2ff6e77d4 100644
--- a/procps/ps.c
+++ b/procps/ps.c
@@ -11,7 +11,7 @@
11 11
12int ps_main(int argc, char **argv) 12int ps_main(int argc, char **argv)
13{ 13{
14 procps_status_t * p; 14 procps_status_t *p = NULL;
15 int i, len; 15 int i, len;
16 SKIP_SELINUX(const) int use_selinux = 0; 16 SKIP_SELINUX(const) int use_selinux = 0;
17 USE_SELINUX(security_context_t sid = NULL;) 17 USE_SELINUX(security_context_t sid = NULL;)
@@ -50,7 +50,13 @@ int ps_main(int argc, char **argv)
50 else 50 else
51 puts(" PID Uid VmSize Stat Command"); 51 puts(" PID Uid VmSize Stat Command");
52 52
53 while ((p = procps_scan(1)) != 0) { 53 while ((p = procps_scan(p, 0
54 | PSSCAN_PID
55 | PSSCAN_UIDGID
56 | PSSCAN_STATE
57 | PSSCAN_RSS
58 | PSSCAN_CMD
59 ))) {
54 char *namecmd = p->cmd; 60 char *namecmd = p->cmd;
55#if ENABLE_SELINUX 61#if ENABLE_SELINUX
56 if (use_selinux) { 62 if (use_selinux) {
@@ -71,13 +77,18 @@ int ps_main(int argc, char **argv)
71 } else { 77 } else {
72 safe_strncpy(sbuf, "unknown", 7); 78 safe_strncpy(sbuf, "unknown", 7);
73 } 79 }
74 len = printf("%5u %-32s %s ", (unsigned)p->pid, sbuf, p->state); 80 len = printf("%5u %-32s %s ", p->pid, sbuf, p->state);
75 } else 81 } else
76#endif 82#endif
83 {
84 const char *user = get_cached_username(p->uid);
77 if (p->rss == 0) 85 if (p->rss == 0)
78 len = printf("%5u %-8s %s ", (unsigned)p->pid, p->user, p->state); 86 len = printf("%5u %-8s %s ",
87 p->pid, user, p->state);
79 else 88 else
80 len = printf("%5u %-8s %6ld %s ", (unsigned)p->pid, p->user, p->rss, p->state); 89 len = printf("%5u %-8s %6ld %s ",
90 p->pid, user, p->rss, p->state);
91 }
81 92
82 i = terminal_width-len; 93 i = terminal_width-len;
83 94
@@ -88,16 +99,15 @@ int ps_main(int argc, char **argv)
88 namecmd[i] = 0; 99 namecmd[i] = 0;
89 puts(namecmd); 100 puts(namecmd);
90 } else { 101 } else {
91 namecmd = p->short_cmd; 102 namecmd = p->comm;
92 if (i < 2) 103 if (i < 2)
93 i = 2; 104 i = 2;
94 if (strlen(namecmd) > ((size_t)i-2)) 105 if (strlen(namecmd) > ((size_t)i-2))
95 namecmd[i-2] = 0; 106 namecmd[i-2] = 0;
96 printf("[%s]\n", namecmd); 107 printf("[%s]\n", namecmd);
97 } 108 }
98 /* no check needed, but to make valgrind happy.. */
99 if (ENABLE_FEATURE_CLEAN_UP && p->cmd)
100 free(p->cmd);
101 } 109 }
110 if (ENABLE_FEATURE_CLEAN_UP)
111 clear_username_cache();
102 return EXIT_SUCCESS; 112 return EXIT_SUCCESS;
103} 113}