BSD 4_3_Net_2 release
[unix-history] / usr / src / bin / ps / ps.c
index 66b18ee..b9f238b 100644 (file)
@@ -2,7 +2,33 @@
  * Copyright (c) 1990 The Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1990 The Regents of the University of California.
  * All rights reserved.
  *
- * %sccs.include.redist.c%
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
@@ -12,7 +38,7 @@ char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)ps.c       5.39 (Berkeley) %G%";
+static char sccsid[] = "@(#)ps.c       5.43 (Berkeley) 7/1/91";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -23,10 +49,10 @@ static char sccsid[] = "@(#)ps.c    5.39 (Berkeley) %G%";
 #include <sys/stat.h>
 #include <sys/ioctl.h>
 #include <sys/kinfo.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
 #include <sys/kinfo.h>
+#include <nlist.h>
 #include <kvm.h>
 #include <errno.h>
 #include <unistd.h>
 #include <kvm.h>
 #include <errno.h>
 #include <unistd.h>
-#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -76,6 +102,7 @@ main(argc, argv)
        dev_t ttydev;
        int all, ch, flag, fmt, lineno, pid, prtheader, uid, what, xflg;
        int pscomp();
        dev_t ttydev;
        int all, ch, flag, fmt, lineno, pid, prtheader, uid, what, xflg;
        int pscomp();
+       char *nlistf, *memf, *swapf;
        char *kludge_oldps_options();
 
        if ((ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&ws) == -1 &&
        char *kludge_oldps_options();
 
        if ((ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&ws) == -1 &&
@@ -93,7 +120,9 @@ main(argc, argv)
        all = xflg = 0;
        pid = uid = -1;
        ttydev = NODEV;
        all = xflg = 0;
        pid = uid = -1;
        ttydev = NODEV;
-       while ((ch = getopt(argc, argv, "aCghjLlmO:o:p:rSTt:uvwx")) != EOF)
+       memf = nlistf = swapf = NULL;
+       while ((ch = getopt(argc, argv,
+           "aCghjLlM:mN:O:o:p:rSTt:uvW:wx")) != EOF)
                switch((char)ch) {
                case 'a':
                        all = 1;
                switch((char)ch) {
                case 'a':
                        all = 1;
@@ -109,6 +138,7 @@ main(argc, argv)
                case 'j':
                        parsefmt(jfmt);
                        fmt = 1;
                case 'j':
                        parsefmt(jfmt);
                        fmt = 1;
+                       jfmt[0] = '\0';
                        break;
                case 'L': 
                        showkey();
                        break;
                case 'L': 
                        showkey();
@@ -116,14 +146,22 @@ main(argc, argv)
                case 'l':
                        parsefmt(lfmt);
                        fmt = 1;
                case 'l':
                        parsefmt(lfmt);
                        fmt = 1;
+                       lfmt[0] = '\0';
+                       break;
+               case 'M':
+                       memf = optarg;
                        break;
                case 'm':
                        sortby = SORTMEM;
                        break;
                        break;
                case 'm':
                        sortby = SORTMEM;
                        break;
+               case 'N':
+                       nlistf = optarg;
+                       break;
                case 'O':
                        parsefmt(o1);
                        parsefmt(optarg);
                        parsefmt(o2);
                case 'O':
                        parsefmt(o1);
                        parsefmt(optarg);
                        parsefmt(o2);
+                       o1[0] = o2[0] = '\0';
                        fmt = 1;
                        break;
                case 'o':
                        fmt = 1;
                        break;
                case 'o':
@@ -142,7 +180,7 @@ main(argc, argv)
                        break;
                case 'T':
                        if ((optarg = ttyname(STDIN_FILENO)) == NULL)
                        break;
                case 'T':
                        if ((optarg = ttyname(STDIN_FILENO)) == NULL)
-                               error("stdin: not a terminal");
+                               err("stdin: not a terminal");
                        /* FALLTHROUGH */
                case 't': {
                        char *ttypath;
                        /* FALLTHROUGH */
                case 't': {
                        char *ttypath;
@@ -156,13 +194,10 @@ main(argc, argv)
                                    _PATH_TTY, optarg);
                        else
                                ttypath = optarg;
                                    _PATH_TTY, optarg);
                        else
                                ttypath = optarg;
-                       if (stat(ttypath, &stbuf) == -1) {
-                               (void)fprintf(stderr,
-                                   "ps: %s: %s\n", ttypath, strerror(errno));
-                               exit(1);
-                       }
+                       if (stat(ttypath, &stbuf) == -1)
+                               err("%s: %s", ttypath, strerror(errno));
                        if (!S_ISCHR(stbuf.st_mode))
                        if (!S_ISCHR(stbuf.st_mode))
-                               error("%s: not a terminal", ttypath);
+                               err("%s: not a terminal", ttypath);
                        ttydev = stbuf.st_rdev;
                        break;
                }
                        ttydev = stbuf.st_rdev;
                        break;
                }
@@ -170,11 +205,16 @@ main(argc, argv)
                        parsefmt(ufmt);
                        sortby = SORTCPU;
                        fmt = 1;
                        parsefmt(ufmt);
                        sortby = SORTCPU;
                        fmt = 1;
+                       ufmt[0] = '\0';
                        break;
                case 'v':
                        parsefmt(vfmt);
                        sortby = SORTMEM;
                        fmt = 1;
                        break;
                case 'v':
                        parsefmt(vfmt);
                        sortby = SORTMEM;
                        fmt = 1;
+                       vfmt[0] = '\0';
+                       break;
+               case 'W':
+                       swapf = optarg;
                        break;
                case 'w':
                        if (termwidth < 131)
                        break;
                case 'w':
                        if (termwidth < 131)
@@ -192,18 +232,20 @@ main(argc, argv)
        argc -= optind;
        argv += optind;
 
        argc -= optind;
        argv += optind;
 
+#define        BACKWARD_COMPATIBILITY
+#ifdef BACKWARD_COMPATIBILITY
        if (*argv) {
        if (*argv) {
-               char *nlistf, *memf = NULL, *swapf = NULL;
 
 
-               nlistf = *argv++;
-               if (*argv) {
-                       memf = *argv++;
-                       if (*argv)
-                               swapf = *argv++;
+               nlistf = *argv;
+               if (*++argv) {
+                       memf = *argv;
+                       if (*++argv)
+                               swapf = *argv;
                }
                }
-               if (kvm_openfiles(nlistf, memf, swapf) == -1)
-                       error("kvm_openfiles: %s", kvm_geterr());
        }
        }
+#endif
+       if (kvm_openfiles(nlistf, memf, swapf) == -1)
+               err("kvm_openfiles: %s", kvm_geterr());
 
        if (!fmt)
                parsefmt(dfmt);
 
        if (!fmt)
                parsefmt(dfmt);
@@ -228,18 +270,16 @@ main(argc, argv)
        } else if (pid != -1) {
                what = KINFO_PROC_PID;
                flag = pid;
        } else if (pid != -1) {
                what = KINFO_PROC_PID;
                flag = pid;
+       } else
+               what = KINFO_PROC_ALL;
        /*
         * select procs
         */
        /*
         * select procs
         */
-       if ((nentries = kvm_getprocs(what, flag)) == -1) {
-               (void) fprintf(stderr, "ps: %s\n", kvm_geterr());
-               exit(1);
-       }
-       kinfo = (KINFO *)malloc(nentries * sizeof(KINFO));
-       if (kinfo == NULL) {
-               (void)fprintf(stderr, "ps: %s\n", strerror(ENOMEM));
-               exit(1);
-       }
+       if ((nentries = kvm_getprocs(what, flag)) == -1)
+               err("%s", kvm_geterr());
+       kinfo = malloc(nentries * sizeof(KINFO));
+       if (kinfo == NULL)
+               err("%s", strerror(errno));
        for (nentries = 0; p = kvm_nextproc(); ++nentries) {
                kinfo[nentries].ki_p = p;
                kinfo[nentries].ki_e = kvm_geteproc(p);
        for (nentries = 0; p = kvm_nextproc(); ++nentries) {
                kinfo[nentries].ki_p = p;
                kinfo[nentries].ki_e = kvm_geteproc(p);
@@ -306,17 +346,15 @@ saveuser(ki)
        register struct usave *usp;
        register struct user *up;
 
        register struct usave *usp;
        register struct user *up;
 
-       if ((usp = (struct usave *)calloc(1, sizeof(struct usave))) == NULL) {
-               (void)fprintf(stderr, "ps: %s\n", strerror(errno));
-               exit(1);
-       }
-       ki->ki_u = usp;
+       if ((usp = calloc(1, sizeof(struct usave))) == NULL)
+               err("%s", strerror(errno));
        up = kvm_getu(ki->ki_p);
        /*
         * save arguments if needed
         */
        ki->ki_args = needcomm ? strdup(kvm_getargs(ki->ki_p, up)) : NULL;
        if (up != NULL) {
        up = kvm_getu(ki->ki_p);
        /*
         * save arguments if needed
         */
        ki->ki_args = needcomm ? strdup(kvm_getargs(ki->ki_p, up)) : NULL;
        if (up != NULL) {
+               ki->ki_u = usp;
                /*
                 * save important fields
                 */
                /*
                 * save important fields
                 */
@@ -331,7 +369,8 @@ saveuser(ki)
                usp->u_cru = up->u_cru;
                usp->u_acflag = up->u_acflag;
 #endif
                usp->u_cru = up->u_cru;
                usp->u_acflag = up->u_acflag;
 #endif
-       }
+       } else
+               free(usp);
 }
 
 pscomp(k1, k2)
 }
 
 pscomp(k1, k2)
@@ -374,10 +413,8 @@ kludge_oldps_options(s)
        char *newopts, *ns, *cp;
 
        len = strlen(s);
        char *newopts, *ns, *cp;
 
        len = strlen(s);
-       if ((newopts = ns = malloc(len + 2)) == NULL) {
-               (void)fprintf(stderr, "ps: %s\n", strerror(errno));
-               exit(1);
-       }
+       if ((newopts = ns = malloc(len + 2)) == NULL)
+               err("%s", strerror(errno));
        /*
         * options begin with '-'
         */
        /*
         * options begin with '-'
         */
@@ -417,27 +454,38 @@ kludge_oldps_options(s)
        return (newopts);
 }
 
        return (newopts);
 }
 
-#ifdef lint
-/* VARARGS1 */
-error(fmt) char *fmt; { (void) fputs(fmt, stderr); exit(1); /* NOTREACHED */ }
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+void
+#if __STDC__
+err(const char *fmt, ...)
 #else
 #else
-error(fmt)
+err(fmt, va_alist)
        char *fmt;
        char *fmt;
+        va_dcl
+#endif
 {
        va_list ap;
 {
        va_list ap;
-
+#if __STDC__
        va_start(ap, fmt);
        va_start(ap, fmt);
-       (void) fprintf(stderr, "ps: ");
-       (void) vfprintf(stderr, fmt, ap);
-       (void) fprintf(stderr, "\n");
+#else
+       va_start(ap);
+#endif
+       (void)fprintf(stderr, "ps: ");
+       (void)vfprintf(stderr, fmt, ap);
        va_end(ap);
        va_end(ap);
+       (void)fprintf(stderr, "\n");
        exit(1);
        exit(1);
+       /* NOTREACHED */
 }
 }
-#endif
 
 usage()
 {
        (void) fprintf(stderr,
 
 usage()
 {
        (void) fprintf(stderr,
-           "usage:\tps [ -aChjlmrSsTuvwx ] [ -O|o fmt ] [ -p pid ] [ -t tty ] [ system ] [ core ] [ swap ]\n\t ps [ -L ]\n");
+"usage: ps [-aChjlmrSTuvwx] [-O|o fmt] [-p pid] [-t tty]\n\t  [-M core] [-N system] [-W swap]\n       ps [-L]\n");
        exit(1);
 }
        exit(1);
 }