X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/802872889c7d96c6c02b1383bee07880c62dc22b..647d0ea2dedf292593f7d95d287d445c297ccca2:/usr/src/bin/ps/ps.c diff --git a/usr/src/bin/ps/ps.c b/usr/src/bin/ps/ps.c index 66b18ee7c9..b9f238bbc0 100644 --- a/usr/src/bin/ps/ps.c +++ b/usr/src/bin/ps/ps.c @@ -2,7 +2,33 @@ * 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 @@ -12,7 +38,7 @@ char copyright[] = #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 @@ -23,10 +49,10 @@ static char sccsid[] = "@(#)ps.c 5.39 (Berkeley) %G%"; #include #include #include +#include #include #include #include -#include #include #include #include @@ -76,6 +102,7 @@ main(argc, argv) 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 && @@ -93,7 +120,9 @@ main(argc, argv) 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; @@ -109,6 +138,7 @@ main(argc, argv) case 'j': parsefmt(jfmt); fmt = 1; + jfmt[0] = '\0'; break; case 'L': showkey(); @@ -116,14 +146,22 @@ main(argc, argv) case 'l': parsefmt(lfmt); fmt = 1; + lfmt[0] = '\0'; + break; + case 'M': + memf = optarg; break; case 'm': sortby = SORTMEM; break; + case 'N': + nlistf = optarg; + break; case 'O': parsefmt(o1); parsefmt(optarg); parsefmt(o2); + o1[0] = o2[0] = '\0'; fmt = 1; break; case 'o': @@ -142,7 +180,7 @@ main(argc, argv) break; case 'T': if ((optarg = ttyname(STDIN_FILENO)) == NULL) - error("stdin: not a terminal"); + err("stdin: not a terminal"); /* FALLTHROUGH */ case 't': { char *ttypath; @@ -156,13 +194,10 @@ main(argc, argv) _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)) - error("%s: not a terminal", ttypath); + err("%s: not a terminal", ttypath); ttydev = stbuf.st_rdev; break; } @@ -170,11 +205,16 @@ main(argc, argv) parsefmt(ufmt); sortby = SORTCPU; fmt = 1; + ufmt[0] = '\0'; break; case 'v': parsefmt(vfmt); sortby = SORTMEM; fmt = 1; + vfmt[0] = '\0'; + break; + case 'W': + swapf = optarg; break; case 'w': if (termwidth < 131) @@ -192,18 +232,20 @@ main(argc, argv) argc -= optind; argv += optind; +#define BACKWARD_COMPATIBILITY +#ifdef BACKWARD_COMPATIBILITY 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); @@ -228,18 +270,16 @@ main(argc, argv) } else if (pid != -1) { what = KINFO_PROC_PID; flag = pid; + } else + what = KINFO_PROC_ALL; /* * 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); @@ -306,17 +346,15 @@ saveuser(ki) 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) { + ki->ki_u = usp; /* * save important fields */ @@ -331,7 +369,8 @@ saveuser(ki) usp->u_cru = up->u_cru; usp->u_acflag = up->u_acflag; #endif - } + } else + free(usp); } pscomp(k1, k2) @@ -374,10 +413,8 @@ kludge_oldps_options(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 '-' */ @@ -417,27 +454,38 @@ kludge_oldps_options(s) return (newopts); } -#ifdef lint -/* VARARGS1 */ -error(fmt) char *fmt; { (void) fputs(fmt, stderr); exit(1); /* NOTREACHED */ } +#if __STDC__ +#include +#else +#include +#endif + +void +#if __STDC__ +err(const char *fmt, ...) #else -error(fmt) +err(fmt, va_alist) char *fmt; + va_dcl +#endif { va_list ap; - +#if __STDC__ 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); + (void)fprintf(stderr, "\n"); exit(1); + /* NOTREACHED */ } -#endif 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); }