summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--procps/top.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/procps/top.c b/procps/top.c
index 38211b345..8e5767e41 100644
--- a/procps/top.c
+++ b/procps/top.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * A tiny 'top' utility. 2 * A tiny 'top' utility.
3 * 3 *
4 * This is written specifically for the linux 2.4 /proc/<PID>/status 4 * This is written specifically for the linux /proc/<PID>/status
5 * file format, but it checks that the file actually conforms to the 5 * file format, but it checks that the file actually conforms to the
6 * format that this utility expects. 6 * format that this utility expects.
7 7
@@ -151,19 +151,21 @@ static void display_status(int count, const status_t *s)
151/* checks if given 'buf' for process starts with 'id' + ':' + TAB 151/* checks if given 'buf' for process starts with 'id' + ':' + TAB
152 * and stores rest of the buf to 'store' with max size 'size' 152 * and stores rest of the buf to 'store' with max size 'size'
153 */ 153 */
154static void process_status(const char *buf, const char *id, char *store, size_t size) 154static int process_status(const char *buf, const char *id, char *store, size_t size)
155{ 155{
156 int len, i; 156 int len, i;
157 157
158 if (!store) {
159 /* ignoring this field */
160 return;
161 }
162
163 /* check status field name */ 158 /* check status field name */
164 len = strlen(id); 159 len = strlen(id);
165 if (strncmp(buf, id, len) != 0) { 160 if (strncmp(buf, id, len) != 0) {
166 error_msg_and_die("ERROR status: line doesn't start with '%s' in:\n%s\n", id, buf); 161 if(store)
162 error_msg_and_die("ERROR status: line doesn't start with '%s' in:\n%s\n", id, buf);
163 else
164 return 0;
165 }
166 if (!store) {
167 /* ignoring this field */
168 return 1;
167 } 169 }
168 buf += len; 170 buf += len;
169 171
@@ -193,9 +195,9 @@ static void process_status(const char *buf, const char *id, char *store, size_t
193 *store++ = *buf++; 195 *store++ = *buf++;
194 } 196 }
195 *store = '\0'; 197 *store = '\0';
198 return 1;
196} 199}
197 200
198
199/* read process statuses */ 201/* read process statuses */
200static void read_status(int num, status_t *s) 202static void read_status(int num, status_t *s)
201{ 203{
@@ -219,20 +221,20 @@ static void read_status(int num, status_t *s)
219 fgets(buf, sizeof(buf), fp); 221 fgets(buf, sizeof(buf), fp);
220 process_status(buf, "State", s->state, sizeof(s->state)); 222 process_status(buf, "State", s->state, sizeof(s->state));
221 fgets(buf, sizeof(buf), fp); 223 fgets(buf, sizeof(buf), fp);
222 process_status(buf, "Tgid", NULL, 0); 224 if(process_status(buf, "Tgid", NULL, 0))
223 fgets(buf, sizeof(buf), fp); 225 fgets(buf, sizeof(buf), fp);
224 process_status(buf, "Pid", NULL, 0); 226 process_status(buf, "Pid", NULL, 0);
225 fgets(buf, sizeof(buf), fp); 227 fgets(buf, sizeof(buf), fp);
226 process_status(buf, "PPid", s->ppid, sizeof(s->ppid)); 228 process_status(buf, "PPid", s->ppid, sizeof(s->ppid));
227 fgets(buf, sizeof(buf), fp); 229 fgets(buf, sizeof(buf), fp);
228 process_status(buf, "TracePid", NULL, 0); 230 if(process_status(buf, "TracerPid", NULL, 0))
229 fgets(buf, sizeof(buf), fp); 231 fgets(buf, sizeof(buf), fp);
230 process_status(buf, "Uid", s->uid, sizeof(s->uid)); 232 process_status(buf, "Uid", s->uid, sizeof(s->uid));
231 fgets(buf, sizeof(buf), fp); 233 fgets(buf, sizeof(buf), fp);
232 process_status(buf, "Gid", NULL, 0); 234 process_status(buf, "Gid", NULL, 0);
233 fgets(buf, sizeof(buf), fp); 235 fgets(buf, sizeof(buf), fp);
234 process_status(buf, "FDSize", NULL, 0); 236 if(process_status(buf, "FDSize", NULL, 0))
235 fgets(buf, sizeof(buf), fp); 237 fgets(buf, sizeof(buf), fp);
236 process_status(buf, "Groups", NULL, 0); 238 process_status(buf, "Groups", NULL, 0);
237 fgets(buf, sizeof(buf), fp); 239 fgets(buf, sizeof(buf), fp);
238 /* only user space processes have command line 240 /* only user space processes have command line
@@ -342,7 +344,6 @@ static int num_sort(const void *a, const void *b)
342 } 344 }
343} 345}
344 346
345
346int top_main(int argc, char **argv) 347int top_main(int argc, char **argv)
347{ 348{
348 status_t *statuslist; 349 status_t *statuslist;
@@ -353,8 +354,8 @@ int top_main(int argc, char **argv)
353#endif 354#endif
354 /* Default update rate is 5 seconds */ 355 /* Default update rate is 5 seconds */
355 interval = 5; 356 interval = 5;
356 /* Default to 25 lines */ 357 /* Default to 25 lines - 5 lines for status */
357 lines = 25; 358 lines = 25 - 5;
358 359
359 /* do normal option parsing */ 360 /* do normal option parsing */
360 while ((opt = getopt(argc, argv, "d:")) > 0) { 361 while ((opt = getopt(argc, argv, "d:")) > 0) {
@@ -370,7 +371,7 @@ int top_main(int argc, char **argv)
370#if defined CONFIG_FEATURE_AUTOWIDTH && defined CONFIG_FEATURE_USE_TERMIOS 371#if defined CONFIG_FEATURE_AUTOWIDTH && defined CONFIG_FEATURE_USE_TERMIOS
371 ioctl(fileno(stdout), TIOCGWINSZ, &win); 372 ioctl(fileno(stdout), TIOCGWINSZ, &win);
372 if (win.ws_row > 4) 373 if (win.ws_row > 4)
373 lines = win.ws_row - 6; 374 lines = win.ws_row - 5;
374#endif 375#endif
375 376
376 /* change to proc */ 377 /* change to proc */