Print this page
2989 Eliminate use of LOGNAME_MAX in ON
1166 useradd have warning with name more 8 chars


   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*


  23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  *
  26  * Portions Copyright 2009 Chad Mynhier
  27  */
  28 
  29 #include <sys/types.h>
  30 #include <sys/resource.h>
  31 #include <sys/loadavg.h>
  32 #include <sys/time.h>
  33 #include <sys/pset.h>
  34 #include <sys/vm_usage.h>
  35 #include <zone.h>
  36 #include <libzonecfg.h>
  37 
  38 #include <stdio.h>
  39 #include <stdlib.h>
  40 #include <unistd.h>
  41 #include <dirent.h>
  42 #include <string.h>


  58 #include "prtable.h"
  59 #include "prsort.h"
  60 #include "prfile.h"
  61 
  62 /*
  63  * x86 <sys/regs.h> ERR conflicts with <curses.h> ERR.  For the purposes
  64  * of this file, we care about the curses.h ERR so include that last.
  65  */
  66 
  67 #if     defined(ERR)
  68 #undef  ERR
  69 #endif
  70 
  71 #ifndef TEXT_DOMAIN                     /* should be defined by cc -D */
  72 #define TEXT_DOMAIN     "SYS_TEST"      /* use this only if it wasn't */
  73 #endif
  74 
  75 #include <curses.h>
  76 #include <term.h>
  77 




  78 #define PSINFO_HEADER_PROC \
  79 "   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP       "
  80 #define PSINFO_HEADER_PROC_LGRP \
  81 "   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU LGRP PROCESS/NLWP  "
  82 #define PSINFO_HEADER_LWP \
  83 "   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/LWPID      "
  84 #define PSINFO_HEADER_LWP_LGRP \
  85 "   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU LGRP PROCESS/LWPID "
  86 #define USAGE_HEADER_PROC \
  87 "   PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/NLWP  "
  88 #define USAGE_HEADER_LWP \
  89 "   PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/LWPID "
  90 #define USER_HEADER_PROC \
  91 " NPROC USERNAME  SWAP   RSS MEMORY      TIME  CPU                             "
  92 #define USER_HEADER_LWP \
  93 "  NLWP USERNAME  SWAP   RSS MEMORY      TIME  CPU                             "
  94 #define TASK_HEADER_PROC \
  95 "TASKID    NPROC  SWAP   RSS MEMORY      TIME  CPU PROJECT                     "
  96 #define TASK_HEADER_LWP \
  97 "TASKID     NLWP  SWAP   RSS MEMORY      TIME  CPU PROJECT                     "
  98 #define PROJECT_HEADER_PROC \
  99 "PROJID    NPROC  SWAP   RSS MEMORY      TIME  CPU PROJECT                     "
 100 #define PROJECT_HEADER_LWP \
 101 "PROJID     NLWP  SWAP   RSS MEMORY      TIME  CPU PROJECT                     "
 102 #define ZONE_HEADER_PROC \
 103 "ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE                        "
 104 #define ZONE_HEADER_LWP \
 105 "ZONEID     NLWP  SWAP   RSS MEMORY      TIME  CPU ZONE                        "
 106 #define PSINFO_LINE \
 107 "%6d %-8s %5s %5s %-6s %3s  %3s %9s %3.3s%% %-.16s/%d"
 108 #define PSINFO_LINE_LGRP \
 109 "%6d %-8s %5s %5s %-6s %3s  %3s %9s %3.3s%% %4d %-.16s/%d"
 110 #define USAGE_LINE \
 111 "%6d %-8s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s "\
 112 "%3.3s %-.12s/%d"
 113 #define USER_LINE \
 114 "%6d %-8s %5.5s %5.5s   %3.3s%% %9s %3.3s%%"
 115 #define TASK_LINE \
 116 "%6d %8d %5s %5s   %3.3s%% %9s %3.3s%% %28s"
 117 #define PROJECT_LINE \
 118 "%6d %8d %5s %5s   %3.3s%% %9s %3.3s%% %28s"
 119 #define ZONE_LINE \
 120 "%6d %8d %5s %5s   %3.3s%% %9s %3.3s%% %28s"
 121 
 122 #define TOTAL_LINE \
 123 "Total: %d processes, %d lwps, load averages: %3.2f, %3.2f, %3.2f"
 124 
 125 /* global variables */
 126 
 127 static char     *t_ulon;                        /* termcap: start underline */
 128 static char     *t_uloff;                       /* termcap: end underline */
 129 static char     *t_up;                          /* termcap: cursor 1 line up */
 130 static char     *t_eol;                         /* termcap: clear end of line */
 131 static char     *t_smcup;                       /* termcap: cursor mvcap on */
 132 static char     *t_rmcup;                       /* termcap: cursor mvcap off */


 429         (void) putchar('\n');
 430 
 431         for (i = 0; i < list->l_used; i++) {
 432                 switch (list->l_type) {
 433                 case LT_PROJECTS:
 434                 case LT_TASKS:
 435                 case LT_USERS:
 436                 case LT_ZONES:
 437                         id = list->l_ptrs[i];
 438                         /*
 439                          * CPU usage and memory usage normalization
 440                          */
 441                         if (total_cpu >= 100)
 442                                 cpu = (100 * id->id_pctcpu) / total_cpu;
 443                         else
 444                                 cpu = id->id_pctcpu;
 445                         if (id->id_sizematch == B_FALSE && total_mem >= 100)
 446                                 mem = (100 * id->id_pctmem) / total_mem;
 447                         else
 448                                 mem = id->id_pctmem;
 449                         if (list->l_type == LT_USERS)
 450                                 pwd_getname(id->id_uid, pname, LOGNAME_MAX + 1,
 451                                     opts.o_outpmode & OPT_NORESOLVE);
 452                         else if (list->l_type == LT_ZONES)


 453                                 getzonename(id->id_zoneid, zonename,
 454                                     ZONENAME_MAX);
 455                         else


 456                                 getprojname(id->id_projid, projname,
 457                                     PROJNAME_MAX,
 458                                     opts.o_outpmode & OPT_NORESOLVE);



 459                         Format_size(psize, id->id_size, 6);
 460                         Format_size(prssize, id->id_rssize, 6);
 461                         Format_pct(pmem, mem, 4);
 462                         Format_pct(pcpu, cpu, 4);
 463                         Format_time(ptime, id->id_time, 10);
 464                         if (opts.o_outpmode & OPT_TTY)
 465                                 (void) putchar('\r');
 466                         if (list->l_type == LT_PROJECTS)
 467                                 (void) printf(PROJECT_LINE, (int)id->id_projid,
 468                                     id->id_nproc, psize, prssize, pmem, ptime,
 469                                     pcpu, projname);
 470                         else if (list->l_type == LT_TASKS)
 471                                 (void) printf(TASK_LINE, (int)id->id_taskid,
 472                                     id->id_nproc, psize, prssize, pmem, ptime,
 473                                     pcpu, projname);
 474                         else if (list->l_type == LT_ZONES)
 475                                 (void) printf(ZONE_LINE, (int)id->id_zoneid,
 476                                     id->id_nproc, psize, prssize, pmem, ptime,
 477                                     pcpu, zonename);
 478                         else
 479                                 (void) printf(USER_LINE, id->id_nproc, pname,
 480                                     psize, prssize, pmem, ptime, pcpu);
 481                         (void) putp(t_eol);
 482                         (void) putchar('\n');
 483                         break;
 484                 case LT_LWPS:
 485                         lwp = list->l_ptrs[i];
 486                         if (opts.o_outpmode & OPT_LWPS)
 487                                 lwpid = lwp->li_info.pr_lwp.pr_lwpid;
 488                         else
 489                                 lwpid = lwp->li_info.pr_nlwp +
 490                                     lwp->li_info.pr_nzomb;
 491                         pwd_getname(lwp->li_info.pr_uid, pname, LOGNAME_MAX + 1,
 492                             opts.o_outpmode & OPT_NORESOLVE);


 493                         if (opts.o_outpmode & OPT_PSINFO) {
 494                                 Format_size(psize, lwp->li_info.pr_size, 6);
 495                                 Format_size(prssize, lwp->li_info.pr_rssize, 6);
 496                                 Format_state(pstate,
 497                                     lwp->li_info.pr_lwp.pr_sname,
 498                                     lwp->li_info.pr_lwp.pr_onpro, 7);
 499                                 if (strcmp(lwp->li_info.pr_lwp.pr_clname,
 500                                     "RT") == 0 ||
 501                                     strcmp(lwp->li_info.pr_lwp.pr_clname,
 502                                     "SYS") == 0 ||
 503                                     lwp->li_info.pr_lwp.pr_sname == 'Z')
 504                                         (void) strcpy(pnice, "  -");
 505                                 else
 506                                         Format_num(pnice,
 507                                             lwp->li_info.pr_lwp.pr_nice - NZERO,
 508                                             4);
 509                                 Format_num(ppri, lwp->li_info.pr_lwp.pr_pri, 4);
 510                                 Format_pct(pcpu,
 511                                     FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu), 4);
 512                                 if (opts.o_outpmode & OPT_LWPS)
 513                                         Format_time(ptime,
 514                                             lwp->li_info.pr_lwp.pr_time.tv_sec,
 515                                             10);
 516                                 else
 517                                         Format_time(ptime,
 518                                             lwp->li_info.pr_time.tv_sec, 10);
 519                                 if (opts.o_outpmode & OPT_TTY)
 520                                         (void) putchar('\r');
 521                                 stripfname(lwp->li_info.pr_fname);
 522                                 if (opts.o_outpmode & OPT_LGRP) {
 523                                         (void) printf(PSINFO_LINE_LGRP,
 524                                             (int)lwp->li_info.pr_pid, pname,
 525                                             psize, prssize, pstate, ppri, pnice,
 526                                             ptime, pcpu,
 527                                             (int)lwp->li_info.pr_lwp.pr_lgrp,
 528                                             lwp->li_info.pr_fname, lwpid);
 529                                 } else {
 530                                         (void) printf(PSINFO_LINE,
 531                                             (int)lwp->li_info.pr_pid, pname,
 532                                             psize, prssize, pstate, ppri, pnice,

 533                                             ptime, pcpu,
 534                                             lwp->li_info.pr_fname, lwpid);
 535                                 }
 536                                 (void) putp(t_eol);
 537                                 (void) putchar('\n');
 538                         }
 539                         if (opts.o_outpmode & OPT_MSACCT) {
 540                                 Format_pct(usr, lwp->li_usr, 4);
 541                                 Format_pct(sys, lwp->li_sys, 4);
 542                                 Format_pct(slp, lwp->li_slp, 4);
 543                                 Format_num(vcx, lwp->li_vcx, 4);
 544                                 Format_num(icx, lwp->li_icx, 4);
 545                                 Format_num(scl, lwp->li_scl, 4);
 546                                 Format_num(sig, lwp->li_sig, 4);
 547                                 Format_pct(trp, lwp->li_trp, 4);
 548                                 Format_pct(tfl, lwp->li_tfl, 4);
 549                                 Format_pct(dfl, lwp->li_dfl, 4);
 550                                 Format_pct(lck, lwp->li_lck, 4);
 551                                 Format_pct(lat, lwp->li_lat, 4);
 552                                 if (opts.o_outpmode & OPT_TTY)


1347 int
1348 main(int argc, char **argv)
1349 {
1350         DIR *procdir;
1351         char *p;
1352         char *sortk = "cpu";    /* default sort key */
1353         int opt;
1354         int timeout;
1355         struct pollfd pollset;
1356         char key;
1357 
1358         (void) setlocale(LC_ALL, "");
1359         (void) textdomain(TEXT_DOMAIN);
1360         Progname(argv[0]);
1361         lwpid_init();
1362         fd_init(Setrlimit());
1363 
1364         pagesize = sysconf(_SC_PAGESIZE);
1365 
1366         while ((opt = getopt(argc, argv,
1367             "vcd:HmarRLtu:U:n:p:C:P:h:s:S:j:k:TJz:Z")) != (int)EOF) {
1368                 switch (opt) {
1369                 case 'r':
1370                         opts.o_outpmode |= OPT_NORESOLVE;
1371                         break;
1372                 case 'R':
1373                         opts.o_outpmode |= OPT_REALTIME;
1374                         break;
1375                 case 'c':
1376                         opts.o_outpmode &= ~OPT_TERMCAP;
1377                         opts.o_outpmode &= ~OPT_FULLSCREEN;
1378                         break;
1379                 case 'd':
1380                         if (optarg) {
1381                                 if (*optarg == 'u')
1382                                         opts.o_outpmode |= OPT_UDATE;
1383                                 else if (*optarg == 'd')
1384                                         opts.o_outpmode |= OPT_DDATE;
1385                                 else
1386                                         Usage();
1387                         } else {


1444                         break;
1445                 case 'p':
1446                         fill_table(&pid_tbl, optarg, 'p');
1447                         break;
1448                 case 'C':
1449                         fill_set_table(optarg);
1450                         opts.o_outpmode |= OPT_PSETS;
1451                         break;
1452                 case 'P':
1453                         fill_table(&cpu_tbl, optarg, 'P');
1454                         break;
1455                 case 'k':
1456                         fill_table(&tsk_tbl, optarg, 'k');
1457                         break;
1458                 case 'j':
1459                         fill_prj_table(optarg);
1460                         break;
1461                 case 'L':
1462                         opts.o_outpmode |= OPT_LWPS;
1463                         break;



1464                 case 'z':
1465                         if ((p = strtok(optarg, ", ")) == NULL)
1466                                 Die(gettext("invalid argument for -z\n"));
1467                         add_zone(&zone_tbl, p);
1468                         while (p = strtok(NULL, ", "))
1469                                 add_zone(&zone_tbl, p);
1470                         break;
1471                 case 'Z':
1472                         opts.o_outpmode |= OPT_SPLIT | OPT_ZONES;
1473                         break;
1474                 default:
1475                         Usage();
1476                 }
1477         }
1478 
1479         (void) atexit(Exit);
1480         if ((opts.o_outpmode & OPT_USERS) &&
1481             !(opts.o_outpmode & OPT_SPLIT))
1482                 opts.o_nbottom = opts.o_ntop;
1483         if (opts.o_ntop == 0 || opts.o_nbottom == 0)




   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2013 Gary Mills
  24  *
  25  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  26  * Use is subject to license terms.
  27  *
  28  * Portions Copyright 2009 Chad Mynhier
  29  */
  30 
  31 #include <sys/types.h>
  32 #include <sys/resource.h>
  33 #include <sys/loadavg.h>
  34 #include <sys/time.h>
  35 #include <sys/pset.h>
  36 #include <sys/vm_usage.h>
  37 #include <zone.h>
  38 #include <libzonecfg.h>
  39 
  40 #include <stdio.h>
  41 #include <stdlib.h>
  42 #include <unistd.h>
  43 #include <dirent.h>
  44 #include <string.h>


  60 #include "prtable.h"
  61 #include "prsort.h"
  62 #include "prfile.h"
  63 
  64 /*
  65  * x86 <sys/regs.h> ERR conflicts with <curses.h> ERR.  For the purposes
  66  * of this file, we care about the curses.h ERR so include that last.
  67  */
  68 
  69 #if     defined(ERR)
  70 #undef  ERR
  71 #endif
  72 
  73 #ifndef TEXT_DOMAIN                     /* should be defined by cc -D */
  74 #define TEXT_DOMAIN     "SYS_TEST"      /* use this only if it wasn't */
  75 #endif
  76 
  77 #include <curses.h>
  78 #include <term.h>
  79 
  80 #define LOGIN_WIDTH     8
  81 #define ZONE_WIDTH      28
  82 #define PROJECT_WIDTH   28
  83 
  84 #define PSINFO_HEADER_PROC \
  85 "   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP       "
  86 #define PSINFO_HEADER_PROC_LGRP \
  87 "   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU LGRP PROCESS/NLWP  "
  88 #define PSINFO_HEADER_LWP \
  89 "   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/LWPID      "
  90 #define PSINFO_HEADER_LWP_LGRP \
  91 "   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU LGRP PROCESS/LWPID "
  92 #define USAGE_HEADER_PROC \
  93 "   PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/NLWP  "
  94 #define USAGE_HEADER_LWP \
  95 "   PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/LWPID "
  96 #define USER_HEADER_PROC \
  97 " NPROC USERNAME  SWAP   RSS MEMORY      TIME  CPU                             "
  98 #define USER_HEADER_LWP \
  99 "  NLWP USERNAME  SWAP   RSS MEMORY      TIME  CPU                             "
 100 #define TASK_HEADER_PROC \
 101 "TASKID    NPROC  SWAP   RSS MEMORY      TIME  CPU PROJECT                     "
 102 #define TASK_HEADER_LWP \
 103 "TASKID     NLWP  SWAP   RSS MEMORY      TIME  CPU PROJECT                     "
 104 #define PROJECT_HEADER_PROC \
 105 "PROJID    NPROC  SWAP   RSS MEMORY      TIME  CPU PROJECT                     "
 106 #define PROJECT_HEADER_LWP \
 107 "PROJID     NLWP  SWAP   RSS MEMORY      TIME  CPU PROJECT                     "
 108 #define ZONE_HEADER_PROC \
 109 "ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE                        "
 110 #define ZONE_HEADER_LWP \
 111 "ZONEID     NLWP  SWAP   RSS MEMORY      TIME  CPU ZONE                        "
 112 #define PSINFO_LINE \
 113 "%6d %-8s %5s %5s %-6s %3s  %3s %9s %3.3s%% %-.16s/%d"
 114 #define PSINFO_LINE_LGRP \
 115 "%6d %-8s %5s %5s %-6s %3s  %3s %9s %3.3s%% %4d %-.16s/%d"
 116 #define USAGE_LINE \
 117 "%6d %-8s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s %3.3s "\
 118 "%3.3s %3.3s %-.12s/%d"
 119 #define USER_LINE \
 120 "%6d %-8s %5.5s %5.5s   %3.3s%% %9s %3.3s%%"
 121 #define TASK_LINE \
 122 "%6d %8d %5s %5s   %3.3s%% %9s %3.3s%% %28s"
 123 #define PROJECT_LINE \
 124 "%6d %8d %5s %5s   %3.3s%% %9s %3.3s%% %28s"
 125 #define ZONE_LINE \
 126 "%6d %8d %5s %5s   %3.3s%% %9s %3.3s%% %28s"
 127 
 128 #define TOTAL_LINE \
 129 "Total: %d processes, %d lwps, load averages: %3.2f, %3.2f, %3.2f"
 130 
 131 /* global variables */
 132 
 133 static char     *t_ulon;                        /* termcap: start underline */
 134 static char     *t_uloff;                       /* termcap: end underline */
 135 static char     *t_up;                          /* termcap: cursor 1 line up */
 136 static char     *t_eol;                         /* termcap: clear end of line */
 137 static char     *t_smcup;                       /* termcap: cursor mvcap on */
 138 static char     *t_rmcup;                       /* termcap: cursor mvcap off */


 435         (void) putchar('\n');
 436 
 437         for (i = 0; i < list->l_used; i++) {
 438                 switch (list->l_type) {
 439                 case LT_PROJECTS:
 440                 case LT_TASKS:
 441                 case LT_USERS:
 442                 case LT_ZONES:
 443                         id = list->l_ptrs[i];
 444                         /*
 445                          * CPU usage and memory usage normalization
 446                          */
 447                         if (total_cpu >= 100)
 448                                 cpu = (100 * id->id_pctcpu) / total_cpu;
 449                         else
 450                                 cpu = id->id_pctcpu;
 451                         if (id->id_sizematch == B_FALSE && total_mem >= 100)
 452                                 mem = (100 * id->id_pctmem) / total_mem;
 453                         else
 454                                 mem = id->id_pctmem;
 455                         if (list->l_type == LT_USERS) {
 456                                 pwd_getname(id->id_uid, pname, sizeof (pname),
 457                                     opts.o_outpmode & OPT_NORESOLVE,
 458                                     opts.o_outpmode & (OPT_TERMCAP|OPT_TRUNC),
 459                                     LOGIN_WIDTH);
 460                         } else if (list->l_type == LT_ZONES) {
 461                                 getzonename(id->id_zoneid, zonename,
 462                                     sizeof (zonename) - 1,
 463                                     opts.o_outpmode & (OPT_TERMCAP|OPT_TRUNC),
 464                                     ZONE_WIDTH);
 465                         } else {
 466                                 getprojname(id->id_projid, projname,
 467                                     sizeof (projname) - 1,
 468                                     opts.o_outpmode & OPT_NORESOLVE,
 469                                     opts.o_outpmode & (OPT_TERMCAP|OPT_TRUNC),
 470                                     PROJECT_WIDTH);
 471                         }
 472                         Format_size(psize, id->id_size, 6);
 473                         Format_size(prssize, id->id_rssize, 6);
 474                         Format_pct(pmem, mem, 4);
 475                         Format_pct(pcpu, cpu, 4);
 476                         Format_time(ptime, id->id_time, 10);
 477                         if (opts.o_outpmode & OPT_TTY)
 478                                 (void) putchar('\r');
 479                         if (list->l_type == LT_PROJECTS)
 480                                 (void) printf(PROJECT_LINE, (int)id->id_projid,
 481                                     id->id_nproc, psize, prssize, pmem, ptime,
 482                                     pcpu, projname);
 483                         else if (list->l_type == LT_TASKS)
 484                                 (void) printf(TASK_LINE, (int)id->id_taskid,
 485                                     id->id_nproc, psize, prssize, pmem, ptime,
 486                                     pcpu, projname);
 487                         else if (list->l_type == LT_ZONES)
 488                                 (void) printf(ZONE_LINE, (int)id->id_zoneid,
 489                                     id->id_nproc, psize, prssize, pmem, ptime,
 490                                     pcpu, zonename);
 491                         else
 492                                 (void) printf(USER_LINE, id->id_nproc, pname,
 493                                     psize, prssize, pmem, ptime, pcpu);
 494                         (void) putp(t_eol);
 495                         (void) putchar('\n');
 496                         break;
 497                 case LT_LWPS:
 498                         lwp = list->l_ptrs[i];
 499                         if (opts.o_outpmode & OPT_LWPS)
 500                                 lwpid = lwp->li_info.pr_lwp.pr_lwpid;
 501                         else
 502                                 lwpid = lwp->li_info.pr_nlwp +
 503                                     lwp->li_info.pr_nzomb;
 504                         pwd_getname(lwp->li_info.pr_uid, pname, sizeof (pname),
 505                             opts.o_outpmode & OPT_NORESOLVE,
 506                             opts.o_outpmode & (OPT_TERMCAP|OPT_TRUNC),
 507                             LOGIN_WIDTH);
 508                         if (opts.o_outpmode & OPT_PSINFO) {
 509                                 Format_size(psize, lwp->li_info.pr_size, 6);
 510                                 Format_size(prssize, lwp->li_info.pr_rssize, 6);
 511                                 Format_state(pstate,
 512                                     lwp->li_info.pr_lwp.pr_sname,
 513                                     lwp->li_info.pr_lwp.pr_onpro, 7);
 514                                 if (strcmp(lwp->li_info.pr_lwp.pr_clname,
 515                                     "RT") == 0 ||
 516                                     strcmp(lwp->li_info.pr_lwp.pr_clname,
 517                                     "SYS") == 0 ||
 518                                     lwp->li_info.pr_lwp.pr_sname == 'Z')
 519                                         (void) strcpy(pnice, "  -");
 520                                 else
 521                                         Format_num(pnice,
 522                                             lwp->li_info.pr_lwp.pr_nice - NZERO,
 523                                             4);
 524                                 Format_num(ppri, lwp->li_info.pr_lwp.pr_pri, 4);
 525                                 Format_pct(pcpu,
 526                                     FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu), 4);
 527                                 if (opts.o_outpmode & OPT_LWPS)
 528                                         Format_time(ptime,
 529                                             lwp->li_info.pr_lwp.pr_time.tv_sec,
 530                                             10);
 531                                 else
 532                                         Format_time(ptime,
 533                                             lwp->li_info.pr_time.tv_sec, 10);
 534                                 if (opts.o_outpmode & OPT_TTY)
 535                                         (void) putchar('\r');
 536                                 stripfname(lwp->li_info.pr_fname);
 537                                 if (opts.o_outpmode & OPT_LGRP) {
 538                                         (void) printf(PSINFO_LINE_LGRP,
 539                                             (int)lwp->li_info.pr_pid, pname,
 540                                             psize, prssize, pstate,
 541                                             ppri, pnice, ptime, pcpu,
 542                                             (int)lwp->li_info.pr_lwp.pr_lgrp,
 543                                             lwp->li_info.pr_fname, lwpid);
 544                                 } else {
 545                                         (void) printf(PSINFO_LINE,
 546                                             (int)lwp->li_info.pr_pid, pname,
 547                                             psize, prssize,
 548                                             pstate, ppri, pnice,
 549                                             ptime, pcpu,
 550                                             lwp->li_info.pr_fname, lwpid);
 551                                 }
 552                                 (void) putp(t_eol);
 553                                 (void) putchar('\n');
 554                         }
 555                         if (opts.o_outpmode & OPT_MSACCT) {
 556                                 Format_pct(usr, lwp->li_usr, 4);
 557                                 Format_pct(sys, lwp->li_sys, 4);
 558                                 Format_pct(slp, lwp->li_slp, 4);
 559                                 Format_num(vcx, lwp->li_vcx, 4);
 560                                 Format_num(icx, lwp->li_icx, 4);
 561                                 Format_num(scl, lwp->li_scl, 4);
 562                                 Format_num(sig, lwp->li_sig, 4);
 563                                 Format_pct(trp, lwp->li_trp, 4);
 564                                 Format_pct(tfl, lwp->li_tfl, 4);
 565                                 Format_pct(dfl, lwp->li_dfl, 4);
 566                                 Format_pct(lck, lwp->li_lck, 4);
 567                                 Format_pct(lat, lwp->li_lat, 4);
 568                                 if (opts.o_outpmode & OPT_TTY)


1363 int
1364 main(int argc, char **argv)
1365 {
1366         DIR *procdir;
1367         char *p;
1368         char *sortk = "cpu";    /* default sort key */
1369         int opt;
1370         int timeout;
1371         struct pollfd pollset;
1372         char key;
1373 
1374         (void) setlocale(LC_ALL, "");
1375         (void) textdomain(TEXT_DOMAIN);
1376         Progname(argv[0]);
1377         lwpid_init();
1378         fd_init(Setrlimit());
1379 
1380         pagesize = sysconf(_SC_PAGESIZE);
1381 
1382         while ((opt = getopt(argc, argv,
1383             "vcd:HmarRLtu:U:n:p:C:P:h:s:S:j:k:TJWz:Z")) != (int)EOF) {
1384                 switch (opt) {
1385                 case 'r':
1386                         opts.o_outpmode |= OPT_NORESOLVE;
1387                         break;
1388                 case 'R':
1389                         opts.o_outpmode |= OPT_REALTIME;
1390                         break;
1391                 case 'c':
1392                         opts.o_outpmode &= ~OPT_TERMCAP;
1393                         opts.o_outpmode &= ~OPT_FULLSCREEN;
1394                         break;
1395                 case 'd':
1396                         if (optarg) {
1397                                 if (*optarg == 'u')
1398                                         opts.o_outpmode |= OPT_UDATE;
1399                                 else if (*optarg == 'd')
1400                                         opts.o_outpmode |= OPT_DDATE;
1401                                 else
1402                                         Usage();
1403                         } else {


1460                         break;
1461                 case 'p':
1462                         fill_table(&pid_tbl, optarg, 'p');
1463                         break;
1464                 case 'C':
1465                         fill_set_table(optarg);
1466                         opts.o_outpmode |= OPT_PSETS;
1467                         break;
1468                 case 'P':
1469                         fill_table(&cpu_tbl, optarg, 'P');
1470                         break;
1471                 case 'k':
1472                         fill_table(&tsk_tbl, optarg, 'k');
1473                         break;
1474                 case 'j':
1475                         fill_prj_table(optarg);
1476                         break;
1477                 case 'L':
1478                         opts.o_outpmode |= OPT_LWPS;
1479                         break;
1480                 case 'W':
1481                         opts.o_outpmode |= OPT_TRUNC;
1482                         break;
1483                 case 'z':
1484                         if ((p = strtok(optarg, ", ")) == NULL)
1485                                 Die(gettext("invalid argument for -z\n"));
1486                         add_zone(&zone_tbl, p);
1487                         while (p = strtok(NULL, ", "))
1488                                 add_zone(&zone_tbl, p);
1489                         break;
1490                 case 'Z':
1491                         opts.o_outpmode |= OPT_SPLIT | OPT_ZONES;
1492                         break;
1493                 default:
1494                         Usage();
1495                 }
1496         }
1497 
1498         (void) atexit(Exit);
1499         if ((opts.o_outpmode & OPT_USERS) &&
1500             !(opts.o_outpmode & OPT_SPLIT))
1501                 opts.o_nbottom = opts.o_ntop;
1502         if (opts.o_ntop == 0 || opts.o_nbottom == 0)