Jens Michaelsen pointed out that Linksys' firmware download side moved.
[oweals/busybox.git] / procps / ps.c
index a610bb2188b96a2bb600f45259928f5fe5256fb7..9dc68395ae1996117251e8d06f4431cc884a4074 100644 (file)
@@ -7,6 +7,7 @@
  * 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"
 #if ENABLE_SELINUX
 #include <selinux/selinux.h>  /* for is_selinux_enabled()  */
 #endif
 
-#define TERMINAL_WIDTH 80
-
-extern int ps_main(int argc, char **argv)
+int ps_main(int argc, char **argv)
 {
        procps_status_t * p;
-       int i, len, terminal_width;
+       int i, len;
+
 #if ENABLE_SELINUX
        int use_selinux = 0;
        security_context_t sid=NULL;
 #endif
 
-       get_terminal_width_height(0, &terminal_width, NULL);
+#if ENABLE_FEATURE_PS_WIDE
+       int terminal_width;
+       int w_count = 0;
+
+       bb_opt_complementally="-:ww";
+#else
+# define terminal_width 79
+#endif
 
 #if ENABLE_FEATURE_PS_WIDE || ENABLE_SELINUX
        /* handle arguments */
-       /* bb_getopt_ulflags(argc, argv,) would force a leading dash */
-       for (len = 1; len < argc; len++) {
-               char *c = argv[len];
-               while (*c) {
-                       if (ENABLE_FEATURE_PS_WIDE && *c == 'w')
-                               /* if w is given once, GNU ps sets the width to 132,
-                                * if w is given more than once, it is "unlimited"
-                                */
-                               terminal_width =
-                                       (terminal_width==TERMINAL_WIDTH) ? 132 : INT_MAX;
-#if ENABLE_SELINUX
-                       if (*c == 'c' && is_selinux_enabled())
-                               use_selinux = 1;
+#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
-                       c++;
-               }
+#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 */
 
-       /* Go one less... */
-       terminal_width--;
 #if ENABLE_SELINUX
        if (use_selinux)
          printf("  PID Context                          Stat Command\n");
@@ -68,7 +78,7 @@ extern int ps_main(int argc, char **argv)
        while ((p = procps_scan(1)) != 0)  {
                char *namecmd = p->cmd;
 #if ENABLE_SELINUX
-               if (use_selinux )
+               if (use_selinux)
                  {
                        char sbuf[128];
                        len = sizeof(sbuf);
@@ -101,14 +111,14 @@ extern int ps_main(int argc, char **argv)
                if(namecmd && namecmd[0]) {
                        if(i < 0)
                                i = 0;
-                       if(strlen(namecmd) > i)
+                       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);
                }
@@ -118,4 +128,3 @@ extern int ps_main(int argc, char **argv)
        }
        return EXIT_SUCCESS;
 }
-