reads: fix bug 1078
[oweals/busybox.git] / libbb / procps.c
index 2ebe66e9db16ddab671d9cfafbab678133d246bb..eba90705cc8b7bfbb4448caed79273f28f2f4ba1 100644 (file)
@@ -4,15 +4,15 @@
  *
  * Copyright 1998 by Albert Cahalan; all rights reserved.
  * Copyright (C) 2002 by Vladimir Oleynik <dzo@simtreas.ru>
- * GNU Library General Public License Version 2, or any later version
  *
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
 #include <dirent.h>
 #include <string.h>
 #include <stdlib.h>
+#include <sys/param.h>
 #include <unistd.h>
-#include <asm/page.h>
 #include <fcntl.h>
 
 #include "libbb.h"
 
 static int read_to_buf(const char *filename, void *buf)
 {
-       int fd;
        ssize_t ret;
-
-       fd = open(filename, O_RDONLY);
-       if(fd < 0)
-               return -1;
-       ret = read(fd, buf, PROCPS_BUFSIZE);
-       close(fd);
+       ret = open_read_close(filename, buf, PROCPS_BUFSIZE-1);
+       ((char *)buf)[ret > 0 ? ret : 0] = '\0';
        return ret;
 }
 
 
-extern procps_status_t * procps_scan(int save_user_arg0)
+procps_status_t * procps_scan(int save_user_arg0)
 {
        static DIR *dir;
        struct dirent *entry;
@@ -50,12 +45,11 @@ extern procps_status_t * procps_scan(int save_user_arg0)
        struct stat sb;
 
        if (!dir) {
-               dir = opendir("/proc");
-               if(!dir)
-                       bb_error_msg_and_die("Can't open /proc");
+               dir = xopendir("/proc");
        }
-       for(;;) {
-               if((entry = readdir(dir)) == NULL) {
+       for (;;) {
+               entry = readdir(dir);
+               if (entry == NULL) {
                        closedir(dir);
                        dir = 0;
                        return 0;
@@ -69,16 +63,17 @@ extern procps_status_t * procps_scan(int save_user_arg0)
                curstatus.pid = pid;
 
                status_tail = status + sprintf(status, "/proc/%d", pid);
-               if(stat(status, &sb))
+               if (stat(status, &sb))
                        continue;
                bb_getpwuid(curstatus.user, sb.st_uid, sizeof(curstatus.user));
 
+               /* see proc(5) for some details on this */
                strcpy(status_tail, "/stat");
                n = read_to_buf(status, buf);
-               if(n < 0)
+               if (n < 0)
                        continue;
                name = strrchr(buf, ')'); /* split into "PID (cmd" and "<rest>" */
-               if(name == 0 || name[1] != ' ')
+               if (name == 0 || name[1] != ' ')
                        continue;
                *name = 0;
                sscanf(buf, "%*s (%15c", curstatus.short_cmd);
@@ -87,15 +82,15 @@ extern procps_status_t * procps_scan(int save_user_arg0)
                "%*s %*s %*s %*s "     /* pgrp, session, tty, tpgid */
                "%*s %*s %*s %*s %*s " /* flags, min_flt, cmin_flt, maj_flt, cmaj_flt */
 #ifdef CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE
-               "%lu %lu "
+               "%lu %lu "             /* utime, stime */
 #else
-               "%*s %*s "
+               "%*s %*s "             /* utime, stime */
 #endif
                "%*s %*s %*s "         /* cutime, cstime, priority */
-               "%ld "
+               "%ld "                 /* nice */
                "%*s %*s %*s "         /* timeout, it_real_value, start_time */
                "%*s "                 /* vsize */
-               "%ld",
+               "%ld",                 /* rss */
                curstatus.state, &curstatus.ppid,
 #ifdef CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE
                &curstatus.utime, &curstatus.stime,
@@ -103,9 +98,9 @@ extern procps_status_t * procps_scan(int save_user_arg0)
                &tasknice,
                &curstatus.rss);
 #ifdef CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE
-               if(n != 6)
+               if (n != 6)
 #else
-               if(n != 4)
+               if (n != 4)
 #endif
                        continue;
 
@@ -126,21 +121,21 @@ extern procps_status_t * procps_scan(int save_user_arg0)
                curstatus.rss *= (getpagesize() >> 10);     /* 2**10 = 1kb */
 #endif
 
-               if(save_user_arg0) {
+               if (save_user_arg0) {
                        strcpy(status_tail, "/cmdline");
                        n = read_to_buf(status, buf);
-                       if(n > 0) {
-                               if(buf[n-1]=='\n')
+                       if (n > 0) {
+                               if (buf[n-1]=='\n')
                                        buf[--n] = 0;
                                name = buf;
-                               while(n) {
-                                       if(((unsigned char)*name) < ' ')
+                               while (n) {
+                                       if (((unsigned char)*name) < ' ')
                                                *name = ' ';
                                        name++;
                                        n--;
                                }
                                *name = 0;
-                               if(buf[0])
+                               if (buf[0])
                                        curstatus.cmd = strdup(buf);
                                /* if NULL it work true also */
                        }
@@ -148,12 +143,3 @@ extern procps_status_t * procps_scan(int save_user_arg0)
                return memcpy(&ret_status, &curstatus, sizeof(procps_status_t));
        }
 }
-
-/* END CODE */
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/