remove umask
[unix-history] / usr / src / bin / ps / ps.c
index 269f2ac..3ac08b8 100644 (file)
@@ -12,7 +12,7 @@ char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)ps.c       5.27 (Berkeley) %G%";
+static char sccsid[] = "@(#)ps.c       5.30 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <machine/pte.h>
 #endif /* not lint */
 
 #include <machine/pte.h>
@@ -30,26 +30,30 @@ static char sccsid[] = "@(#)ps.c    5.27 (Berkeley) %G%";
 #include <pwd.h>
 #include <math.h>
 #include <errno.h>
 #include <pwd.h>
 #include <math.h>
 #include <errno.h>
+#include <stddef.h>
 #include <stdio.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <ctype.h>
 #include <ctype.h>
+#include <varargs.h>
 #include <kvm.h>
 #include <kvm.h>
+#include "pathnames.h"
 
 struct usave {
        struct  proc *u_procp;
        struct  timeval u_start;
        struct  rusage u_ru;
        struct  rusage u_cru;
 
 struct usave {
        struct  proc *u_procp;
        struct  timeval u_start;
        struct  rusage u_ru;
        struct  rusage u_cru;
-       short   u_cmask;
        char    u_acflag;
 };
 
 /*
  * to compute offset in common structures
  */
        char    u_acflag;
 };
 
 /*
  * to compute offset in common structures
  */
-#define        POFF(x)         ((int)&((struct proc *)0)->x)
-#define        EOFF(x)         ((int)&((struct eproc *)0)->x)
-#define        UOFF(x)         ((int)&((struct usave *)0)->x)
-#define        ROFF(x)         ((int)&((struct rusage *)0)->x)
+#define        POFF(x)         offsetof(struct proc, x)
+#define        EOFF(x)         offsetof(struct eproc, x)
+#define        UOFF(x)         offsetof(struct usave, x)
+#define        ROFF(x)         offsetof(struct rusage, x)
 
 enum type      { CHAR, UCHAR, SHORT, USHORT, LONG, ULONG, KPTR };
 
 
 enum type      { CHAR, UCHAR, SHORT, USHORT, LONG, ULONG, KPTR };
 
@@ -61,23 +65,23 @@ enum type   { CHAR, UCHAR, SHORT, USHORT, LONG, ULONG, KPTR };
 
 int needuser, needcomm, neednlist;
 
 
 int needuser, needcomm, neednlist;
 
-int    command(), ucomm(), logname(), pvar(), evar(), uvar(), rvar(), uname(), 
+int    command(), ucomm(), logname(), pvar(), evar(), uvar(), rvar(), uname(),
        runame(), state(), pri(), tdev(), tname(), longtname(), started(),
        runame(), state(), pri(), tdev(), tname(), longtname(), started(),
-       lstarted(), wchan(), vsize(), rssize(), p_rssize(), cputime(), 
+       lstarted(), wchan(), vsize(), rssize(), p_rssize(), cputime(),
        pmem(), pcpu(), pagein(), maxrss(), tsize(), trss();
        /**
        utime(), stime(), ixrss(), idrss(), isrss();
        **/
 
        pmem(), pcpu(), pagein(), maxrss(), tsize(), trss();
        /**
        utime(), stime(), ixrss(), idrss(), isrss();
        **/
 
-struct usave *saveuser();
-char   *saveargs();
+uid_t  getuid();
+char   *ttyname();
 
 struct var {
 
 struct var {
-       char    *name[8];       /* name(s) of variable */
+       char    *name[4];       /* name(s) of variable */
        char    *header;        /* default header */
        int     flag;
 #define        USER    0x01    /* requires user structure */
        char    *header;        /* default header */
        int     flag;
 #define        USER    0x01    /* requires user structure */
-#define        LJUST   0x02    /* right adjust on output */
+#define        LJUST   0x02    /* left adjust on output (trailing blanks) */
 #define        COMM    0x04    /* requires exec arguments and environment (XXX) */
 #define        NLIST   0x08    /* requires nlist to get extra variables */
        int     (*oproc)();     /* output routine */
 #define        COMM    0x04    /* requires exec arguments and environment (XXX) */
 #define        NLIST   0x08    /* requires nlist to get extra variables */
        int     (*oproc)();     /* output routine */
@@ -95,8 +99,8 @@ struct var {
         */
        struct  var *next;
 }  var[] = {
         */
        struct  var *next;
 }  var[] = {
-       {{"command", "comm", "args"}, "COMMAND", USER|LJUST|COMM, 
-               command, 16}, 
+       {{"command", "comm", "args"}, "COMMAND", USER|LJUST|COMM,
+               command, 16},
        {{"ucomm"}, "COMMAND",  LJUST, ucomm, MAXCOMLEN},
        {{"logname"}, "LOGNAME", LJUST, logname, MAXLOGNAME},
        {{"flag", "f"}, "F", 0, pvar, 7, POFF(p_flag), LONG, "x"},
        {{"ucomm"}, "COMMAND",  LJUST, ucomm, MAXCOMLEN},
        {{"logname"}, "LOGNAME", LJUST, logname, MAXLOGNAME},
        {{"flag", "f"}, "F", 0, pvar, 7, POFF(p_flag), LONG, "x"},
@@ -134,21 +138,19 @@ struct var {
        {{"tname", "tty", "tt"}, "TT", LJUST, tname, 3},
        {{"longtname", "longtty"}, "TT", LJUST, longtname, 8},
        {{"tpgid"}, "TPGID", 0, evar, 4, EOFF(e_tpgid), USHORT, PIDFMT},
        {{"tname", "tty", "tt"}, "TT", LJUST, tname, 3},
        {{"longtname", "longtty"}, "TT", LJUST, longtname, 8},
        {{"tpgid"}, "TPGID", 0, evar, 4, EOFF(e_tpgid), USHORT, PIDFMT},
-       {{"tsession", "tsess"}, "TSESS", 
+       {{"tsession", "tsess"}, "TSESS",
                0, evar, 6, EOFF(e_tsess), KPTR, "x"},
        {{"paddr", "procaddr"}, "PADDR",
                0, evar, 6, EOFF(e_paddr), KPTR, "x"},
        {{"state", "stat"}, "STAT", 0, state, 4},
        {{"pri"}, "PRI", 0, pri, 3},
        {{"usrpri"}, "UPR", 0, pvar, 3, POFF(p_usrpri), CHAR, "d"},
                0, evar, 6, EOFF(e_tsess), KPTR, "x"},
        {{"paddr", "procaddr"}, "PADDR",
                0, evar, 6, EOFF(e_paddr), KPTR, "x"},
        {{"state", "stat"}, "STAT", 0, state, 4},
        {{"pri"}, "PRI", 0, pri, 3},
        {{"usrpri"}, "UPR", 0, pvar, 3, POFF(p_usrpri), CHAR, "d"},
-       {{"nice", "ni"}, "NI", 0, pvar, 2, POFF(p_nice), CHAR, "d"}, 
+       {{"nice", "ni"}, "NI", 0, pvar, 2, POFF(p_nice), CHAR, "d"},
        {{"vsize", "vsz"}, "VSZ", 0, vsize, 5},
        {{"rssize", "rsz"}, "RSZ", 0, rssize, 4},
        {{"rss", "p_rss"}, "RSS", 0, p_rssize, 4},
        {{"u_procp", "uprocp"}, "UPROCP",
                USER, uvar, 6, UOFF(u_procp), KPTR, "x"},
        {{"vsize", "vsz"}, "VSZ", 0, vsize, 5},
        {{"rssize", "rsz"}, "RSZ", 0, rssize, 4},
        {{"rss", "p_rss"}, "RSS", 0, p_rssize, 4},
        {{"u_procp", "uprocp"}, "UPROCP",
                USER, uvar, 6, UOFF(u_procp), KPTR, "x"},
-       {{"umask", "u_cmask"}, "UMASK",
-               USER, uvar, 3, UOFF(u_cmask), CHAR, "#o"},
        {{"acflag", "acflg"}, "ACFLG",
                USER, uvar, 3, UOFF(u_acflag), SHORT, "x"},
        {{"start"}, "STARTED", USER|LJUST, started, 8},
        {{"acflag", "acflg"}, "ACFLG",
                USER, uvar, 3, UOFF(u_acflag), SHORT, "x"},
        {{"start"}, "STARTED", USER|LJUST, started, 8},
@@ -172,31 +174,31 @@ struct var {
        {{"idrss"}, "IDRSS", USER, idrss, 4},
        {{"isrss"}, "ISRSS", USER, isrss, 4},
        ***/
        {{"idrss"}, "IDRSS", USER, idrss, 4},
        {{"isrss"}, "ISRSS", USER, isrss, 4},
        ***/
-       {{"minflt"}, "MINFLT", 
+       {{"minflt"}, "MINFLT",
                USER, rvar, 4, ROFF(ru_minflt), LONG, "d"},
                USER, rvar, 4, ROFF(ru_minflt), LONG, "d"},
-       {{"majflt"}, "MAJFLT", 
+       {{"majflt"}, "MAJFLT",
                USER, rvar, 4, ROFF(ru_majflt), LONG, "d"},
                USER, rvar, 4, ROFF(ru_majflt), LONG, "d"},
-       {{"nswap"}, "NSWAP",    
+       {{"nswap"}, "NSWAP",
                USER, rvar, 4, ROFF(ru_nswap), LONG, "d"},
                USER, rvar, 4, ROFF(ru_nswap), LONG, "d"},
-       {{"inblock", "inblk"}, "INBLK",         
+       {{"inblock", "inblk"}, "INBLK",
                USER, rvar, 4, ROFF(ru_inblock), LONG, "d"},
                USER, rvar, 4, ROFF(ru_inblock), LONG, "d"},
-       {{"oublock", "oublk"}, "OUBLK", 
+       {{"oublock", "oublk"}, "OUBLK",
                USER, rvar, 4, ROFF(ru_oublock), LONG, "d"},
                USER, rvar, 4, ROFF(ru_oublock), LONG, "d"},
-       {{"msgsnd"}, "MSGSND", 
+       {{"msgsnd"}, "MSGSND",
                USER, rvar, 4, ROFF(ru_msgsnd), LONG, "d"},
                USER, rvar, 4, ROFF(ru_msgsnd), LONG, "d"},
-       {{"msgrcv"}, "MSGRCV", 
+       {{"msgrcv"}, "MSGRCV",
                USER, rvar, 4, ROFF(ru_msgrcv), LONG, "d"},
                USER, rvar, 4, ROFF(ru_msgrcv), LONG, "d"},
-       {{"nsignals", "nsigs"}, "NSIGS", 
+       {{"nsignals", "nsigs"}, "NSIGS",
                USER, rvar, 4, ROFF(ru_nsignals), LONG, "d"},
                USER, rvar, 4, ROFF(ru_nsignals), LONG, "d"},
-       {{"nvcsw", "vcsw"}, "VCSW", 
+       {{"nvcsw", "vcsw"}, "VCSW",
                USER, rvar, 5, ROFF(ru_nvcsw), LONG, "d"},
                USER, rvar, 5, ROFF(ru_nvcsw), LONG, "d"},
-       {{"nivcsw", "ivcsw"}, "IVCSW", 
+       {{"nivcsw", "ivcsw"}, "IVCSW",
                USER, rvar, 5, ROFF(ru_nivcsw), LONG, "d"},
        NULL
 };
 
                USER, rvar, 5, ROFF(ru_nivcsw), LONG, "d"},
        NULL
 };
 
-/* 
- * combination variables 
+/*
+ * combination variables
  */
 struct combovar {
        char *name;
  */
 struct combovar {
        char *name;
@@ -260,26 +262,26 @@ fixpt_t   ccpu;
 
 #define USAGE  "ps [ -(o|O) fmt ] [ -wlvujnsaxSCLmcr ] [ -p pid ] [ -t tty ]"
 
 
 #define USAGE  "ps [ -(o|O) fmt ] [ -wlvujnsaxSCLmcr ] [ -p pid ] [ -t tty ]"
 
-main (argc, argv) 
+main(argc, argv)
+       int argc;
        char *argv[];
 {
        extern char *optarg;
        extern int optind;
        char *argv[];
 {
        extern char *optarg;
        extern int optind;
-       int ch; 
-       register i;
+       int ch;
+       register int i;
        register struct var *v;
        register struct proc *p;
        struct winsize ws;
        register struct var *v;
        register struct proc *p;
        struct winsize ws;
-       struct kinfo_proc *kprocs;
-       int nentries;
+       size_t nentries;
        int fmt = 0;
        int pscomp();
        int what, flag;
        char *kludge_oldps_options();
 
        int fmt = 0;
        int pscomp();
        int what, flag;
        char *kludge_oldps_options();
 
-       if ((ioctl(1, TIOCGWINSZ, &ws) == -1 && 
-            ioctl(2, TIOCGWINSZ, &ws) == -1 &&
-            ioctl(0, TIOCGWINSZ, &ws) == -1) ||
+       if ((ioctl(1, TIOCGWINSZ, (char *)&ws) == -1 &&
+            ioctl(2, TIOCGWINSZ, (char *)&ws) == -1 &&
+            ioctl(0, TIOCGWINSZ, (char *)&ws) == -1) ||
             ws.ws_col == 0)
                termwidth = 79;
        else
             ws.ws_col == 0)
                termwidth = 79;
        else
@@ -328,32 +330,25 @@ main (argc, argv)
                        fmt++;
                        break;
                case 'T':
                        fmt++;
                        break;
                case 'T':
+                       if ((optarg = ttyname(0)) == NULL)
+                               error("<stdin>: not a terminal");
+                       /* FALLTHROUGH */
                case 't': {
                case 't': {
+                       char *ttypath;
                        struct stat stbuf;
                        struct stat stbuf;
-                       char *tname, *ttyname();
-                       char termname[MAXPATHLEN+1];
-
-                       if (ch == 'T') {
-                               if ((tname = ttyname(0)) == NULL)
-                                       error("<stdin>: not a terminal");
-                       } else 
-                               tname = optarg;
-                       if (strlen(tname) == 2) {
-                               if (strcmp(tname, "co") == 0)
-                                       strcpy(termname, "/dev/console");
-                               else {
-                                       strcpy(termname, "/dev/tty");
-                                       strcat(termname, tname);
-                               }
-                       } else if (*tname != '/') {
-                               strcpy(termname, "/dev/");
-                               strcat(termname, tname);
-                       } else
-                               strcpy(termname, tname);
-                       if (stat(termname, &stbuf) == -1)
-                               syserror(termname);
+                       char pathbuf[MAXPATHLEN];
+
+                       if (strcmp(optarg, "co") == 0)
+                               ttypath = _PATH_CONSOLE;
+                       else if (*optarg != '/')
+                               (void) sprintf(ttypath = pathbuf, "%s%s",
+                                   _PATH_TTY, optarg);
+                       else
+                               ttypath = optarg;
+                       if (stat(ttypath, &stbuf) == -1)
+                               syserror(ttypath);
                        if ((stbuf.st_mode & S_IFMT) != S_IFCHR)
                        if ((stbuf.st_mode & S_IFMT) != S_IFCHR)
-                               error("%s: not a terminal", termname);
+                               error("%s: not a terminal", ttypath);
                        ttydev = stbuf.st_rdev;
                        break;
                }
                        ttydev = stbuf.st_rdev;
                        break;
                }
@@ -368,26 +363,23 @@ main (argc, argv)
                        rawcpu++;
                        break;
                case 'L': {
                        rawcpu++;
                        break;
                case 'L': {
-                       int i = 0;
                        struct combovar *cb = &combovar[0];
                        struct combovar *cb = &combovar[0];
-                       char *cp;
-
-                       v = &var[0];
-                       for (;;) {
-                               if (v->name[0] != NULL) {
-                                       cp = v->name[0];
-                                       v++;
-                               } else if (cb->name != NULL) {
-                                       cp = cb->name;
-                                       cb++;
-                               } else
+                       char *cp, *sep = "";
+
+                       for (i = 0, v = &var[0];;) {
+                               if (v->name[0] != NULL)
+                                       cp = v++->name[0];
+                               else if (cb->name != NULL)
+                                       cp = cb++->name;
+                               else
                                        break;
                                        break;
-                               if (termwidth && 
-                                  (i += strlen(cp)+1) > termwidth)
-                                       i = strlen(cp), printf("\n");
-                               printf("%s ", cp);
+                               if (termwidth &&
+                                   (i += strlen(cp) + 1) > termwidth)
+                                       i = strlen(cp), sep = "\n";
+                               (void) printf("%s%s", sep, cp);
+                               sep = " ";
                        }
                        }
-                       printf("\n");
+                       (void) printf("\n");
                        exit(0);
                }
                case 'a':
                        exit(0);
                }
                case 'a':
@@ -409,12 +401,12 @@ main (argc, argv)
                        break;  /* no-op */
                case '?':
                default:
                        break;  /* no-op */
                case '?':
                default:
-                       fprintf(stderr, "usage: %s\n", USAGE);
+                       (void) fprintf(stderr, "usage: %s\n", USAGE);
                        exit(1);
                }
        argc -= optind;
        argv += optind;
                        exit(1);
                }
        argc -= optind;
        argv += optind;
-       
+
        if (*argv) {
                char *nlistf, *memf = NULL, *swapf = NULL;
 
        if (*argv) {
                char *nlistf, *memf = NULL, *swapf = NULL;
 
@@ -439,10 +431,8 @@ main (argc, argv)
         * and adjusting header widths as appropiate.
         */
        scanvars();
         * and adjusting header widths as appropiate.
         */
        scanvars();
-#ifdef notdef
        if (sortby == SORTCPU)
                neednlist = 1;
        if (sortby == SORTCPU)
                neednlist = 1;
-#endif
        if (neednlist)
                donlist();
        /*
        if (neednlist)
                donlist();
        /*
@@ -457,13 +447,11 @@ 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
         */
        if ((nentries = kvm_getprocs(what, flag)) == -1) {
        /*
         * select procs
         */
        if ((nentries = kvm_getprocs(what, flag)) == -1) {
-               fprintf(stderr, "ps: %s\n", kvm_geterr());
+               (void) fprintf(stderr, "ps: %s\n", kvm_geterr());
                exit(1);
        }
        kinfo = (struct kinfo *)malloc(nentries * sizeof (struct kinfo));
                exit(1);
        }
        kinfo = (struct kinfo *)malloc(nentries * sizeof (struct kinfo));
@@ -487,7 +475,7 @@ main (argc, argv)
        /*
         * sort proc list
         */
        /*
         * sort proc list
         */
-       qsort(kinfo, nentries, sizeof (struct kinfo), pscomp);
+       qsort((void *)kinfo, nentries, sizeof (struct kinfo), pscomp);
        /*
         * for each proc, call each variable output function.
         */
        /*
         * for each proc, call each variable output function.
         */
@@ -498,11 +486,11 @@ main (argc, argv)
                for (v = vhead; v != NULL; v = v->next) {
                        (*v->oproc)(&kinfo[i], v);
                        if (v->next != NULL)
                for (v = vhead; v != NULL; v = v->next) {
                        (*v->oproc)(&kinfo[i], v);
                        if (v->next != NULL)
-                               putchar(' ');
+                               (void) putchar(' ');
                }
                }
-               putchar('\n');
+               (void) putchar('\n');
                if (prtheader && lineno++ == prtheader-4) {
                if (prtheader && lineno++ == prtheader-4) {
-                       putchar('\n');
+                       (void) putchar('\n');
                        printheader();
                        lineno = 0;
                }
                        printheader();
                        lineno = 0;
                }
@@ -516,43 +504,28 @@ main (argc, argv)
 parsefmt(fmt)
        char *fmt;
 {
 parsefmt(fmt)
        char *fmt;
 {
-       register char *f = fmt, *cp, *hp;
+       register char *cp, *hp;
        struct var *v;
        struct var *v;
-       char *strtok(), *index();
-       char newbuf[1024], *nb = newbuf; /* XXX */
        char *lookupcombo();
        struct var *lookupvar();
        char *lookupcombo();
        struct var *lookupvar();
-       
-       /*
-        * strtok is not &^%^& re-entrant, so we have
-        * only one level of expansion, looking for combo
-        * variables once here, and expanding the string
-        * before really parsing it.  With strtok_r,
-        * you would move the expansion to before the
-        * lookupvar inside the 2nd while loop with a
-        * recursive call to parsefmt.
-        */
-       while ((cp = strtok(f, FMTSEP)) != NULL) {
-               if ((hp = lookupcombo(cp)) == NULL);
-                       hp = cp;
-               if (((nb + strlen(hp)) - newbuf) >= 1024)
-                       error("format too large");
-               strcpy(nb, hp);
-               while (*nb)
-                       nb++;
-               *nb++ = ' ';
-               *nb =  '\0';
-               f = NULL;
-       }
-       f = newbuf;
-       while ((cp = strtok(f, FMTSEP)) != NULL) {
-               if (hp = index(cp, '='))
+
+       while (fmt) {
+               while ((cp = strsep(&fmt, FMTSEP)) != NULL && *cp == '\0')
+                       /* void */;
+               if ((hp = lookupcombo(cp)) != NULL) {
+                       parsefmt(hp);
+                       continue;
+               }
+               if ((hp = index(cp, '=')) != NULL)
                        *hp++ = '\0';
                v = lookupvar(cp);
                if (v == NULL)
                        error("unknown variable in format: %s", cp);
                        *hp++ = '\0';
                v = lookupvar(cp);
                if (v == NULL)
                        error("unknown variable in format: %s", cp);
-               if (v->next != NULL || vtail == v)
-                       error("can't specify a variable twice: %s", cp);
+               if (v->next != NULL || vtail == v) {
+                       (void) fprintf(stderr,
+                           "ps: can't specify a variable twice: %s\n", cp);
+                       continue;
+               }
                if (hp)
                        v->header = hp;
                if (vhead == NULL)
                if (hp)
                        v->header = hp;
                if (vhead == NULL)
@@ -561,9 +534,7 @@ parsefmt(fmt)
                        vtail->next = v;
                        vtail = v;
                }
                        vtail->next = v;
                        vtail = v;
                }
-               f = NULL;       /* for strtok */
        }
        }
-
 }
 
 scanvars()
 }
 
 scanvars()
@@ -585,6 +556,7 @@ scanvars()
        }
        totwidth--;
 }
        }
        totwidth--;
 }
+
 printheader()
 {
        register struct var *v;
 printheader()
 {
        register struct var *v;
@@ -592,54 +564,54 @@ printheader()
        for (v = vhead; v != NULL; v = v->next) {
                if (v->flag & LJUST) {
                        if (v->next == NULL)    /* last one */
        for (v = vhead; v != NULL; v = v->next) {
                if (v->flag & LJUST) {
                        if (v->next == NULL)    /* last one */
-                               printf("%s", v->header);
+                               (void) printf("%s", v->header);
                        else
                        else
-                               printf("%-*s",v->width, v->header);
+                               (void) printf("%-*s", v->width, v->header);
                } else
                } else
-                       printf("%*s",v->width, v->header);
+                       (void) printf("%*s", v->width, v->header);
                if (v->next != NULL)
                if (v->next != NULL)
-                       putchar(' ');
+                       (void) putchar(' ');
        }
        }
-       putchar('\n');
+       (void) putchar('\n');
 }
 
 }
 
-command(k, v) 
+command(k, v)
        struct kinfo *k;
        struct var *v;
 {
 
        struct kinfo *k;
        struct var *v;
 {
 
-       if (v->next == NULL) {          
+       if (v->next == NULL) {
                /* last field */
                if (termwidth == UNLIMITED)
                /* last field */
                if (termwidth == UNLIMITED)
-                       printf("%s", k->ki_args);
+                       (void) printf("%s", k->ki_args);
                else {
                else {
-                       register left = termwidth - (totwidth - v->width);
+                       register int left = termwidth - (totwidth - v->width);
                        register char *cp = k->ki_args;
 
                        register char *cp = k->ki_args;
 
-                       if (left < 1)   /* already wrapped, just use std width */
+                       if (left < 1) /* already wrapped, just use std width */
                                left = v->width;
                                left = v->width;
-                       while (left-- && *cp)
-                               putchar(*cp++);
+                       while (--left >= 0 && *cp)
+                               (void) putchar(*cp++);
                }
        } else
                }
        } else
-               printf("%-*.*s", v->width, v->width, k->ki_args);
-               
+               (void) printf("%-*.*s", v->width, v->width, k->ki_args);
+
 }
 
 }
 
-ucomm(k, v) 
+ucomm(k, v)
        struct kinfo *k;
        struct var *v;
 {
 
        struct kinfo *k;
        struct var *v;
 {
 
-       printf("%-*s", v->width, k->ki_p->p_comm);
+       (void) printf("%-*s", v->width, k->ki_p->p_comm);
 }
 
 }
 
-logname(k, v) 
+logname(k, v)
        struct kinfo *k;
        struct var *v;
 {
 
        struct kinfo *k;
        struct var *v;
 {
 
-       printf("%-*s", v->width, k->ki_p->p_logname);
+       (void) printf("%-*s", v->width, k->ki_p->p_logname);
 }
 
 state(k, v)
 }
 
 state(k, v)
@@ -660,7 +632,7 @@ state(k, v)
        case SSLEEP:
                if (flag & SSINTR)      /* interuptable (long) */
                        *cp = p->p_slptime >= MAXSLP ? 'I' : 'S';
        case SSLEEP:
                if (flag & SSINTR)      /* interuptable (long) */
                        *cp = p->p_slptime >= MAXSLP ? 'I' : 'S';
-               else 
+               else
                        *cp = (flag & SPAGE) ? 'P' : 'D';
                break;
 
                        *cp = (flag & SPAGE) ? 'P' : 'D';
                break;
 
@@ -703,7 +675,7 @@ state(k, v)
        if ((flag & SCTTY) && k->ki_e->e_pgid == k->ki_e->e_tpgid)
                *cp++ = '+';
        *cp = '\0';
        if ((flag & SCTTY) && k->ki_e->e_pgid == k->ki_e->e_tpgid)
                *cp++ = '+';
        *cp = '\0';
-       printf("%-*s", v->width, buf);
+       (void) printf("%-*s", v->width, buf);
 }
 
 pri(k, v)
 }
 
 pri(k, v)
@@ -711,7 +683,7 @@ pri(k, v)
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%*d", v->width, k->ki_p->p_pri - PZERO);
+       (void) printf("%*d", v->width, k->ki_p->p_pri - PZERO);
 }
 
 uname(k, v)
 }
 
 uname(k, v)
@@ -719,7 +691,7 @@ uname(k, v)
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%-*s", v->width, user_from_uid(k->ki_p->p_uid, 0));
+       (void) printf("%-*s", v->width, user_from_uid(k->ki_p->p_uid, 0));
 }
 
 runame(k, v)
 }
 
 runame(k, v)
@@ -727,7 +699,7 @@ runame(k, v)
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%-*s", v->width, user_from_uid(k->ki_p->p_ruid, 0));
+       (void) printf("%-*s", v->width, user_from_uid(k->ki_p->p_ruid, 0));
 }
 
 tdev(k, v)
 }
 
 tdev(k, v)
@@ -737,12 +709,12 @@ tdev(k, v)
        dev_t dev = k->ki_e->e_tdev;
 
        if (dev == NODEV)
        dev_t dev = k->ki_e->e_tdev;
 
        if (dev == NODEV)
-               printf("%*s", v->width, "??");
+               (void) printf("%*s", v->width, "??");
        else {
                char buff[16];
 
        else {
                char buff[16];
 
-               sprintf(buff, "%d/%d", major(dev), minor(dev));
-               printf("%*s", v->width, buff);
+               (void) sprintf(buff, "%d/%d", major(dev), minor(dev));
+               (void) printf("%*s", v->width, buff);
        }
 }
 
        }
 }
 
@@ -753,14 +725,14 @@ tname(k, v)
        struct var *v;
 {
        dev_t dev = k->ki_e->e_tdev;
        struct var *v;
 {
        dev_t dev = k->ki_e->e_tdev;
-       char *tname;
+       char *ttname;
 
 
-       if (dev == NODEV || (tname = devname(dev, S_IFCHR)) == NULL)
-               printf("%-*s", v->width, "??");
+       if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
+               (void) printf("%-*s", v->width, "??");
        else {
        else {
-               if (strncmp(tname, "tty", 3) == 0)
-                       tname += 3;
-               printf("%*.*s%c", v->width-1, v->width-1, tname,
+               if (strncmp(ttname, "tty", 3) == 0)
+                       ttname += 3;
+               (void) printf("%*.*s%c", v->width-1, v->width-1, ttname,
                        k->ki_e->e_flag & EPROC_CTTY ? ' ' : '-');
        }
 }
                        k->ki_e->e_flag & EPROC_CTTY ? ' ' : '-');
        }
 }
@@ -770,12 +742,12 @@ longtname(k, v)
        struct var *v;
 {
        dev_t dev = k->ki_e->e_tdev;
        struct var *v;
 {
        dev_t dev = k->ki_e->e_tdev;
-       char *tname;
+       char *ttname;
 
 
-       if (dev == NODEV || (tname = devname(dev, S_IFCHR)) == NULL)
-               printf("%-*s", v->width, "??");
+       if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
+               (void) printf("%-*s", v->width, "??");
        else
        else
-               printf("%-*s", v->width, tname);
+               (void) printf("%-*s", v->width, ttname);
 }
 
 #include <sys/time.h>
 }
 
 #include <sys/time.h>
@@ -786,9 +758,9 @@ started(k, v)
 {
        extern char *attime();
 
 {
        extern char *attime();
 
-       printf("%-*s", v->width, k->ki_u ? 
+       (void) printf("%-*s", v->width, k->ki_u ?
                attime(&k->ki_u->u_start.tv_sec) : "-");
                attime(&k->ki_u->u_start.tv_sec) : "-");
-               
+
 }
 
 lstarted(k, v)
 }
 
 lstarted(k, v)
@@ -796,13 +768,13 @@ lstarted(k, v)
        struct var *v;
 {
        extern char *ctime();
        struct var *v;
 {
        extern char *ctime();
-       char *tp; 
+       char *tp;
 
        if (k->ki_u)
                (tp = ctime(&k->ki_u->u_start.tv_sec))[24] = '\0';
        else
                tp = "-";
 
        if (k->ki_u)
                (tp = ctime(&k->ki_u->u_start.tv_sec))[24] = '\0';
        else
                tp = "-";
-       printf("%-*s", v->width, tp);
+       (void) printf("%-*s", v->width, tp);
 }
 
 wchan(k, v)
 }
 
 wchan(k, v)
@@ -812,22 +784,21 @@ wchan(k, v)
 
        if (k->ki_p->p_wchan) {
                if (k->ki_p->p_pri > PZERO)
 
        if (k->ki_p->p_wchan) {
                if (k->ki_p->p_pri > PZERO)
-                       printf("%-*.*s", v->width, v->width, k->ki_e->e_wmesg);
+                       (void) printf("%-*.*s", v->width, v->width, k->ki_e->e_wmesg);
                else
                else
-                       printf("%*x", v->width, 
+                       (void) printf("%*x", v->width,
                                (int)k->ki_p->p_wchan &~ KERNBASE);
        } else
                                (int)k->ki_p->p_wchan &~ KERNBASE);
        } else
-               printf("%-*s", v->width, "-");
+               (void) printf("%-*s", v->width, "-");
 }
 
 }
 
-#define pgtok(a)        (((a)*NBPG)/1024)
 
 vsize(k, v)
        struct kinfo *k;
        struct var *v;
 {
 
 
 vsize(k, v)
        struct kinfo *k;
        struct var *v;
 {
 
-       printf("%*d", v->width, 
+       (void) printf("%*d", v->width,
                pgtok(k->ki_p->p_dsize + k->ki_p->p_ssize + k->ki_e->e_xsize));
 }
 
                pgtok(k->ki_p->p_dsize + k->ki_p->p_ssize + k->ki_e->e_xsize));
 }
 
@@ -836,8 +807,8 @@ rssize(k, v)
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%*d", v->width, 
-               pgtok(k->ki_p->p_rssize + (k->ki_e->e_xccount ? 
+       (void) printf("%*d", v->width,
+               pgtok(k->ki_p->p_rssize + (k->ki_e->e_xccount ?
                      (k->ki_e->e_xrssize / k->ki_e->e_xccount) : 0)));
 }
 
                      (k->ki_e->e_xrssize / k->ki_e->e_xccount) : 0)));
 }
 
@@ -846,7 +817,7 @@ p_rssize(k, v)              /* doesn't account for text */
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%*d", v->width, pgtok(k->ki_p->p_rssize));
+       (void) printf("%*d", v->width, pgtok(k->ki_p->p_rssize));
 }
 
 cputime(k, v)
 }
 
 cputime(k, v)
@@ -861,14 +832,14 @@ cputime(k, v)
                secs = 0;
                psecs = 0;
        } else {
                secs = 0;
                psecs = 0;
        } else {
-               secs = k->ki_p->p_utime.tv_sec + 
+               secs = k->ki_p->p_utime.tv_sec +
                        k->ki_p->p_stime.tv_sec;
                        k->ki_p->p_stime.tv_sec;
-               psecs = k->ki_p->p_utime.tv_usec + 
+               psecs = k->ki_p->p_utime.tv_usec +
                        k->ki_p->p_stime.tv_usec;
                if (sumrusage) {
                        k->ki_p->p_stime.tv_usec;
                if (sumrusage) {
-                       secs += k->ki_u->u_cru.ru_utime.tv_sec + 
+                       secs += k->ki_u->u_cru.ru_utime.tv_sec +
                                k->ki_u->u_cru.ru_stime.tv_sec;
                                k->ki_u->u_cru.ru_stime.tv_sec;
-                       psecs += k->ki_u->u_cru.ru_utime.tv_usec + 
+                       psecs += k->ki_u->u_cru.ru_utime.tv_usec +
                                k->ki_u->u_cru.ru_stime.tv_usec;
                }
                /*
                                k->ki_u->u_cru.ru_stime.tv_usec;
                }
                /*
@@ -880,8 +851,8 @@ cputime(k, v)
                        secs++;
                }
        }
                        secs++;
                }
        }
-       sprintf(obuff, "%3ld:%02ld.%02ld", secs/60, secs%60, psecs);
-       printf("%*s", v->width, obuff);
+       (void) sprintf(obuff, "%3ld:%02ld.%02ld", secs/60, secs%60, psecs);
+       (void) printf("%*s", v->width, obuff);
 }
 
 double
 }
 
 double
@@ -910,13 +881,12 @@ pcpu(k, v)
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%*.1f", v->width, getpcpu(k));
+       (void) printf("%*.1f", v->width, getpcpu(k));
 }
 
 double
 }
 
 double
-getpmem(k, v)
+getpmem(k)
        struct kinfo *k;
        struct kinfo *k;
-       struct var *v;
 {
        struct proc *p = k->ki_p;
        struct eproc *e = k->ki_e;
 {
        struct proc *p = k->ki_p;
        struct eproc *e = k->ki_e;
@@ -929,7 +899,7 @@ getpmem(k, v)
         * gets set.
         */
 
         * gets set.
         */
 
-       if (p->p_flag & SLOAD == 0)
+       if ((p->p_flag & SLOAD) == 0)
                return (0.0);
        szptudot = UPAGES + clrnd(ctopt(p->p_dsize + p->p_ssize + e->e_xsize));
        fracmem = ((float)p->p_rssize + szptudot)/CLSIZE/ecmx;
                return (0.0);
        szptudot = UPAGES + clrnd(ctopt(p->p_dsize + p->p_ssize + e->e_xsize));
        fracmem = ((float)p->p_rssize + szptudot)/CLSIZE/ecmx;
@@ -943,7 +913,7 @@ pmem(k, v)
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%*.1f", v->width, getpmem(k));
+       (void) printf("%*.1f", v->width, getpmem(k));
 }
 
 pagein(k, v)
 }
 
 pagein(k, v)
@@ -951,7 +921,7 @@ pagein(k, v)
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%*d", v->width, k->ki_u ? k->ki_u->u_ru.ru_majflt : 0);
+       (void) printf("%*d", v->width, k->ki_u ? k->ki_u->u_ru.ru_majflt : 0);
 }
 
 maxrss(k, v)
 }
 
 maxrss(k, v)
@@ -960,17 +930,17 @@ maxrss(k, v)
 {
 
        if (k->ki_p->p_maxrss != (RLIM_INFINITY/NBPG))
 {
 
        if (k->ki_p->p_maxrss != (RLIM_INFINITY/NBPG))
-               printf("%*d", v->width, pgtok(k->ki_p->p_maxrss));
+               (void) printf("%*d", v->width, pgtok(k->ki_p->p_maxrss));
        else
        else
-               printf("%*s", v->width, "-");
+               (void) printf("%*s", v->width, "-");
 }
 
 tsize(k, v)
        struct kinfo *k;
        struct var *v;
 {
 }
 
 tsize(k, v)
        struct kinfo *k;
        struct var *v;
 {
-       
-       printf("%*d", v->width, pgtok(k->ki_e->e_xsize));
+
+       (void) printf("%*d", v->width, pgtok(k->ki_e->e_xsize));
 }
 
 trss(k, v)
 }
 
 trss(k, v)
@@ -978,49 +948,49 @@ trss(k, v)
        struct var *v;
 {
 
        struct var *v;
 {
 
-       printf("%*d", v->width, pgtok(k->ki_e->e_xrssize));
+       (void) printf("%*d", v->width, pgtok(k->ki_e->e_xrssize));
 }
 
 /*
  * Generic output routines.  Print fields from various prototype
  * structures.
  */
 }
 
 /*
  * Generic output routines.  Print fields from various prototype
  * structures.
  */
-pvar(k, v) 
+pvar(k, v)
        struct kinfo *k;
        struct var *v;
 {
        struct kinfo *k;
        struct var *v;
 {
+
        printval((char *)((char *)k->ki_p + v->off), v);
 }
 
        printval((char *)((char *)k->ki_p + v->off), v);
 }
 
-evar(k, v) 
+evar(k, v)
        struct kinfo *k;
        struct var *v;
 {
        struct kinfo *k;
        struct var *v;
 {
+
        printval((char *)((char *)k->ki_e + v->off), v);
 }
 
        printval((char *)((char *)k->ki_e + v->off), v);
 }
 
-uvar(k, v) 
+uvar(k, v)
        struct kinfo *k;
        struct var *v;
 {
        struct kinfo *k;
        struct var *v;
 {
+
        if (k->ki_u)
                printval((char *)((char *)k->ki_u + v->off), v);
        else
        if (k->ki_u)
                printval((char *)((char *)k->ki_u + v->off), v);
        else
-               printf("%*s", v->width, "-");
+               (void) printf("%*s", v->width, "-");
 }
 
 rvar(k, v)
        struct kinfo *k;
        struct var *v;
 {
 }
 
 rvar(k, v)
        struct kinfo *k;
        struct var *v;
 {
-       
+
        if (k->ki_u)
                printval((char *)((char *)(&k->ki_u->u_ru) + v->off), v);
        else
        if (k->ki_u)
                printval((char *)((char *)(&k->ki_u->u_ru) + v->off), v);
        else
-               printf("%*s", v->width, "-");
+               (void) printf("%*s", v->width, "-");
 }
 
 char *
 }
 
 char *
@@ -1063,31 +1033,31 @@ printval(bp, v)
 
        switch (v->type) {
        case CHAR:
 
        switch (v->type) {
        case CHAR:
-               printf(ofmt, v->width, *(char *)bp);
+               (void) printf(ofmt, v->width, *(char *)bp);
                break;
 
        case UCHAR:
                break;
 
        case UCHAR:
-               printf(ofmt, v->width, *(u_char *)bp);
+               (void) printf(ofmt, v->width, *(u_char *)bp);
                break;
 
        case SHORT:
                break;
 
        case SHORT:
-               printf(ofmt, v->width, *(short *)bp);
+               (void) printf(ofmt, v->width, *(short *)bp);
                break;
 
        case USHORT:
                break;
 
        case USHORT:
-               printf(ofmt, v->width, *(u_short *)bp);
+               (void) printf(ofmt, v->width, *(u_short *)bp);
                break;
 
        case LONG:
                break;
 
        case LONG:
-               printf(ofmt, v->width, *(long *)bp);
+               (void) printf(ofmt, v->width, *(long *)bp);
                break;
 
        case ULONG:
                break;
 
        case ULONG:
-               printf(ofmt, v->width, *(u_long *)bp);
+               (void) printf(ofmt, v->width, *(u_long *)bp);
                break;
 
        case KPTR:
                break;
 
        case KPTR:
-               printf(ofmt, v->width, *(u_long *)bp &~ KERNBASE);
+               (void) printf(ofmt, v->width, *(u_long *)bp &~ KERNBASE);
                break;
 
        default:
                break;
 
        default:
@@ -1096,15 +1066,14 @@ printval(bp, v)
 }
 
 /* XXX - redo */
 }
 
 /* XXX - redo */
-struct usave *
-saveuser(ki) 
+saveuser(ki)
        struct kinfo *ki;
 {
        register struct usave *usp;
        register struct user *up;
        struct kinfo *ki;
 {
        register struct usave *usp;
        register struct user *up;
-       
+
        if ((usp = (struct usave *)calloc(1, sizeof (struct usave))) == NULL) {
        if ((usp = (struct usave *)calloc(1, sizeof (struct usave))) == NULL) {
-               fprintf(stderr, "ps: out of memory\n");
+               (void) fprintf(stderr, "ps: out of memory\n");
                exit(1);
        }
        ki->ki_u = usp;
                exit(1);
        }
        ki->ki_u = usp;
@@ -1113,10 +1082,10 @@ saveuser(ki)
         * save arguments if needed
         */
        if (needcomm)
         * save arguments if needed
         */
        if (needcomm)
-               ki->ki_args = saveargs(ki->ki_p, up);
+               ki->ki_args = strdup(kvm_getargs(ki->ki_p, up));
        else
                ki->ki_args = NULL;
        else
                ki->ki_args = NULL;
-       if (up != NULL) { 
+       if (up != NULL) {
                /*
                 * save important fields
                 */
                /*
                 * save important fields
                 */
@@ -1124,22 +1093,10 @@ saveuser(ki)
                usp->u_start = up->u_start;
                usp->u_ru = up->u_ru;
                usp->u_cru = up->u_cru;
                usp->u_start = up->u_start;
                usp->u_ru = up->u_ru;
                usp->u_cru = up->u_cru;
-               usp->u_cmask = up->u_cmask;
                usp->u_acflag = up->u_acflag;
        }
                usp->u_acflag = up->u_acflag;
        }
-       return;
 }
 
 }
 
-char *
-saveargs(p, up)
-       struct proc *p;
-       struct user *up;
-{
-       char *savestr();
-
-       return(savestr(kvm_getargs(p, up)));
-}
-       
 
 pscomp(k1, k2)
        struct kinfo *k1, *k2;
 
 pscomp(k1, k2)
        struct kinfo *k1, *k2;
@@ -1149,7 +1106,7 @@ pscomp(k1, k2)
 
        if (sortby == SORTCPU)
                return (getpcpu(k2) - getpcpu(k1));
 
        if (sortby == SORTCPU)
                return (getpcpu(k2) - getpcpu(k1));
-#ifdef notyet
+#ifdef notdef
        if (sortby == SORTRUN)
                return (proc_compare(k1->ki_p, k2->ki_p));
 #endif
        if (sortby == SORTRUN)
                return (proc_compare(k1->ki_p, k2->ki_p));
 #endif
@@ -1163,40 +1120,38 @@ pscomp(k1, k2)
 
 donlist()
 {
 
 donlist()
 {
+#define kread(x, v) \
+       kvm_read(psnl[x].n_value, (char *)&v, sizeof v) != sizeof(v)
+
        if (kvm_nlist(psnl) != 0)
                error("can't get namelist");
        if (kvm_nlist(psnl) != 0)
                error("can't get namelist");
-       if (kvm_read(psnl[X_FSCALE].n_value, &fscale, sizeof(int)) !=
-           sizeof (int))
+       if (kread(X_FSCALE, fscale))
                error("error reading fscale: %s", kvm_geterr());
                error("error reading fscale: %s", kvm_geterr());
-       if (kvm_read(psnl[X_ECMX].n_value, &ecmx, sizeof(int)) !=
-           sizeof (int))
+       if (kread(X_ECMX, ecmx))
                error("error reading ecmx: %s", kvm_geterr());
                error("error reading ecmx: %s", kvm_geterr());
-       if (kvm_read(psnl[X_CCPU].n_value, &ccpu, sizeof(fixpt_t)) !=
-           sizeof (fixpt_t))
+       if (kread(X_CCPU, ccpu))
                error("error reading ccpu: %s", kvm_geterr());
                error("error reading ccpu: %s", kvm_geterr());
+#undef kread
 }
 
 }
 
-char *
-savestr(cp)
-       char *cp;
+#ifdef lint
+/* VARARGS1 */
+error(fmt) char *fmt; { (void) fputs(fmt, stderr); exit(1); /* NOTREACHED */ }
+#else
+error(va_alist)
+       va_dcl
 {
 {
-       register unsigned len;
-       register char *dp;
-
-       len = strlen(cp);
-       dp = (char *)calloc(len+1, sizeof (char));
-       (void) strcpy(dp, cp);
-       return (dp);
-}
+       char *fmt;
+       va_list ap;
 
 
-error(a, b, c, d, e)
-       char *a, *b, *c, *d, *e;
-{
-       fprintf(stderr, "ps: ");
-       fprintf(stderr, a, b, c, d, e);
-       fprintf(stderr, "\n");
+       va_start(ap);
+       fmt = va_arg(ap, char *);
+       (void) fprintf(stderr, "ps: ");
+       (void) vfprintf(stderr, fmt, ap);
+       (void) fprintf(stderr, "\n");
        exit(1);
 }
        exit(1);
 }
+#endif
 
 syserror(a)
        char *a;
 
 syserror(a)
        char *a;
@@ -1221,10 +1176,10 @@ char *
 kludge_oldps_options(s)
        char *s;
 {
 kludge_oldps_options(s)
        char *s;
 {
-       int len = strlen(s), numlen = 0;
+       size_t len = strlen(s);
        char *newopts, *ns, *cp;
 
        char *newopts, *ns, *cp;
 
-       if ((newopts = ns = (char *)malloc(len+2)) == NULL)
+       if ((newopts = ns = malloc(len + 2)) == NULL)
                error("out of memory");
        /*
         * options begin with '-'
                error("out of memory");
        /*
         * options begin with '-'
@@ -1238,7 +1193,7 @@ kludge_oldps_options(s)
        /*
         * if last letter is a 't' flag with no argument (in the context
         * of the oldps options -- option string NOT starting with a '-' --
        /*
         * if last letter is a 't' flag with no argument (in the context
         * of the oldps options -- option string NOT starting with a '-' --
-        * then convert to 'T' (meaning *this* terminal, i.e. ttyname(0).
+        * then convert to 'T' (meaning *this* terminal, i.e. ttyname(0)).
         */
        if (*cp == 't' && *s != '-')
                *cp = 'T';
         */
        if (*cp == 't' && *s != '-')
                *cp = 'T';
@@ -1247,23 +1202,20 @@ kludge_oldps_options(s)
                 * otherwise check for trailing number, which *may* be a
                 * pid.
                 */
                 * otherwise check for trailing number, which *may* be a
                 * pid.
                 */
-               while (isdigit(*cp)) {
+               while (cp >= s && isdigit(*cp))
                        --cp;
                        --cp;
-                       numlen++;
-               }
        }
        cp++;
        }
        cp++;
-       bcopy(s, ns, cp - s);   /* copy everything up to trailing number */
-       while (*ns)
-               ns++;
+       bcopy(s, ns, (size_t)(cp - s)); /* copy up to trailing number */
+       ns += cp - s;
        /*
         * if there's a trailing number, and not a preceding 'p' (pid) or
         * 't' (tty) flag, then assume it's a pid and insert a 'p' flag.
         */
        /*
         * if there's a trailing number, and not a preceding 'p' (pid) or
         * 't' (tty) flag, then assume it's a pid and insert a 'p' flag.
         */
-       if (isdigit(*cp) && (cp == s || *(cp-1) != 't' && *(cp-1) != 'p' &&
-          ((cp-1) == s || *(cp-2) != 't')))
+       if (isdigit(*cp) && (cp == s || cp[-1] != 't' && cp[-1] != 'p' &&
+           (cp - 1 == s || cp[-2] != 't')))
                *ns++ = 'p';
                *ns++ = 'p';
-       strcat(ns, cp);         /* and append the number */
+       (void) strcpy(ns, cp);          /* and append the number */
 
        return (newopts);
 }
 
        return (newopts);
 }