Jens Michaelsen pointed out that Linksys' firmware download side moved.
[oweals/busybox.git] / procps / ps.c
index b9d15b8619131094ce568222505fb4c92a28c382..9dc68395ae1996117251e8d06f4431cc884a4074 100644 (file)
@@ -2,23 +2,12 @@
 /*
  * Mini ps implementation(s) for busybox
  *
- * Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
+ * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
+ * Licensed under the GPL v2, see the file LICENSE in this tarball.
  */
 
+#include "busybox.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
 #include <termios.h>
 #include <sys/ioctl.h>
-#include "busybox.h"
-#ifdef CONFIG_SELINUX
-#include <fs_secure.h>
-#include <ss.h>
-#include <flask_util.h>          /* for is_flask_enabled() */
+#if ENABLE_SELINUX
+#include <selinux/selinux.h>  /* for is_selinux_enabled()  */
 #endif
 
-static const int TERMINAL_WIDTH = 79;      /* not 80 in case terminal has linefold bug */
-
-
-
-extern int ps_main(int argc, char **argv)
+int ps_main(int argc, char **argv)
 {
        procps_status_t * p;
        int i, len;
-       int terminal_width = TERMINAL_WIDTH;
 
-#ifdef CONFIG_SELINUX
+#if ENABLE_SELINUX
        int use_selinux = 0;
-       security_id_t sid;
-       if(is_flask_enabled() && argv[1] && !strcmp(argv[1], "-c") )
-               use_selinux = 1;
+       security_context_t sid=NULL;
 #endif
 
-       get_terminal_width_height(0, &terminal_width, NULL);
-       /* Go one less... */
-       terminal_width--;
+#if ENABLE_FEATURE_PS_WIDE
+       int terminal_width;
+       int w_count = 0;
 
-#ifdef CONFIG_SELINUX
-       if(use_selinux)
-               printf("  PID Context                          Stat Command\n");
-       else
-#endif
-       printf("  PID  Uid     VmSize Stat Command\n");
-#ifdef CONFIG_SELINUX
-       while ((p = procps_scan(1, use_selinux, &sid)) != 0) {
+       bb_opt_complementally="-:ww";
 #else
-       while ((p = procps_scan(1)) != 0) {
+# define terminal_width 79
 #endif
-               char *namecmd = p->cmd;
 
-#ifdef CONFIG_SELINUX
-               if(use_selinux)
-               {
+#if ENABLE_FEATURE_PS_WIDE || ENABLE_SELINUX
+       /* handle arguments */
+#if ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX
+       i = bb_getopt_ulflags(argc, argv, "wc", &w_count);
+#elif ENABLE_FEATURE_PS_WIDE && !ENABLE_SELINUX
+       bb_getopt_ulflags(argc, argv, "w", &w_count);
+#else /* !ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX */
+       i = bb_getopt_ulflags(argc, argv, "c");
+#endif
+#if ENABLE_FEATURE_PS_WIDE
+       /* if w is given once, GNU ps sets the width to 132,
+        * if w is given more than once, it is "unlimited"
+        */
+       if(w_count) {
+               terminal_width = (w_count==1) ? 132 : INT_MAX;
+       } else {
+               get_terminal_width_height(1, &terminal_width, NULL);
+               /* Go one less... */
+               terminal_width--;
+       }
+#endif
+#if ENABLE_SELINUX
+       if ((i & (1+ENABLE_FEATURE_PS_WIDE)) && is_selinux_enabled())
+               use_selinux = 1;
+#endif
+#endif  /* ENABLE_FEATURE_PS_WIDE || ENABLE_SELINUX */
+
+#if ENABLE_SELINUX
+       if (use_selinux)
+         printf("  PID Context                          Stat Command\n");
+       else
+#endif
+         printf("  PID  Uid     VmSize Stat Command\n");
+
+       while ((p = procps_scan(1)) != 0)  {
+               char *namecmd = p->cmd;
+#if ENABLE_SELINUX
+               if (use_selinux)
+                 {
                        char sbuf[128];
                        len = sizeof(sbuf);
-                       if(security_sid_to_context(sid, (security_context_t)&sbuf, &len))
-                               strcpy(sbuf, "unknown");
 
+                       if (is_selinux_enabled()) {
+                         if (getpidcon(p->pid,&sid)<0)
+                           sid=NULL;
+                       }
+
+                       if (sid) {
+                         /*  I assume sid initilized with NULL  */
+                         len = strlen(sid)+1;
+                         safe_strncpy(sbuf, sid, len);
+                         freecon(sid);
+                         sid=NULL;
+                       }else {
+                         safe_strncpy(sbuf, "unknown",7);
+                       }
                        len = printf("%5d %-32s %s ", p->pid, sbuf, p->state);
                }
                else
 #endif
-               if(p->rss == 0)
-                       len = printf("%5d %-8s        %s ", p->pid, p->user, p->state);
-               else
-                       len = printf("%5d %-8s %6ld %s ", p->pid, p->user, p->rss, p->state);
+                 if(p->rss == 0)
+                   len = printf("%5d %-8s        %s ", p->pid, p->user, p->state);
+                 else
+                   len = printf("%5d %-8s %6ld %s ", p->pid, p->user, p->rss, p->state);
+
                i = terminal_width-len;
 
-               if(namecmd != 0 && namecmd[0] != 0) {
+               if(namecmd && namecmd[0]) {
                        if(i < 0)
-               i = 0;
-                       if(strlen(namecmd) > i)
+                               i = 0;
+                       if(strlen(namecmd) > (size_t)i)
                                namecmd[i] = 0;
                        printf("%s\n", namecmd);
                } else {
                        namecmd = p->short_cmd;
                        if(i < 2)
                                i = 2;
-                       if(strlen(namecmd) > (i-2))
+                       if(strlen(namecmd) > ((size_t)i-2))
                                namecmd[i-2] = 0;
                        printf("[%s]\n", namecmd);
                }
-               free(p->cmd);
+               /* no check needed, but to make valgrind happy..  */
+               if (ENABLE_FEATURE_CLEAN_UP && p->cmd)
+                       free(p->cmd);
        }
        return EXIT_SUCCESS;
 }
-