Print this page
    
OS-4647 lx fails to mount nfs share - Transport endpoint is already connected
OS-881 To workaround OS-580 add support to only invalidate mappings from a single process
OS-399 zone phys. mem. cap should be a rctl and have associated kstat
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/cmd/truss/print.c
          +++ new/usr/src/cmd/truss/print.c
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
  24   24   * Copyright (c) 2015, Joyent, Inc. All rights reserved.
  25   25   */
  26   26  
  27   27  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
  28   28  /*        All Rights Reserved   */
  29   29  
  30   30  /* Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved. */
  31   31  
  32   32  #define _SYSCALL32      /* make 32-bit compat headers visible */
  33   33  
  34   34  #include <stdio.h>
  35   35  #include <stdlib.h>
  36   36  #include <unistd.h>
  37   37  #include <string.h>
  38   38  #include <signal.h>
  39   39  #include <termio.h>
  40   40  #include <stddef.h>
  41   41  #include <limits.h>
  42   42  #include <fcntl.h>
  43   43  #include <ctype.h>
  44   44  #include <sys/types.h>
  45   45  #include <sys/mman.h>
  46   46  #include <sys/resource.h>
  47   47  #include <sys/ulimit.h>
  48   48  #include <sys/utsname.h>
  49   49  #include <sys/kstat.h>
  50   50  #include <sys/modctl.h>
  51   51  #include <sys/acl.h>
  52   52  #include <stropts.h>
  53   53  #include <sys/isa_defs.h>
  54   54  #include <sys/systeminfo.h>
  55   55  #include <sys/cladm.h>
  56   56  #include <sys/lwp.h>
  57   57  #include <bsm/audit.h>
  58   58  #include <libproc.h>
  59   59  #include <priv.h>
  60   60  #include <sys/aio.h>
  61   61  #include <sys/aiocb.h>
  62   62  #include <sys/corectl.h>
  63   63  #include <sys/cpc_impl.h>
  64   64  #include <sys/priocntl.h>
  65   65  #include <sys/tspriocntl.h>
  66   66  #include <sys/iapriocntl.h>
  67   67  #include <sys/rtpriocntl.h>
  68   68  #include <sys/fsspriocntl.h>
  69   69  #include <sys/fxpriocntl.h>
  70   70  #include <netdb.h>
  71   71  #include <nss_dbdefs.h>
  72   72  #include <sys/socketvar.h>
  73   73  #include <netinet/in.h>
  74   74  #include <netinet/tcp.h>
  75   75  #include <netinet/udp.h>
  76   76  #include <netinet/sctp.h>
  77   77  #include <net/route.h>
  78   78  #include <sys/utrap.h>
  79   79  #include <sys/lgrp_user.h>
  80   80  #include <sys/door.h>
  81   81  #include <sys/tsol/tndb.h>
  82   82  #include <sys/rctl.h>
  83   83  #include <sys/rctl_impl.h>
  84   84  #include <sys/fork.h>
  85   85  #include <sys/task.h>
  86   86  #include <sys/random.h>
  87   87  #include "ramdata.h"
  88   88  #include "print.h"
  89   89  #include "proto.h"
  90   90  #include "systable.h"
  91   91  
  92   92  void grow(private_t *, int nbyte);
  93   93  
  94   94  #define GROW(nb) if (pri->sys_leng + (nb) >= pri->sys_ssize) grow(pri, (nb))
  95   95  
  96   96  
  97   97  /*ARGSUSED*/
  98   98  void
  99   99  prt_nov(private_t *pri, int raw, long val)      /* print nothing */
 100  100  {
 101  101  }
 102  102  
 103  103  /*ARGSUSED*/
 104  104  void
 105  105  prt_dec(private_t *pri, int raw, long val)      /* print as decimal */
 106  106  {
 107  107          GROW(24);
 108  108          if (data_model == PR_MODEL_ILP32)
 109  109                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 110  110                      "%d", (int)val);
 111  111          else
 112  112                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 113  113                      "%ld", val);
 114  114  }
 115  115  
 116  116  /*ARGSUSED*/
 117  117  void
 118  118  prt_uns(private_t *pri, int raw, long val)      /* print as unsigned decimal */
 119  119  {
 120  120          GROW(24);
 121  121          if (data_model == PR_MODEL_ILP32)
 122  122                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 123  123                      "%u", (int)val);
 124  124          else
 125  125                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 126  126                      "%lu", val);
 127  127  }
 128  128  
 129  129  /* print as unsigned decimal, except for -1 */
 130  130  void
 131  131  prt_un1(private_t *pri, int raw, long val)
 132  132  {
 133  133          if ((int)val == -1)
 134  134                  prt_dec(pri, raw, val);
 135  135          else
 136  136                  prt_uns(pri, raw, val);
 137  137  }
 138  138  
 139  139  /*ARGSUSED*/
 140  140  void
 141  141  prt_oct(private_t *pri, int raw, long val)      /* print as octal */
 142  142  {
 143  143          GROW(24);
 144  144          if (data_model == PR_MODEL_ILP32)
 145  145                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 146  146                      "%#o", (int)val);
 147  147          else
 148  148                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 149  149                      "%#lo", val);
 150  150  }
 151  151  
 152  152  /*ARGSUSED*/
 153  153  void
 154  154  prt_hex(private_t *pri, int raw, long val)      /* print as hexadecimal */
 155  155  {
 156  156          GROW(20);
 157  157          if (data_model == PR_MODEL_ILP32)
 158  158                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 159  159                      "0x%.8X", (int)val);
 160  160          else
 161  161                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 162  162                      "0x%.8lX", val);
 163  163  }
 164  164  
 165  165  /* print as hexadecimal (half size) */
 166  166  /*ARGSUSED*/
 167  167  void
 168  168  prt_hhx(private_t *pri, int raw, long val)
 169  169  {
 170  170          GROW(20);
 171  171          if (data_model == PR_MODEL_ILP32)
 172  172                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 173  173                      "0x%.4X", (int)val);
 174  174          else
 175  175                  pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
 176  176                      "0x%.4lX", val);
 177  177  }
 178  178  
 179  179  /* print as decimal if small, else hexadecimal */
 180  180  /*ARGSUSED*/
 181  181  void
 182  182  prt_dex(private_t *pri, int raw, long val)
 183  183  {
 184  184          if (val & 0xff000000)
 185  185                  prt_hex(pri, 0, val);
 186  186          else
 187  187                  prt_dec(pri, 0, val);
 188  188  }
 189  189  
 190  190  /* print long long offset */
 191  191  /*ARGSUSED*/
 192  192  void
 193  193  prt_llo(private_t *pri, int raw, long val1, long val2)
 194  194  {
 195  195          int hival;
 196  196          int loval;
 197  197  
 198  198  #ifdef  _LONG_LONG_LTOH
 199  199          hival = (int)val2;
 200  200          loval = (int)val1;
 201  201  #else
 202  202          hival = (int)val1;
 203  203          loval = (int)val2;
 204  204  #endif
 205  205  
 206  206          if (hival == 0) {
 207  207                  prt_dex(pri, 0, loval);
 208  208          } else {
 209  209                  GROW(18);
 210  210                  pri->sys_leng +=
 211  211                      sprintf(pri->sys_string + pri->sys_leng, "0x%.8X%.8X",
 212  212                      hival, loval);
 213  213          }
 214  214  }
 215  215  
 216  216  void
 217  217  escape_string(private_t *pri, const char *s)
 218  218  {
 219  219          /*
 220  220           * We want to avoid outputting unprintable characters that may
 221  221           * destroy the user's terminal.  So we do one pass to find any
 222  222           * unprintable characters, size the array appropriately, and
 223  223           * then walk each character by hand.  Those that are unprintable
 224  224           * are replaced by a hex escape (\xNN).  We also escape quotes for
 225  225           * completeness.
 226  226           */
 227  227          int i, unprintable, quotes;
 228  228          size_t len = strlen(s);
 229  229          for (i = 0, unprintable = 0, quotes = 0; i < len; i++) {
 230  230                  if (!isprint(s[i]))
 231  231                          unprintable++;
 232  232                  if (s[i] == '"')
 233  233                          quotes++;
 234  234          }
 235  235  
 236  236          GROW(len + 3 * unprintable + quotes + 2);
 237  237  
 238  238          pri->sys_string[pri->sys_leng++] = '"';
 239  239          for (i = 0; i < len; i++) {
 240  240                  if (s[i] == '"')
 241  241                          pri->sys_string[pri->sys_leng++] = '\\';
 242  242  
 243  243                  if (isprint(s[i])) {
 244  244                          pri->sys_string[pri->sys_leng++] = s[i];
 245  245                  } else {
 246  246                          pri->sys_leng += sprintf(pri->sys_string +
 247  247                              pri->sys_leng, "\\x%02x", (uint8_t)s[i]);
 248  248                  }
 249  249          }
 250  250          pri->sys_string[pri->sys_leng++] = '"';
 251  251  }
 252  252  
 253  253  void
 254  254  prt_stg(private_t *pri, int raw, long val)      /* print as string */
 255  255  {
 256  256          char *s = raw? NULL : fetchstring(pri, (long)val, PATH_MAX);
 257  257  
 258  258          if (s == NULL)
 259  259                  prt_hex(pri, 0, val);
 260  260          else
 261  261                  escape_string(pri, s);
 262  262  }
 263  263  
 264  264  /* print as string returned from syscall */
 265  265  void
 266  266  prt_rst(private_t *pri, int raw, long val)
 267  267  {
 268  268          char *s = (raw || pri->Errno)? NULL :
 269  269              fetchstring(pri, (long)val, PATH_MAX);
 270  270  
 271  271          if (s == NULL)
 272  272                  prt_hex(pri, 0, val);
 273  273          else {
 274  274                  GROW((int)strlen(s) + 2);
 275  275                  pri->sys_leng += snprintf(pri->sys_string + pri->sys_leng,
 276  276                      pri->sys_ssize - pri->sys_leng, "\"%s\"", s);
 277  277          }
 278  278  }
 279  279  
 280  280  /* print contents of readlink() buffer */
 281  281  void
 282  282  prt_rlk(private_t *pri, int raw, long val)
 283  283  {
 284  284          char *s = (raw || pri->Errno || pri->Rval1 <= 0)? NULL :
 285  285              fetchstring(pri, (long)val,
 286  286              (pri->Rval1 > PATH_MAX)? PATH_MAX : (int)pri->Rval1);
 287  287  
 288  288          if (s == NULL)
 289  289                  prt_hex(pri, 0, val);
 290  290          else {
 291  291                  GROW((int)strlen(s) + 2);
 292  292                  pri->sys_leng += snprintf(pri->sys_string + pri->sys_leng,
 293  293                      pri->sys_ssize - pri->sys_leng, "\"%s\"", s);
 294  294          }
 295  295  }
 296  296  
 297  297  void
 298  298  prt_ioc(private_t *pri, int raw, long val)      /* print ioctl code */
 299  299  {
 300  300          const char *s = raw? NULL : ioctlname(pri, (int)val);
 301  301  
 302  302          if (s == NULL)
 303  303                  prt_hex(pri, 0, val);
 304  304          else
 305  305                  outstring(pri, s);
 306  306  }
 307  307  
 308  308  void
 309  309  prt_ioa(private_t *pri, int raw, long val)      /* print ioctl argument */
 310  310  {
 311  311          const char *s;
 312  312  
 313  313          /* cheating -- look at the ioctl() code */
 314  314          switch (pri->sys_args[1]) {
 315  315  
 316  316          /* kstat ioctl()s */
 317  317          case KSTAT_IOC_READ:
 318  318          case KSTAT_IOC_WRITE:
 319  319  #ifdef _LP64
 320  320                  if (data_model == PR_MODEL_ILP32)
 321  321                          prt_stg(pri, raw,
 322  322                              val + offsetof(kstat32_t, ks_name[0]));
 323  323                  else
 324  324  #endif
 325  325                          prt_stg(pri, raw,
 326  326                              val + offsetof(kstat_t, ks_name[0]));
 327  327                  break;
 328  328  
 329  329          /* streams ioctl()s */
 330  330          case I_LOOK:
 331  331                  prt_rst(pri, raw, val);
 332  332                  break;
 333  333          case I_PUSH:
 334  334          case I_FIND:
 335  335                  prt_stg(pri, raw, val);
 336  336                  break;
 337  337          case I_LINK:
 338  338          case I_UNLINK:
 339  339          case I_SENDFD:
 340  340                  prt_dec(pri, 0, val);
 341  341                  break;
 342  342          case I_SRDOPT:
 343  343                  if (raw || (s = strrdopt(val)) == NULL)
 344  344                          prt_dec(pri, 0, val);
 345  345                  else
 346  346                          outstring(pri, s);
 347  347                  break;
 348  348          case I_SETSIG:
 349  349                  if (raw || (s = strevents(pri, val)) == NULL)
 350  350                          prt_hex(pri, 0, val);
 351  351                  else
 352  352                          outstring(pri, s);
 353  353                  break;
 354  354          case I_FLUSH:
 355  355                  if (raw || (s = strflush(val)) == NULL)
 356  356                          prt_dec(pri, 0, val);
 357  357                  else
 358  358                          outstring(pri, s);
 359  359                  break;
 360  360  
 361  361          /* tty ioctl()s */
 362  362          case TCSBRK:
 363  363          case TCXONC:
 364  364          case TCFLSH:
 365  365          case TCDSET:
 366  366                  prt_dec(pri, 0, val);
 367  367                  break;
 368  368  
 369  369          default:
 370  370                  prt_hex(pri, 0, val);
 371  371                  break;
 372  372          }
 373  373  }
 374  374  
 375  375  void
 376  376  prt_pip(private_t *pri, int raw, long val)      /* print pipe code */
 377  377  {
 378  378          const char *s = NULL;
 379  379  
 380  380          if (!raw) {
 381  381                  switch (val) {
 382  382                  case O_CLOEXEC:
 383  383                          s = "O_CLOEXEC";
 384  384                          break;
 385  385                  case O_NONBLOCK:
 386  386                          s = "O_NONBLOCK";
 387  387                          break;
 388  388                  case O_CLOEXEC|O_NONBLOCK:
 389  389                          s = "O_CLOEXEC|O_NONBLOCK";
 390  390                          break;
 391  391                  }
 392  392          }
 393  393  
 394  394          if (s == NULL)
 395  395                  prt_dex(pri, 0, val);
 396  396          else
 397  397                  outstring(pri, s);
 398  398  }
 399  399  
 400  400  void
 401  401  prt_pfd(private_t *pri, int raw, long val)      /* print pipe code */
 402  402  {
 403  403          int fds[2];
 404  404          char str[32];
 405  405  
 406  406          /* the fds only have meaning if the return value is 0 */
 407  407          if (!raw &&
 408  408              pri->Rval1 >= 0 &&
 409  409              Pread(Proc, fds, sizeof (fds), (long)val) == sizeof (fds)) {
 410  410                  (void) snprintf(str, sizeof (str), "[%d,%d]", fds[0], fds[1]);
 411  411                  outstring(pri, str);
 412  412          } else {
 413  413                  prt_hex(pri, 0, val);
 414  414          }
 415  415  }
 416  416  
 417  417  void
 418  418  prt_fcn(private_t *pri, int raw, long val)      /* print fcntl code */
 419  419  {
 420  420          const char *s = raw? NULL : fcntlname(val);
 421  421  
 422  422          if (s == NULL)
 423  423                  prt_dec(pri, 0, val);
 424  424          else
 425  425                  outstring(pri, s);
 426  426  }
 427  427  
 428  428  void
 429  429  prt_s86(private_t *pri, int raw, long val)      /* print sysi86 code */
 430  430  {
 431  431  
 432  432          const char *s = raw? NULL : si86name(val);
 433  433  
 434  434          if (s == NULL)
 435  435                  prt_dec(pri, 0, val);
 436  436          else
 437  437                  outstring(pri, s);
 438  438  }
 439  439  
 440  440  void
 441  441  prt_uts(private_t *pri, int raw, long val)      /* print utssys code */
 442  442  {
 443  443          const char *s = raw? NULL : utscode(val);
 444  444  
 445  445          if (s == NULL)
 446  446                  prt_dec(pri, 0, val);
 447  447          else
 448  448                  outstring(pri, s);
 449  449  }
 450  450  
 451  451  void
 452  452  prt_msc(private_t *pri, int raw, long val)      /* print msgsys command */
 453  453  {
 454  454          const char *s = raw? NULL : msgcmd(val);
 455  455  
 456  456          if (s == NULL)
 457  457                  prt_dec(pri, 0, val);
 458  458          else
 459  459                  outstring(pri, s);
 460  460  }
 461  461  
 462  462  void
 463  463  prt_msf(private_t *pri, int raw, long val)      /* print msgsys flags */
 464  464  {
 465  465          const char *s = raw? NULL : msgflags(pri, (int)val);
 466  466  
 467  467          if (s == NULL)
 468  468                  prt_oct(pri, 0, val);
 469  469          else
 470  470                  outstring(pri, s);
 471  471  }
 472  472  
 473  473  void
 474  474  prt_smc(private_t *pri, int raw, long val)      /* print semsys command */
 475  475  {
 476  476          const char *s = raw? NULL : semcmd(val);
 477  477  
 478  478          if (s == NULL)
 479  479                  prt_dec(pri, 0, val);
 480  480          else
 481  481                  outstring(pri, s);
 482  482  }
 483  483  
 484  484  void
 485  485  prt_sef(private_t *pri, int raw, long val)      /* print semsys flags */
 486  486  {
 487  487          const char *s = raw? NULL : semflags(pri, (int)val);
 488  488  
 489  489          if (s == NULL)
 490  490                  prt_oct(pri, 0, val);
 491  491          else
 492  492                  outstring(pri, s);
 493  493  }
 494  494  
 495  495  void
 496  496  prt_shc(private_t *pri, int raw, long val)      /* print shmsys command */
 497  497  {
 498  498          const char *s = raw? NULL : shmcmd(val);
 499  499  
 500  500          if (s == NULL)
 501  501                  prt_dec(pri, 0, val);
 502  502          else
 503  503                  outstring(pri, s);
 504  504  }
 505  505  
 506  506  void
 507  507  prt_shf(private_t *pri, int raw, long val)      /* print shmsys flags */
 508  508  {
 509  509          const char *s = raw? NULL : shmflags(pri, (int)val);
 510  510  
 511  511          if (s == NULL)
 512  512                  prt_oct(pri, 0, val);
 513  513          else
 514  514                  outstring(pri, s);
 515  515  }
 516  516  
 517  517  void
 518  518  prt_sfs(private_t *pri, int raw, long val)      /* print sysfs code */
 519  519  {
 520  520          const char *s = raw? NULL : sfsname(val);
 521  521  
 522  522          if (s == NULL)
 523  523                  prt_dec(pri, 0, val);
 524  524          else
 525  525                  outstring(pri, s);
 526  526  }
 527  527  
 528  528  void
 529  529  prt_opn(private_t *pri, int raw, long val)      /* print open code */
 530  530  {
 531  531          const char *s = raw? NULL : openarg(pri, val);
 532  532  
 533  533          if (s == NULL)
 534  534                  prt_oct(pri, 0, val);
 535  535          else
 536  536                  outstring(pri, s);
 537  537  }
 538  538  
 539  539  void
 540  540  prt_sig(private_t *pri, int raw, long val)      /* print signal name */
 541  541  {
 542  542          const char *s = raw? NULL : signame(pri, (int)val);
 543  543  
 544  544          if (s == NULL)
 545  545                  prt_hex(pri, 0, val);
 546  546          else
 547  547                  outstring(pri, s);
 548  548  }
 549  549  
 550  550  void
 551  551  prt_smf(private_t *pri, int raw, long val) /* print streams message flags */
 552  552  {
 553  553          switch (val) {
 554  554          case 0:
 555  555                  prt_dec(pri, 0, val);
 556  556                  break;
 557  557          case RS_HIPRI:
 558  558                  if (raw)
 559  559                          prt_hhx(pri, 0, val);
 560  560                  else
 561  561                          outstring(pri, "RS_HIPRI");
 562  562                  break;
 563  563          default:
 564  564                  prt_hhx(pri, 0, val);
 565  565                  break;
 566  566          }
 567  567  }
 568  568  
 569  569  void
 570  570  prt_mtf(private_t *pri, int raw, long val)      /* print mount flags */
 571  571  {
 572  572          const char *s = raw? NULL : mountflags(pri, val);
 573  573  
 574  574          if (s == NULL)
 575  575                  prt_hex(pri, 0, val);
 576  576          else
 577  577                  outstring(pri, s);
 578  578  }
 579  579  
 580  580  void
 581  581  prt_mft(private_t *pri, int raw, long val) /* print mount file system type */
 582  582  {
 583  583          if (val >= 0 && val < 256)
 584  584                  prt_dec(pri, 0, val);
 585  585          else if (raw)
 586  586                  prt_hex(pri, 0, val);
 587  587          else
 588  588                  prt_stg(pri, raw, val);
 589  589  }
 590  590  
 591  591  #define ISREAD(code) \
 592  592          ((code) == SYS_read || (code) == SYS_pread || (code) == SYS_pread64 || \
 593  593          (code) == SYS_recv || (code) == SYS_recvfrom)
 594  594  #define ISWRITE(code) \
 595  595          ((code) == SYS_write || (code) == SYS_pwrite || \
 596  596          (code) == SYS_pwrite64 || (code) == SYS_send || (code) == SYS_sendto)
 597  597  
 598  598  /* print contents of read() or write() I/O buffer */
 599  599  void
 600  600  prt_iob(private_t *pri, int raw, long val)
 601  601  {
 602  602          const lwpstatus_t *Lsp = pri->lwpstat;
 603  603          int syscall = Lsp->pr_what;
 604  604          int fdp1 = pri->sys_args[0] + 1;
 605  605          ssize_t nbyte = ISWRITE(syscall)? pri->sys_args[2] :
 606  606              (pri->Errno? 0 : pri->Rval1);
 607  607          int elsewhere = FALSE;          /* TRUE iff dumped elsewhere */
 608  608          char buffer[IOBSIZE];
 609  609  
 610  610          pri->iob_buf[0] = '\0';
 611  611  
 612  612          if (Lsp->pr_why == PR_SYSEXIT && nbyte > IOBSIZE) {
 613  613                  if (ISREAD(syscall))
 614  614                          elsewhere = prismember(&readfd, fdp1);
 615  615                  else
 616  616                          elsewhere = prismember(&writefd, fdp1);
 617  617          }
 618  618  
 619  619          if (nbyte <= 0 || elsewhere)
 620  620                  prt_hex(pri, 0, val);
 621  621          else {
 622  622                  int nb = nbyte > IOBSIZE? IOBSIZE : (int)nbyte;
 623  623  
 624  624                  if (Pread(Proc, buffer, (size_t)nb, (long)val) != nb)
 625  625                          prt_hex(pri, 0, val);
 626  626                  else {
 627  627                          pri->iob_buf[0] = '"';
 628  628                          showbytes(buffer, nb, pri->iob_buf + 1);
 629  629                          (void) strlcat(pri->iob_buf,
 630  630                              (nb == nbyte)?
 631  631                              (const char *)"\"" : (const char *)"\"..",
 632  632                              sizeof (pri->iob_buf));
 633  633                          if (raw)
 634  634                                  prt_hex(pri, 0, val);
 635  635                          else
 636  636                                  outstring(pri, pri->iob_buf);
 637  637                  }
 638  638          }
 639  639  }
 640  640  #undef  ISREAD
 641  641  #undef  ISWRITE
 642  642  
 643  643  void
 644  644  prt_idt(private_t *pri, int raw, long val) /* print idtype_t, waitid() arg */
 645  645  {
 646  646          const char *s = raw? NULL : idtype_enum(pri, val);
 647  647  
 648  648          if (s == NULL)
 649  649                  prt_dec(pri, 0, val);
 650  650          else
 651  651                  outstring(pri, s);
 652  652  }
 653  653  
 654  654  void
 655  655  prt_wop(private_t *pri, int raw, long val)      /* print waitid() options */
 656  656  {
 657  657          const char *s = raw? NULL : woptions(pri, (int)val);
 658  658  
 659  659          if (s == NULL)
 660  660                  prt_oct(pri, 0, val);
 661  661          else
 662  662                  outstring(pri, s);
 663  663  }
 664  664  
 665  665  void
 666  666  prt_whn(private_t *pri, int raw, long val) /* print lseek() whence argument */
 667  667  {
 668  668          const char *s = raw? NULL : whencearg(val);
 669  669  
 670  670          if (s == NULL)
 671  671                  prt_dec(pri, 0, val);
 672  672          else
 673  673                  outstring(pri, s);
 674  674  }
 675  675  
 676  676  /*ARGSUSED*/
 677  677  void
 678  678  prt_spm(private_t *pri, int raw, long val)      /* print sigprocmask argument */
 679  679  {
 680  680          const char *s = NULL;
 681  681  
 682  682          if (!raw) {
 683  683                  switch (val) {
 684  684                  case SIG_BLOCK:         s = "SIG_BLOCK";        break;
 685  685                  case SIG_UNBLOCK:       s = "SIG_UNBLOCK";      break;
 686  686                  case SIG_SETMASK:       s = "SIG_SETMASK";      break;
 687  687                  }
 688  688          }
 689  689  
 690  690          if (s == NULL)
 691  691                  prt_dec(pri, 0, val);
 692  692          else
 693  693                  outstring(pri, s);
 694  694  }
 695  695  
 696  696  const char *
 697  697  mmap_protect(private_t *pri, long arg)
 698  698  {
 699  699          char *str = pri->code_buf;
 700  700  
 701  701          if (arg & ~(PROT_READ|PROT_WRITE|PROT_EXEC))
 702  702                  return ((char *)NULL);
 703  703  
 704  704          if (arg == PROT_NONE)
 705  705                  return ("PROT_NONE");
 706  706  
 707  707          *str = '\0';
 708  708          if (arg & PROT_READ)
 709  709                  (void) strlcat(str, "|PROT_READ", sizeof (pri->code_buf));
 710  710          if (arg & PROT_WRITE)
 711  711                  (void) strlcat(str, "|PROT_WRITE", sizeof (pri->code_buf));
 712  712          if (arg & PROT_EXEC)
 713  713                  (void) strlcat(str, "|PROT_EXEC", sizeof (pri->code_buf));
 714  714          return ((const char *)(str + 1));
 715  715  }
 716  716  
 717  717  const char *
 718  718  mmap_type(private_t *pri, long arg)
 719  719  {
 720  720          char *str = pri->code_buf;
 721  721          size_t used;
 722  722  
 723  723  #define CBSIZE  sizeof (pri->code_buf)
 724  724          switch (arg & MAP_TYPE) {
 725  725          case MAP_SHARED:
 726  726                  used = strlcpy(str, "MAP_SHARED", CBSIZE);
 727  727                  break;
 728  728          case MAP_PRIVATE:
 729  729                  used = strlcpy(str, "MAP_PRIVATE", CBSIZE);
 730  730                  break;
 731  731          default:
 732  732                  used = snprintf(str, CBSIZE, "%ld", arg&MAP_TYPE);
 733  733                  break;
 734  734          }
 735  735  
 736  736          arg &= ~(_MAP_NEW|MAP_TYPE);
 737  737  
 738  738          if (arg & ~(MAP_FIXED|MAP_RENAME|MAP_NORESERVE|MAP_ANON|MAP_ALIGN|
 739  739              MAP_TEXT|MAP_INITDATA|MAP_32BIT))
 740  740                  (void) snprintf(str + used, sizeof (pri->code_buf) - used,
 741  741                      "|0x%lX", arg);
 742  742          else {
 743  743                  if (arg & MAP_FIXED)
 744  744                          (void) strlcat(str, "|MAP_FIXED", CBSIZE);
 745  745                  if (arg & MAP_RENAME)
 746  746                          (void) strlcat(str, "|MAP_RENAME", CBSIZE);
 747  747                  if (arg & MAP_NORESERVE)
 748  748                          (void) strlcat(str, "|MAP_NORESERVE", CBSIZE);
 749  749                  if (arg & MAP_ANON)
 750  750                          (void) strlcat(str, "|MAP_ANON", CBSIZE);
 751  751                  if (arg & MAP_ALIGN)
 752  752                          (void) strlcat(str, "|MAP_ALIGN", CBSIZE);
 753  753                  if (arg & MAP_TEXT)
 754  754                          (void) strlcat(str, "|MAP_TEXT", CBSIZE);
 755  755                  if (arg & MAP_INITDATA)
 756  756                          (void) strlcat(str, "|MAP_INITDATA", CBSIZE);
 757  757                  if (arg & MAP_32BIT)
 758  758                          (void) strlcat(str, "|MAP_32BIT", CBSIZE);
 759  759          }
 760  760  
 761  761          return ((const char *)str);
 762  762  #undef CBSIZE
 763  763  }
 764  764  
 765  765  void
 766  766  prt_mpr(private_t *pri, int raw, long val) /* print mmap()/mprotect() flags */
 767  767  {
 768  768          const char *s = raw? NULL : mmap_protect(pri, val);
 769  769  
 770  770          if (s == NULL)
 771  771                  prt_hhx(pri, 0, val);
 772  772          else
 773  773                  outstring(pri, s);
 774  774  }
 775  775  
 776  776  void
 777  777  prt_mty(private_t *pri, int raw, long val) /* print mmap() mapping type flags */
 778  778  {
 779  779          const char *s = raw? NULL : mmap_type(pri, val);
 780  780  
 781  781          if (s == NULL)
 782  782                  prt_hhx(pri, 0, val);
 783  783          else
 784  784                  outstring(pri, s);
 785  785  }
 786  786  
 787  787  void
 788  788  prt_mob(private_t *pri, int raw, long val) /* print mmapobj() flags */
 789  789  {
 790  790          if (val == 0)
 791  791                  prt_dec(pri, 0, val);
 792  792          else if (raw || (val & ~(MMOBJ_PADDING|MMOBJ_INTERPRET)) != 0)
 793  793                  prt_hhx(pri, 0, val);
 794  794          else {
 795  795  #define CBSIZE  sizeof (pri->code_buf)
 796  796                  char *s = pri->code_buf;
 797  797  
 798  798                  *s = '\0';
 799  799                  if (val & MMOBJ_PADDING)
 800  800                          (void) strlcat(s, "|MMOBJ_PADDING", CBSIZE);
 801  801                  if (val & MMOBJ_INTERPRET)
 802  802                          (void) strlcat(s, "|MMOBJ_INTERPRET", CBSIZE);
 803  803                  outstring(pri, s + 1);
 804  804  #undef CBSIZE
 805  805          }
 806  806  }
 807  807  
 808  808  /*ARGSUSED*/
 809  809  void
 810  810  prt_mcf(private_t *pri, int raw, long val)      /* print memcntl() function */
 811  811  {
 812  812          const char *s = NULL;
 813  813  
 814  814          if (!raw) {
 815  815                  switch (val) {
 816  816                  case MC_SYNC:           s = "MC_SYNC";          break;
 817  817                  case MC_LOCK:           s = "MC_LOCK";          break;
 818  818                  case MC_UNLOCK:         s = "MC_UNLOCK";        break;
 819  819                  case MC_ADVISE:         s = "MC_ADVISE";        break;
 820  820                  case MC_LOCKAS:         s = "MC_LOCKAS";        break;
 821  821                  case MC_UNLOCKAS:       s = "MC_UNLOCKAS";      break;
 822  822                  case MC_HAT_ADVISE:     s = "MC_HAT_ADVISE";    break;
 823  823                  }
 824  824          }
 825  825  
 826  826          if (s == NULL)
 827  827                  prt_dec(pri, 0, val);
 828  828          else
 829  829                  outstring(pri, s);
 830  830  }
 831  831  
 832  832  void
 833  833  prt_mad(private_t *pri, int raw, long val)      /* print madvise() argument */
 834  834  {
 835  835          const char *s = NULL;
 836  836  
 837  837          if (!raw) {
 838  838                  switch (val) {
 839  839                  case MADV_NORMAL:       s = "MADV_NORMAL";      break;
 840  840                  case MADV_RANDOM:       s = "MADV_RANDOM";      break;
 841  841                  case MADV_SEQUENTIAL:   s = "MADV_SEQUENTIAL";  break;
 842  842                  case MADV_WILLNEED:     s = "MADV_WILLNEED";    break;
 843  843                  case MADV_DONTNEED:     s = "MADV_DONTNEED";    break;
 844  844                  case MADV_FREE:         s = "MADV_FREE";        break;
 845  845                  case MADV_ACCESS_DEFAULT: s = "MADV_ACCESS_DEFAULT";    break;
 846  846                  case MADV_ACCESS_LWP:   s = "MADV_ACCESS_LWP";  break;
 847  847                  case MADV_ACCESS_MANY:  s = "MADV_ACCESS_MANY"; break;
 848  848                  case MADV_PURGE:        s = "MADV_PURGE";       break;
 849  849                  }
 850  850          }
 851  851  
 852  852          if (s == NULL)
 853  853                  prt_dec(pri, 0, val);
 854  854          else
 855  855                  outstring(pri, s);
 856  856  }
 857  857  
 858  858  void
 859  859  prt_mc4(private_t *pri, int raw, long val) /* print memcntl() (4th) argument */
 860  860  {
 861  861          if (val == 0)
 862  862                  prt_dec(pri, 0, val);
 863  863          else if (raw)
 864  864                  prt_hhx(pri, 0, val);
 865  865          else {
  
    | 
      ↓ open down ↓ | 
    865 lines elided | 
    
      ↑ open up ↑ | 
  
 866  866                  char *s = NULL;
 867  867  
 868  868  #define CBSIZE  sizeof (pri->code_buf)
 869  869                  /* cheating -- look at memcntl func */
 870  870                  switch (pri->sys_args[2]) {
 871  871                  case MC_ADVISE:
 872  872                          prt_mad(pri, 0, val);
 873  873                          return;
 874  874  
 875  875                  case MC_SYNC:
 876      -                        if ((val & ~(MS_SYNC|MS_ASYNC|MS_INVALIDATE)) == 0) {
      876 +                        if ((val &
      877 +                            ~(MS_SYNC|MS_ASYNC|MS_INVALIDATE|MS_INVALCURPROC))
      878 +                            == 0) {
 877  879                                  *(s = pri->code_buf) = '\0';
 878  880                                  if (val & MS_SYNC)
 879  881                                          (void) strlcat(s, "|MS_SYNC", CBSIZE);
 880  882                                  if (val & MS_ASYNC)
 881  883                                          (void) strlcat(s, "|MS_ASYNC", CBSIZE);
 882  884                                  if (val & MS_INVALIDATE)
 883  885                                          (void) strlcat(s, "|MS_INVALIDATE",
 884  886                                              CBSIZE);
      887 +                                if (val & MS_INVALCURPROC)
      888 +                                        (void) strlcat(s, "|MS_INVALCURPROC",
      889 +                                            CBSIZE);
 885  890                          }
 886  891                          break;
 887  892  
 888  893                  case MC_LOCKAS:
 889  894                  case MC_UNLOCKAS:
 890  895                          if ((val & ~(MCL_CURRENT|MCL_FUTURE)) == 0) {
 891  896                                  *(s = pri->code_buf) = '\0';
 892  897                                  if (val & MCL_CURRENT)
 893  898                                          (void) strlcat(s, "|MCL_CURRENT",
 894  899                                              CBSIZE);
 895  900                                  if (val & MCL_FUTURE)
 896  901                                          (void) strlcat(s, "|MCL_FUTURE",
 897  902                                              CBSIZE);
 898  903                          }
 899  904                          break;
 900  905                  }
 901  906  #undef CBSIZE
 902  907  
 903  908                  if (s == NULL || *s == '\0')
 904  909                          prt_hhx(pri, 0, val);
 905  910                  else
 906  911                          outstring(pri, ++s);
 907  912          }
 908  913  }
 909  914  
 910  915  void
 911  916  prt_mc5(private_t *pri, int raw, long val) /* print memcntl() (5th) argument */
 912  917  {
 913  918          char *s;
 914  919  
 915  920  #define CBSIZE  sizeof (pri->code_buf)
 916  921          if (val == 0)
 917  922                  prt_dec(pri, 0, val);
 918  923          else if (raw || (val & ~VALID_ATTR))
 919  924                  prt_hhx(pri, 0, val);
 920  925          else {
 921  926                  s = pri->code_buf;
 922  927                  *s = '\0';
 923  928                  if (val & SHARED)
 924  929                          (void) strlcat(s, "|SHARED", CBSIZE);
 925  930                  if (val & PRIVATE)
 926  931                          (void) strlcat(s, "|PRIVATE", CBSIZE);
 927  932                  if (val & PROT_READ)
 928  933                          (void) strlcat(s, "|PROT_READ", CBSIZE);
 929  934                  if (val & PROT_WRITE)
 930  935                          (void) strlcat(s, "|PROT_WRITE", CBSIZE);
 931  936                  if (val & PROT_EXEC)
 932  937                          (void) strlcat(s, "|PROT_EXEC", CBSIZE);
 933  938                  if (*s == '\0')
 934  939                          prt_hhx(pri, 0, val);
 935  940                  else
 936  941                          outstring(pri, ++s);
 937  942          }
 938  943  #undef CBSIZE
 939  944  }
 940  945  
 941  946  void
 942  947  prt_ulm(private_t *pri, int raw, long val)      /* print ulimit() argument */
 943  948  {
 944  949          const char *s = NULL;
 945  950  
 946  951          if (!raw) {
 947  952                  switch (val) {
 948  953                  case UL_GFILLIM:        s = "UL_GFILLIM";       break;
 949  954                  case UL_SFILLIM:        s = "UL_SFILLIM";       break;
 950  955                  case UL_GMEMLIM:        s = "UL_GMEMLIM";       break;
 951  956                  case UL_GDESLIM:        s = "UL_GDESLIM";       break;
 952  957                  }
 953  958          }
 954  959  
 955  960          if (s == NULL)
 956  961                  prt_dec(pri, 0, val);
 957  962          else
 958  963                  outstring(pri, s);
 959  964  }
 960  965  
 961  966  void
 962  967  prt_rlm(private_t *pri, int raw, long val) /* print get/setrlimit() argument */
 963  968  {
 964  969          const char *s = NULL;
 965  970  
 966  971          if (!raw) {
 967  972                  switch (val) {
 968  973                  case RLIMIT_CPU:        s = "RLIMIT_CPU";       break;
 969  974                  case RLIMIT_FSIZE:      s = "RLIMIT_FSIZE";     break;
 970  975                  case RLIMIT_DATA:       s = "RLIMIT_DATA";      break;
 971  976                  case RLIMIT_STACK:      s = "RLIMIT_STACK";     break;
 972  977                  case RLIMIT_CORE:       s = "RLIMIT_CORE";      break;
 973  978                  case RLIMIT_NOFILE:     s = "RLIMIT_NOFILE";    break;
 974  979                  case RLIMIT_VMEM:       s = "RLIMIT_VMEM";      break;
 975  980                  }
 976  981          }
 977  982  
 978  983          if (s == NULL)
 979  984                  prt_dec(pri, 0, val);
 980  985          else
 981  986                  outstring(pri, s);
 982  987  }
 983  988  
 984  989  void
 985  990  prt_cnf(private_t *pri, int raw, long val)      /* print sysconfig code */
 986  991  {
 987  992          const char *s = raw? NULL : sconfname(val);
 988  993  
 989  994          if (s == NULL)
 990  995                  prt_dec(pri, 0, val);
 991  996          else
 992  997                  outstring(pri, s);
 993  998  }
 994  999  
 995 1000  void
 996 1001  prt_inf(private_t *pri, int raw, long val)      /* print sysinfo code */
 997 1002  {
 998 1003          const char *s = NULL;
 999 1004  
1000 1005          if (!raw) {
1001 1006                  switch (val) {
1002 1007                  case SI_SYSNAME:        s = "SI_SYSNAME";       break;
1003 1008                  case SI_HOSTNAME:       s = "SI_HOSTNAME";      break;
1004 1009                  case SI_RELEASE:        s = "SI_RELEASE";       break;
1005 1010                  case SI_VERSION:        s = "SI_VERSION";       break;
1006 1011                  case SI_MACHINE:        s = "SI_MACHINE";       break;
1007 1012                  case SI_ARCHITECTURE:   s = "SI_ARCHITECTURE";  break;
1008 1013                  case SI_ARCHITECTURE_32:s = "SI_ARCHITECTURE_32"; break;
1009 1014                  case SI_ARCHITECTURE_64:s = "SI_ARCHITECTURE_64"; break;
1010 1015                  case SI_ARCHITECTURE_K: s = "SI_ARCHITECTURE_K"; break;
1011 1016                  case SI_HW_SERIAL:      s = "SI_HW_SERIAL";     break;
1012 1017                  case SI_HW_PROVIDER:    s = "SI_HW_PROVIDER";   break;
1013 1018                  case SI_SRPC_DOMAIN:    s = "SI_SRPC_DOMAIN";   break;
1014 1019                  case SI_SET_HOSTNAME:   s = "SI_SET_HOSTNAME";  break;
1015 1020                  case SI_SET_SRPC_DOMAIN: s = "SI_SET_SRPC_DOMAIN"; break;
1016 1021                  case SI_PLATFORM:       s = "SI_PLATFORM";      break;
1017 1022                  case SI_ISALIST:        s = "SI_ISALIST";       break;
1018 1023                  case SI_DHCP_CACHE:     s = "SI_DHCP_CACHE";    break;
1019 1024                  }
1020 1025          }
1021 1026  
1022 1027          if (s == NULL)
1023 1028                  prt_dec(pri, 0, val);
1024 1029          else
1025 1030                  outstring(pri, s);
1026 1031  }
1027 1032  
1028 1033  void
1029 1034  prt_ptc(private_t *pri, int raw, long val)      /* print pathconf code */
1030 1035  {
1031 1036          const char *s = raw? NULL : pathconfname(val);
1032 1037  
1033 1038          if (s == NULL)
1034 1039                  prt_dec(pri, 0, val);
1035 1040          else
1036 1041                  outstring(pri, s);
1037 1042  }
1038 1043  
1039 1044  void
1040 1045  prt_fui(private_t *pri, int raw, long val) /* print fusers() input argument */
1041 1046  {
1042 1047          const char *s = raw? NULL : fuiname(val);
1043 1048  
1044 1049          if (s == NULL)
1045 1050                  prt_hhx(pri, 0, val);
1046 1051          else
1047 1052                  outstring(pri, s);
1048 1053  }
1049 1054  
1050 1055  void
1051 1056  prt_lwf(private_t *pri, int raw, long val)      /* print lwp_create() flags */
1052 1057  {
1053 1058          char *s;
1054 1059  
1055 1060          if (val == 0)
1056 1061                  prt_dec(pri, 0, val);
1057 1062          else if (raw ||
1058 1063              (val & ~(LWP_DAEMON|LWP_DETACHED|LWP_SUSPENDED)))
1059 1064                  prt_hhx(pri, 0, val);
1060 1065          else {
1061 1066  #define CBSIZE  sizeof (pri->code_buf)
1062 1067                  s = pri->code_buf;
1063 1068                  *s = '\0';
1064 1069                  if (val & LWP_DAEMON)
1065 1070                          (void) strlcat(s, "|LWP_DAEMON", CBSIZE);
1066 1071                  if (val & LWP_DETACHED)
1067 1072                          (void) strlcat(s, "|LWP_DETACHED", CBSIZE);
1068 1073                  if (val & LWP_SUSPENDED)
1069 1074                          (void) strlcat(s, "|LWP_SUSPENDED", CBSIZE);
1070 1075                  outstring(pri, ++s);
1071 1076  #undef CBSIZE
1072 1077          }
1073 1078  }
1074 1079  
1075 1080  void
1076 1081  prt_itm(private_t *pri, int raw, long val) /* print [get|set]itimer() arg */
1077 1082  {
1078 1083          const char *s = NULL;
1079 1084  
1080 1085          if (!raw) {
1081 1086                  switch (val) {
1082 1087                  case ITIMER_REAL:       s = "ITIMER_REAL";      break;
1083 1088                  case ITIMER_VIRTUAL:    s = "ITIMER_VIRTUAL";   break;
1084 1089                  case ITIMER_PROF:       s = "ITIMER_PROF";      break;
1085 1090  #ifdef ITIMER_REALPROF
1086 1091                  case ITIMER_REALPROF:   s = "ITIMER_REALPROF";  break;
1087 1092  #endif
1088 1093                  }
1089 1094          }
1090 1095  
1091 1096          if (s == NULL)
1092 1097                  prt_dec(pri, 0, val);
1093 1098          else
1094 1099                  outstring(pri, s);
1095 1100  }
1096 1101  
1097 1102  void
1098 1103  prt_mod(private_t *pri, int raw, long val)      /* print modctl() code */
1099 1104  {
1100 1105          const char *s = NULL;
1101 1106  
1102 1107          if (!raw) {
1103 1108                  switch (val) {
1104 1109                  case MODLOAD:           s = "MODLOAD";          break;
1105 1110                  case MODUNLOAD:         s = "MODUNLOAD";        break;
1106 1111                  case MODINFO:           s = "MODINFO";          break;
1107 1112                  case MODRESERVED:       s = "MODRESERVED";      break;
1108 1113                  case MODSETMINIROOT:    s = "MODSETMINIROOT";   break;
1109 1114                  case MODADDMAJBIND:     s = "MODADDMAJBIND";    break;
1110 1115                  case MODGETPATH:        s = "MODGETPATH";       break;
1111 1116                  case MODGETPATHLEN:     s = "MODGETPATHLEN";    break;
1112 1117                  case MODREADSYSBIND:    s = "MODREADSYSBIND";   break;
1113 1118                  case MODGETMAJBIND:     s = "MODGETMAJBIND";    break;
1114 1119                  case MODGETNAME:        s = "MODGETNAME";       break;
1115 1120                  case MODSIZEOF_DEVID:   s = "MODSIZEOF_DEVID";  break;
1116 1121                  case MODGETDEVID:       s = "MODGETDEVID";      break;
1117 1122                  case MODSIZEOF_MINORNAME: s = "MODSIZEOF_MINORNAME"; break;
1118 1123                  case MODGETMINORNAME:   s = "MODGETMINORNAME";  break;
1119 1124                  case MODGETFBNAME:      s = "MODGETFBNAME";     break;
1120 1125                  case MODEVENTS:         s = "MODEVENTS";        break;
1121 1126                  case MODREREADDACF:     s = "MODREREADDACF";    break;
1122 1127                  case MODLOADDRVCONF:    s = "MODLOADDRVCONF";   break;
1123 1128                  case MODUNLOADDRVCONF:  s = "MODUNLOADDRVCONF"; break;
1124 1129                  case MODREMMAJBIND:     s = "MODREMMAJBIND";    break;
1125 1130                  case MODDEVT2INSTANCE:  s = "MODDEVT2INSTANCE"; break;
1126 1131                  case MODGETDEVFSPATH_LEN: s = "MODGETDEVFSPATH_LEN"; break;
1127 1132                  case MODGETDEVFSPATH:   s = "MODGETDEVFSPATH";  break;
1128 1133                  case MODDEVID2PATHS:    s = "MODDEVID2PATHS";   break;
1129 1134                  case MODSETDEVPOLICY:   s = "MODSETDEVPOLICY";  break;
1130 1135                  case MODGETDEVPOLICY:   s = "MODGETDEVPOLICY";  break;
1131 1136                  case MODALLOCPRIV:      s = "MODALLOCPRIV";     break;
1132 1137                  case MODGETDEVPOLICYBYNAME:
1133 1138                                          s = "MODGETDEVPOLICYBYNAME"; break;
1134 1139                  case MODLOADMINORPERM:  s = "MODLOADMINORPERM"; break;
1135 1140                  case MODADDMINORPERM:   s = "MODADDMINORPERM"; break;
1136 1141                  case MODREMMINORPERM:   s = "MODREMMINORPERM"; break;
1137 1142                  case MODREMDRVCLEANUP:  s = "MODREMDRVCLEANUP"; break;
1138 1143                  case MODDEVEXISTS:      s = "MODDEVEXISTS"; break;
1139 1144                  case MODDEVREADDIR:     s = "MODDEVREADDIR"; break;
1140 1145                  case MODDEVEMPTYDIR:    s = "MODDEVEMPTYDIR"; break;
1141 1146                  case MODDEVNAME:        s = "MODDEVNAME"; break;
1142 1147                  case MODGETDEVFSPATH_MI_LEN:
1143 1148                                          s = "MODGETDEVFSPATH_MI_LEN"; break;
1144 1149                  case MODGETDEVFSPATH_MI:
1145 1150                                          s = "MODGETDEVFSPATH_MI"; break;
1146 1151                  case MODREMDRVALIAS:    s = "MODREMDRVALIAS"; break;
1147 1152                  case MODHPOPS:  s = "MODHPOPS"; break;
1148 1153                  }
1149 1154          }
1150 1155  
1151 1156          if (s == NULL)
1152 1157                  prt_dec(pri, 0, val);
1153 1158          else
1154 1159                  outstring(pri, s);
1155 1160  }
1156 1161  
1157 1162  void
1158 1163  prt_acl(private_t *pri, int raw, long val)      /* print acl() code */
1159 1164  {
1160 1165          const char *s = NULL;
1161 1166  
1162 1167          if (!raw) {
1163 1168                  switch (val) {
1164 1169                  case GETACL:            s = "GETACL";           break;
1165 1170                  case SETACL:            s = "SETACL";           break;
1166 1171                  case GETACLCNT:         s = "GETACLCNT";        break;
1167 1172                  case ACE_GETACL:        s = "ACE_GETACL";       break;
1168 1173                  case ACE_SETACL:        s = "ACE_SETACL";       break;
1169 1174                  case ACE_GETACLCNT:     s = "ACE_GETACLCNT";    break;
1170 1175                  }
1171 1176          }
1172 1177  
1173 1178          if (s == NULL)
1174 1179                  prt_dec(pri, 0, val);
1175 1180          else
1176 1181                  outstring(pri, s);
1177 1182  }
1178 1183  
1179 1184  void
1180 1185  prt_aio(private_t *pri, int raw, long val)      /* print kaio() code */
1181 1186  {
1182 1187          const char *s = NULL;
1183 1188          char buf[32];
1184 1189  
1185 1190          if (!raw) {
1186 1191                  switch (val & ~AIO_POLL_BIT) {
1187 1192                  case AIOREAD:           s = "AIOREAD";          break;
1188 1193                  case AIOWRITE:          s = "AIOWRITE";         break;
1189 1194                  case AIOWAIT:           s = "AIOWAIT";          break;
1190 1195                  case AIOCANCEL:         s = "AIOCANCEL";        break;
1191 1196                  case AIONOTIFY:         s = "AIONOTIFY";        break;
1192 1197                  case AIOINIT:           s = "AIOINIT";          break;
1193 1198                  case AIOSTART:          s = "AIOSTART";         break;
1194 1199                  case AIOLIO:            s = "AIOLIO";           break;
1195 1200                  case AIOSUSPEND:        s = "AIOSUSPEND";       break;
1196 1201                  case AIOERROR:          s = "AIOERROR";         break;
1197 1202                  case AIOLIOWAIT:        s = "AIOLIOWAIT";       break;
1198 1203                  case AIOAREAD:          s = "AIOAREAD";         break;
1199 1204                  case AIOAWRITE:         s = "AIOAWRITE";        break;
1200 1205                  /*
1201 1206                   * We have to hardcode the values for the 64-bit versions of
1202 1207                   * these calls, because <sys/aio.h> defines them to be identical
1203 1208                   * when compiled 64-bit.  If our target is 32-bit, we still need
1204 1209                   * to decode them correctly.
1205 1210                   */
1206 1211                  case 13:                s = "AIOLIO64";         break;
1207 1212                  case 14:                s = "AIOSUSPEND64";     break;
1208 1213                  case 15:                s = "AUIOERROR64";      break;
1209 1214                  case 16:                s = "AIOLIOWAIT64";     break;
1210 1215                  case 17:                s = "AIOAREAD64";       break;
1211 1216                  case 18:                s = "AIOAWRITE64";      break;
1212 1217                  case 19:                s = "AIOCANCEL64";      break;
1213 1218  
1214 1219                  /*
1215 1220                   * AIOFSYNC doesn't correspond to a syscall.
1216 1221                   */
1217 1222                  case AIOWAITN:          s = "AIOWAITN";         break;
1218 1223                  }
1219 1224                  if (s != NULL && (val & AIO_POLL_BIT)) {
1220 1225                          (void) strlcpy(buf, s, sizeof (buf));
1221 1226                          (void) strlcat(buf, "|AIO_POLL_BIT", sizeof (buf));
1222 1227                          s = (const char *)buf;
1223 1228                  }
1224 1229          }
1225 1230  
1226 1231          if (s == NULL)
1227 1232                  prt_dec(pri, 0, val);
1228 1233          else
1229 1234                  outstring(pri, s);
1230 1235  }
1231 1236  
1232 1237  void
1233 1238  prt_aud(private_t *pri, int raw, long val)      /* print auditsys() code */
1234 1239  {
1235 1240          const char *s = NULL;
1236 1241  
1237 1242          if (!raw) {
1238 1243                  switch (val) {
1239 1244                  case BSM_GETAUID:       s = "BSM_GETAUID";      break;
1240 1245                  case BSM_SETAUID:       s = "BSM_SETAUID";      break;
1241 1246                  case BSM_GETAUDIT:      s = "BSM_GETAUDIT";     break;
1242 1247                  case BSM_SETAUDIT:      s = "BSM_SETAUDIT";     break;
1243 1248                  case BSM_AUDIT:         s = "BSM_AUDIT";        break;
1244 1249                  case BSM_AUDITCTL:      s = "BSM_AUDITCTL";     break;
1245 1250                  case BSM_GETAUDIT_ADDR: s = "BSM_GETAUDIT_ADDR"; break;
1246 1251                  case BSM_SETAUDIT_ADDR: s = "BSM_SETAUDIT_ADDR"; break;
1247 1252                  }
1248 1253          }
1249 1254  
1250 1255          if (s == NULL)
1251 1256                  prt_dec(pri, 0, val);
1252 1257          else
1253 1258                  outstring(pri, s);
1254 1259  }
1255 1260  
1256 1261  void
1257 1262  prt_cor(private_t *pri, int raw, long val)      /* print corectl() subcode */
1258 1263  {
1259 1264          const char *s = NULL;
1260 1265  
1261 1266          if (!raw) {
1262 1267                  switch (val) {
1263 1268                  case CC_SET_OPTIONS:
1264 1269                          s = "CC_SET_OPTIONS";           break;
1265 1270                  case CC_GET_OPTIONS:
1266 1271                          s = "CC_GET_OPTIONS";           break;
1267 1272                  case CC_SET_GLOBAL_PATH:
1268 1273                          s = "CC_SET_GLOBAL_PATH";       break;
1269 1274                  case CC_GET_GLOBAL_PATH:
1270 1275                          s = "CC_GET_GLOBAL_PATH";       break;
1271 1276                  case CC_SET_PROCESS_PATH:
1272 1277                          s = "CC_SET_PROCESS_PATH";      break;
1273 1278                  case CC_GET_PROCESS_PATH:
1274 1279                          s = "CC_GET_PROCESS_PATH";      break;
1275 1280                  case CC_SET_GLOBAL_CONTENT:
1276 1281                          s = "CC_SET_GLOBAL_CONTENT";    break;
1277 1282                  case CC_GET_GLOBAL_CONTENT:
1278 1283                          s = "CC_GET_GLOBAL_CONTENT";    break;
1279 1284                  case CC_SET_PROCESS_CONTENT:
1280 1285                          s = "CC_SET_PROCESS_CONTENT";   break;
1281 1286                  case CC_GET_PROCESS_CONTENT:
1282 1287                          s = "CC_GET_PROCESS_CONTENT";   break;
1283 1288                  case CC_SET_DEFAULT_PATH:
1284 1289                          s = "CC_SET_DEFAULT_PATH";      break;
1285 1290                  case CC_GET_DEFAULT_PATH:
1286 1291                          s = "CC_GET_DEFAULT_PATH";      break;
1287 1292                  case CC_SET_DEFAULT_CONTENT:
1288 1293                          s = "CC_SET_DEFAULT_CONTENT";   break;
1289 1294                  case CC_GET_DEFAULT_CONTENT:
1290 1295                          s = "CC_GET_DEFAULT_CONTENT";   break;
1291 1296                  }
1292 1297          }
1293 1298  
1294 1299          if (s == NULL)
1295 1300                  prt_dec(pri, 0, val);
1296 1301          else
1297 1302                  outstring(pri, s);
1298 1303  }
1299 1304  
1300 1305  void
1301 1306  prt_cco(private_t *pri, int raw, long val)      /* print corectl() options */
1302 1307  {
1303 1308          char *s;
1304 1309  
1305 1310          if (val == 0)
1306 1311                  prt_dec(pri, 0, val);
1307 1312          else if (raw || (val & ~CC_OPTIONS))
1308 1313                  prt_hhx(pri, 0, val);
1309 1314          else {
1310 1315  #define CBSIZE  sizeof (pri->code_buf)
1311 1316                  s = pri->code_buf;
1312 1317                  *s = '\0';
1313 1318                  if (val & CC_GLOBAL_PATH)
1314 1319                          (void) strlcat(s, "|CC_GLOBAL_PATH", CBSIZE);
1315 1320                  if (val & CC_PROCESS_PATH)
1316 1321                          (void) strlcat(s, "|CC_PROCESS_PATH", CBSIZE);
1317 1322                  if (val & CC_GLOBAL_SETID)
1318 1323                          (void) strlcat(s, "|CC_GLOBAL_SETID", CBSIZE);
1319 1324                  if (val & CC_PROCESS_SETID)
1320 1325                          (void) strlcat(s, "|CC_PROCESS_SETID", CBSIZE);
1321 1326                  if (val & CC_GLOBAL_LOG)
1322 1327                          (void) strlcat(s, "|CC_GLOBAL_LOG", CBSIZE);
1323 1328                  if (*s == '\0')
1324 1329                          prt_hhx(pri, 0, val);
1325 1330                  else
1326 1331                          outstring(pri, ++s);
1327 1332  #undef CBSIZE
1328 1333          }
1329 1334  }
1330 1335  
1331 1336  void
1332 1337  prt_ccc(private_t *pri, int raw, long val)      /* print corectl() content */
1333 1338  {
1334 1339          core_content_t ccc;
1335 1340  
1336 1341          if (Pread(Proc, &ccc, sizeof (ccc), val) != sizeof (ccc))
1337 1342                  prt_hex(pri, 0, val);
1338 1343          else if (!raw && proc_content2str(ccc, pri->code_buf,
1339 1344              sizeof (pri->code_buf)) >= 0)
1340 1345                  outstring(pri, pri->code_buf);
1341 1346          else
1342 1347                  prt_hhx(pri, 0, (long)ccc);
1343 1348  }
1344 1349  
1345 1350  void
1346 1351  prt_rcc(private_t *pri, int raw, long val)      /* print corectl() ret. cont. */
1347 1352  {
1348 1353          core_content_t ccc;
1349 1354  
1350 1355          if (pri->Errno || Pread(Proc, &ccc, sizeof (ccc), val) != sizeof (ccc))
1351 1356                  prt_hex(pri, 0, val);
1352 1357          else if (!raw && proc_content2str(ccc, pri->code_buf,
1353 1358              sizeof (pri->code_buf)) >= 0)
1354 1359                  outstring(pri, pri->code_buf);
1355 1360          else
1356 1361                  prt_hhx(pri, 0, (long)ccc);
1357 1362  }
1358 1363  
1359 1364  void
1360 1365  prt_cpc(private_t *pri, int raw, long val)      /* print cpc() subcode */
1361 1366  {
1362 1367          const char *s = NULL;
1363 1368  
1364 1369          if (!raw) {
1365 1370                  switch (val) {
1366 1371                  case CPC_BIND:          s = "CPC_BIND";         break;
1367 1372                  case CPC_SAMPLE:        s = "CPC_SAMPLE";       break;
1368 1373                  case CPC_INVALIDATE:    s = "CPC_INVALIDATE";   break;
1369 1374                  case CPC_RELE:          s = "CPC_RELE";         break;
1370 1375                  case CPC_EVLIST_SIZE:   s = "CPC_EVLIST_SIZE";  break;
1371 1376                  case CPC_LIST_EVENTS:   s = "CPC_LIST_EVENTS";  break;
1372 1377                  case CPC_ATTRLIST_SIZE: s = "CPC_ATTRLIST_SIZE"; break;
1373 1378                  case CPC_LIST_ATTRS:    s = "CPC_LIST_ATTRS";   break;
1374 1379                  case CPC_IMPL_NAME:     s = "CPC_IMPL_NAME";    break;
1375 1380                  case CPC_CPUREF:        s = "CPC_CPUREF";       break;
1376 1381                  case CPC_USR_EVENTS:    s = "CPC_USR_EVENTS";   break;
1377 1382                  case CPC_SYS_EVENTS:    s = "CPC_SYS_EVENTS";   break;
1378 1383                  case CPC_NPIC:          s = "CPC_NPIC";         break;
1379 1384                  case CPC_CAPS:          s = "CPC_CAPS";         break;
1380 1385                  case CPC_ENABLE:        s = "CPC_ENABLE";       break;
1381 1386                  case CPC_DISABLE:       s = "CPC_DISABLE";      break;
1382 1387                  }
1383 1388          }
1384 1389  
1385 1390          if (s == NULL)
1386 1391                  prt_dec(pri, 0, val);
1387 1392          else
1388 1393                  outstring(pri, s);
1389 1394  }
1390 1395  
1391 1396  void
1392 1397  outstring(private_t *pri, const char *s)
1393 1398  {
1394 1399          int len = strlen(s);
1395 1400  
1396 1401          GROW(len);
1397 1402          (void) strcpy(pri->sys_string + pri->sys_leng, s);
1398 1403          pri->sys_leng += len;
1399 1404  }
1400 1405  
1401 1406  void
1402 1407  grow(private_t *pri, int nbyte) /* reallocate format buffer if necessary */
1403 1408  {
1404 1409          while (pri->sys_leng + nbyte >= pri->sys_ssize)
1405 1410                  pri->sys_string = my_realloc(pri->sys_string,
1406 1411                      pri->sys_ssize *= 2, "format buffer");
1407 1412  }
1408 1413  
1409 1414  void
1410 1415  prt_clc(private_t *pri, int raw, long val)
1411 1416  {
1412 1417          const char *s = NULL;
1413 1418  
1414 1419          if (!raw) {
1415 1420                  switch (val) {
1416 1421                  case CL_INITIALIZE:     s = "CL_INITIALIZE";    break;
1417 1422                  case CL_CONFIG:         s = "CL_CONFIG";        break;
1418 1423                  }
1419 1424          }
1420 1425  
1421 1426          if (s == NULL)
1422 1427                  prt_dec(pri, 0, val);
1423 1428          else
1424 1429                  outstring(pri, s);
1425 1430  }
1426 1431  
1427 1432  void
1428 1433  prt_clf(private_t *pri, int raw, long val)
1429 1434  {
1430 1435          const char *s = NULL;
1431 1436  
1432 1437          if (!raw) {
1433 1438                  switch (pri->sys_args[0]) {
1434 1439                  case CL_CONFIG:
1435 1440                          switch (pri->sys_args[1]) {
1436 1441                          case CL_NODEID:
1437 1442                                  s = "CL_NODEID";                break;
1438 1443                          case CL_HIGHEST_NODEID:
1439 1444                                  s = "CL_HIGHEST_NODEID";        break;
1440 1445                          }
1441 1446                          break;
1442 1447                  case CL_INITIALIZE:
1443 1448                          switch (pri->sys_args[1]) {
1444 1449                          case CL_GET_BOOTFLAG:
1445 1450                                  s = "CL_GET_BOOTFLAG";          break;
1446 1451                          }
1447 1452                          break;
1448 1453                  }
1449 1454          }
1450 1455  
1451 1456          if (s == NULL)
1452 1457                  prt_dec(pri, 0, val);
1453 1458          else
1454 1459                  outstring(pri, s);
1455 1460  }
1456 1461  
1457 1462  void
1458 1463  prt_sqc(private_t *pri, int raw, long val)      /* print sigqueue() si_code */
1459 1464  {
1460 1465          const char *s = NULL;
1461 1466  
1462 1467          if (!raw) {
1463 1468                  switch ((int)val) {
1464 1469                  case SI_QUEUE:          s = "SI_QUEUE";         break;
1465 1470                  case SI_TIMER:          s = "SI_TIMER";         break;
1466 1471                  case SI_ASYNCIO:        s = "SI_ASYNCIO";       break;
1467 1472                  case SI_MESGQ:          s = "SI_MESGQ";         break;
1468 1473                  }
1469 1474          }
1470 1475  
1471 1476          if (s == NULL)
1472 1477                  prt_dec(pri, 0, val);
1473 1478          else
1474 1479                  outstring(pri, s);
1475 1480  }
1476 1481  
1477 1482  /*
1478 1483   * print priocntlsys() (key, value) pair key.
1479 1484   */
1480 1485  void
1481 1486  print_pck(private_t *pri, int raw, long val)
1482 1487  {
1483 1488          const char      *s = NULL;
1484 1489          char            clname[PC_CLNMSZ];
1485 1490  
1486 1491          if ((pri->sys_args[2] != PC_GETXPARMS &&
1487 1492              pri->sys_args[2] != PC_SETXPARMS) || val == 0 || raw) {
1488 1493                  prt_dec(pri, 0, val);
1489 1494                  return;
1490 1495          }
1491 1496  
1492 1497          if (pri->sys_args[3] == NULL) {
1493 1498                  if (val == PC_KY_CLNAME) {
1494 1499                          s = "PC_KY_CLNAME";
1495 1500                          outstring(pri, s);
1496 1501                  } else
1497 1502                          prt_dec(pri, 0, val);
1498 1503                  return;
1499 1504          }
1500 1505  
1501 1506          if (Pread(Proc, &clname, PC_CLNMSZ, pri->sys_args[3]) != PC_CLNMSZ) {
1502 1507                  prt_dec(pri, 0, val);
1503 1508                  return;
1504 1509          }
1505 1510  
1506 1511          if (strcmp(clname, "TS") == 0) {
1507 1512                  switch (val) {
1508 1513                  case TS_KY_UPRILIM:     s = "TS_KY_UPRILIM";    break;
1509 1514                  case TS_KY_UPRI:        s = "TS_KY_UPRI";       break;
1510 1515                  default:                                        break;
1511 1516                  }
1512 1517          } else if (strcmp(clname, "IA") == 0) {
1513 1518                  switch (val) {
1514 1519                  case IA_KY_UPRILIM:     s = "IA_KY_UPRILIM";    break;
1515 1520                  case IA_KY_UPRI:        s = "IA_KY_UPRI";       break;
1516 1521                  case IA_KY_MODE:        s = "IA_KY_MODE";       break;
1517 1522                  default:                                        break;
1518 1523                  }
1519 1524          } else if (strcmp(clname, "RT") == 0) {
1520 1525                  switch (val) {
1521 1526                  case RT_KY_PRI:         s = "RT_KY_PRI";        break;
1522 1527                  case RT_KY_TQSECS:      s = "RT_KY_TQSECS";     break;
1523 1528                  case RT_KY_TQNSECS:     s = "RT_KY_TQNSECS";    break;
1524 1529                  case RT_KY_TQSIG:       s = "RT_KY_TQSIG";      break;
1525 1530                  default:                                        break;
1526 1531                  }
1527 1532          } else if (strcmp(clname, "FSS") == 0) {
1528 1533                  switch (val) {
1529 1534                  case FSS_KY_UPRILIM:    s = "FSS_KY_UPRILIM";   break;
1530 1535                  case FSS_KY_UPRI:       s = "FSS_KY_UPRI";      break;
1531 1536                  default:                                        break;
1532 1537                  }
1533 1538          } else if (strcmp(clname, "FX") == 0) {
1534 1539                  switch (val) {
1535 1540                  case FX_KY_UPRILIM:     s = "FX_KY_UPRILIM";    break;
1536 1541                  case FX_KY_UPRI:        s = "FX_KY_UPRI";       break;
1537 1542                  case FX_KY_TQSECS:      s = "FX_KY_TQSECS";     break;
1538 1543                  case FX_KY_TQNSECS:     s = "FX_KY_TQNSECS";    break;
1539 1544                  default:                                        break;
1540 1545                  }
1541 1546          }
1542 1547  
1543 1548          if (s == NULL)
1544 1549                  prt_dec(pri, 0, val);
1545 1550          else
1546 1551                  outstring(pri, s);
1547 1552  }
1548 1553  
1549 1554  /*
1550 1555   * print priocntlsys() fourth argument.
1551 1556   */
1552 1557  /*ARGSUSED*/
1553 1558  void
1554 1559  prt_pc4(private_t *pri, int raw, long val)
1555 1560  {
1556 1561          /* look at pricntlsys function */
1557 1562          if ((pri->sys_args[2] != PC_GETXPARMS &&
1558 1563              pri->sys_args[2] != PC_SETXPARMS))
1559 1564                  prt_hex(pri, 0, val);
1560 1565          else if (val)
1561 1566                  prt_stg(pri, 0, val);
1562 1567          else
1563 1568                  prt_dec(pri, 0, val);
1564 1569  }
1565 1570  
1566 1571  /*
1567 1572   * print priocntlsys() (key, value) pairs (5th argument).
1568 1573   */
1569 1574  /*ARGSUSED*/
1570 1575  void
1571 1576  prt_pc5(private_t *pri, int raw, long val)
1572 1577  {
1573 1578          pc_vaparms_t    prms;
1574 1579          pc_vaparm_t     *vpp = &prms.pc_parms[0];
1575 1580          uint_t          cnt;
1576 1581  
1577 1582  
1578 1583          /* look at pricntlsys function */
1579 1584          if ((pri->sys_args[2] != PC_GETXPARMS &&
1580 1585              pri->sys_args[2] != PC_SETXPARMS) || val == 0) {
1581 1586                  prt_dec(pri, 0, 0);
1582 1587                  return;
1583 1588          }
1584 1589  
1585 1590          if (Pread(Proc, &prms, sizeof (prms), val) != sizeof (prms)) {
1586 1591                  prt_hex(pri, 0, val);
1587 1592                  return;
1588 1593          }
1589 1594  
1590 1595          if ((cnt = prms.pc_vaparmscnt) > PC_VAPARMCNT)
1591 1596                  return;
1592 1597  
1593 1598          for (; cnt--; vpp++) {
1594 1599                  print_pck(pri, 0, vpp->pc_key);
1595 1600                  outstring(pri, ", ");
1596 1601                  prt_hex(pri, 0, (long)vpp->pc_parm);
1597 1602                  outstring(pri, ", ");
1598 1603          }
1599 1604  
1600 1605          prt_dec(pri, 0, PC_KY_NULL);
1601 1606  }
1602 1607  
1603 1608  /*
1604 1609   * Print processor set id, including logical expansion of "special" ids.
1605 1610   */
1606 1611  void
1607 1612  prt_pst(private_t *pri, int raw, long val)
1608 1613  {
1609 1614          const char *s = NULL;
1610 1615  
1611 1616          if (!raw) {
1612 1617                  switch ((psetid_t)val) {
1613 1618                  case PS_NONE:           s = "PS_NONE";          break;
1614 1619                  case PS_QUERY:          s = "PS_QUERY";         break;
1615 1620                  case PS_MYID:           s = "PS_MYID";          break;
1616 1621                  }
1617 1622          }
1618 1623  
1619 1624          if (s == NULL)
1620 1625                  prt_dec(pri, 0, val);
1621 1626          else
1622 1627                  outstring(pri, s);
1623 1628  }
1624 1629  
1625 1630  /*
1626 1631   * Print meminfo() argument.
1627 1632   */
1628 1633  /*ARGSUSED*/
1629 1634  void
1630 1635  prt_mif(private_t *pri, int raw, long val)
1631 1636  {
1632 1637          struct meminfo  minfo;
1633 1638  
1634 1639  #ifdef _LP64
1635 1640          if (data_model == PR_MODEL_ILP32) {
1636 1641                  struct meminfo32 minfo32;
1637 1642  
1638 1643                  if (Pread(Proc, &minfo32, sizeof (struct meminfo32), val) !=
1639 1644                          sizeof (struct meminfo32)) {
1640 1645                          prt_dec(pri, 0, pri->sys_args[1]);      /* addr_count */
1641 1646                          outstring(pri, ", ");
1642 1647                          prt_hex(pri, 0, val);
1643 1648                          return;
1644 1649                  }
1645 1650                  /*
1646 1651                   * arrange the arguments in the order that user calls with
1647 1652                   */
1648 1653                  prt_hex(pri, 0, minfo32.mi_inaddr);
1649 1654                  outstring(pri, ", ");
1650 1655                  prt_dec(pri, 0, pri->sys_args[1]);      /* addr_count */
1651 1656                  outstring(pri, ", ");
1652 1657                  prt_hex(pri, 0, minfo32.mi_info_req);
1653 1658                  outstring(pri, ", ");
1654 1659                  prt_dec(pri, 0, minfo32.mi_info_count);
1655 1660                  outstring(pri, ", ");
1656 1661                  prt_hex(pri, 0, minfo32.mi_outdata);
1657 1662                  outstring(pri, ", ");
1658 1663                  prt_hex(pri, 0, minfo32.mi_validity);
1659 1664                  return;
1660 1665          }
1661 1666  #endif
1662 1667          if (Pread(Proc, &minfo, sizeof (struct meminfo), val) !=
1663 1668                  sizeof (struct meminfo)) {
1664 1669                  prt_dec(pri, 0, pri->sys_args[1]);      /* addr_count */
1665 1670                  outstring(pri, ", ");
1666 1671                  prt_hex(pri, 0, val);
1667 1672                  return;
1668 1673          }
1669 1674          /*
1670 1675           * arrange the arguments in the order that user calls with
1671 1676           */
1672 1677          prt_hex(pri, 0, (long)minfo.mi_inaddr);
1673 1678          outstring(pri, ", ");
1674 1679          prt_dec(pri, 0, pri->sys_args[1]);      /* addr_count */
1675 1680          outstring(pri, ", ");
1676 1681          prt_hex(pri, 0, (long)minfo.mi_info_req);
1677 1682          outstring(pri, ", ");
1678 1683          prt_dec(pri, 0, minfo.mi_info_count);
1679 1684          outstring(pri, ", ");
1680 1685          prt_hex(pri, 0, (long)minfo.mi_outdata);
1681 1686          outstring(pri, ", ");
1682 1687          prt_hex(pri, 0, (long)minfo.mi_validity);
1683 1688  }
1684 1689  
1685 1690  
1686 1691  /*
1687 1692   * Print so_socket() 1st argument.
1688 1693   */
1689 1694  /*ARGSUSED*/
1690 1695  void
1691 1696  prt_pfm(private_t *pri, int raw, long val)
1692 1697  {
1693 1698          /* Protocol Families have same names as Address Families */
1694 1699          if ((ulong_t)val < MAX_AFCODES) {
1695 1700                  outstring(pri, "PF_");
1696 1701                  outstring(pri, afcodes[val]);
1697 1702          } else {
1698 1703                  prt_dec(pri, 0, val);
1699 1704          }
1700 1705  }
1701 1706  
1702 1707  /*
1703 1708   * Print sockconfig() subcode.
1704 1709   */
1705 1710  /*ARGSUSED*/
1706 1711  void
1707 1712  prt_skc(private_t *pri, int raw, long val)
1708 1713  {
1709 1714          const char *s = NULL;
1710 1715  
1711 1716          if (!raw) {
1712 1717                  switch (val) {
1713 1718                  case SOCKCONFIG_ADD_SOCK:
1714 1719                          s = "SOCKCONFIG_ADD_SOCK"; break;
1715 1720                  case SOCKCONFIG_REMOVE_SOCK:
1716 1721                          s = "SOCKCONFIG_REMOVE_SOCK"; break;
1717 1722                  case SOCKCONFIG_ADD_FILTER:
1718 1723                          s = "SOCKCONFIG_ADD_FILTER"; break;
1719 1724                  case SOCKCONFIG_REMOVE_FILTER:
1720 1725                          s = "SOCKCONFIG_REMOVE_FILTER"; break;
1721 1726                  }
1722 1727          }
1723 1728          if (s == NULL)
1724 1729                  prt_dec(pri, 0, val);
1725 1730          else
1726 1731                  outstring(pri, s);
1727 1732  }
1728 1733  /*
1729 1734   * Print so_socket() 2nd argument.
1730 1735   */
1731 1736  /*ARGSUSED*/
1732 1737  void
1733 1738  prt_skt(private_t *pri, int raw, long val)
1734 1739  {
1735 1740          const char *s;
1736 1741          long type = val & SOCK_TYPE_MASK;
1737 1742  
1738 1743          if ((ulong_t)type <= MAX_SOCKTYPES &&
1739 1744              (s = socktype_codes[type]) != NULL) {
1740 1745                  outstring(pri, s);
1741 1746                  if ((val & SOCK_CLOEXEC) != 0) {
1742 1747                          outstring(pri, "|SOCK_CLOEXEC");
1743 1748                  }
1744 1749          } else {
1745 1750                  prt_dec(pri, 0, val);
1746 1751          }
1747 1752  }
1748 1753  
1749 1754  
1750 1755  /*
1751 1756   * Print so_socket() 3rd argument.
1752 1757   */
1753 1758  /*ARGSUSED*/
1754 1759  void
1755 1760  prt_skp(private_t *pri, int raw, long val)
1756 1761  {
1757 1762          const char *s;
1758 1763  
1759 1764          /* cheating -- look at the protocol-family */
1760 1765          switch (pri->sys_args[0]) {
1761 1766          case PF_INET6:
1762 1767          case PF_INET:
1763 1768          case PF_NCA:    if ((s = ipprotos((int)val)) != NULL) {
1764 1769                                  outstring(pri, s);
1765 1770                                  break;
1766 1771                          }
1767 1772                          /* FALLTHROUGH */
1768 1773          default:        prt_dec(pri, 0, val);
1769 1774                          break;
1770 1775          }
1771 1776  }
1772 1777  
1773 1778  
1774 1779  /*
1775 1780   * Print so_socket() 5th argument.
1776 1781   */
1777 1782  /*ARGSUSED*/
1778 1783  void
1779 1784  prt_skv(private_t *pri, int raw, long val)
1780 1785  {
1781 1786          switch (val) {
1782 1787          case SOV_STREAM:        outstring(pri, "SOV_STREAM");   break;
1783 1788          case SOV_DEFAULT:       outstring(pri, "SOV_DEFAULT");  break;
1784 1789          case SOV_SOCKSTREAM:    outstring(pri, "SOV_SOCKSTREAM");       break;
1785 1790          case SOV_SOCKBSD:       outstring(pri, "SOV_SOCKBSD");  break;
1786 1791          case SOV_XPG4_2:        outstring(pri, "SOV_XPG4_2");   break;
1787 1792          default:                prt_dec(pri, 0, val);           break;
1788 1793          }
1789 1794  }
1790 1795  
1791 1796  /*
1792 1797   * Print accept4() flags argument.
1793 1798   */
1794 1799  void
1795 1800  prt_acf(private_t *pri, int raw, long val)
1796 1801  {
1797 1802          int first = 1;
1798 1803          if (raw || !val ||
1799 1804              (val & ~(SOCK_CLOEXEC|SOCK_NDELAY|SOCK_NONBLOCK))) {
1800 1805                  prt_dex(pri, 0, val);
1801 1806                  return;
1802 1807          }
1803 1808  
1804 1809          if (val & SOCK_CLOEXEC) {
1805 1810                  outstring(pri, "|SOCK_CLOEXEC" + first);
1806 1811                  first = 0;
1807 1812          }
1808 1813          if (val & SOCK_NDELAY) {
1809 1814                  outstring(pri, "|SOCK_NDELAY" + first);
1810 1815                  first = 0;
1811 1816          }
1812 1817          if (val & SOCK_NONBLOCK) {
1813 1818                  outstring(pri, "|SOCK_NONBLOCK" + first);
1814 1819          }
1815 1820  }
1816 1821  
1817 1822  
1818 1823  /*
1819 1824   * Print setsockopt()/getsockopt() 2nd argument.
1820 1825   */
1821 1826  /*ARGSUSED*/
1822 1827  void
1823 1828  prt_sol(private_t *pri, int raw, long val)
1824 1829  {
1825 1830          if (val == SOL_SOCKET) {
1826 1831                  outstring(pri, "SOL_SOCKET");
1827 1832          } else if (val == SOL_ROUTE) {
1828 1833                  outstring(pri, "SOL_ROUTE");
1829 1834          } else {
1830 1835                  const struct protoent *p;
1831 1836                  struct protoent res;
1832 1837                  char buf[NSS_BUFLEN_PROTOCOLS];
1833 1838  
1834 1839                  if ((p = getprotobynumber_r(val, &res,
1835 1840                      (char *)buf, sizeof (buf))) != NULL)
1836 1841                          outstring(pri, p->p_name);
1837 1842                  else
1838 1843                          prt_dec(pri, 0, val);
1839 1844          }
1840 1845  }
1841 1846  
1842 1847  
1843 1848  const char *
1844 1849  sol_optname(private_t *pri, long val)
1845 1850  {
1846 1851  #define CBSIZE  sizeof (pri->code_buf)
1847 1852          if (val >= SO_SNDBUF) {
1848 1853                  switch (val) {
1849 1854                  case SO_SNDBUF:         return ("SO_SNDBUF");
1850 1855                  case SO_RCVBUF:         return ("SO_RCVBUF");
1851 1856                  case SO_SNDLOWAT:       return ("SO_SNDLOWAT");
1852 1857                  case SO_RCVLOWAT:       return ("SO_RCVLOWAT");
1853 1858                  case SO_SNDTIMEO:       return ("SO_SNDTIMEO");
1854 1859                  case SO_RCVTIMEO:       return ("SO_RCVTIMEO");
1855 1860                  case SO_ERROR:          return ("SO_ERROR");
1856 1861                  case SO_TYPE:           return ("SO_TYPE");
1857 1862                  case SO_PROTOTYPE:      return ("SO_PROTOTYPE");
1858 1863                  case SO_ANON_MLP:       return ("SO_ANON_MLP");
1859 1864                  case SO_MAC_EXEMPT:     return ("SO_MAC_EXEMPT");
1860 1865                  case SO_ALLZONES:       return ("SO_ALLZONES");
1861 1866                  case SO_MAC_IMPLICIT:   return ("SO_MAC_IMPLICIT");
1862 1867                  case SO_VRRP:           return ("SO_VRRP");
1863 1868                  case SO_EXCLBIND:       return ("SO_EXCLBIND");
1864 1869                  case SO_DOMAIN:         return ("SO_DOMAIN");
1865 1870  
1866 1871                  default:                (void) snprintf(pri->code_buf, CBSIZE,
1867 1872                                              "0x%lx", val);
1868 1873                                          return (pri->code_buf);
1869 1874                  }
1870 1875          } else {
1871 1876                  char *s = pri->code_buf;
1872 1877                  size_t used = 1;
1873 1878                  long val2;
1874 1879  
1875 1880                  *s = '\0';
1876 1881                  val2 = val & ~(SO_DEBUG|SO_ACCEPTCONN|SO_REUSEADDR|SO_KEEPALIVE|
1877 1882                      SO_DONTROUTE|SO_BROADCAST|SO_USELOOPBACK|SO_LINGER|
1878 1883                      SO_OOBINLINE|SO_DGRAM_ERRIND|SO_RECVUCRED);
1879 1884                  if (val2)
1880 1885                          used = snprintf(s, CBSIZE, "|0x%lx", val2);
1881 1886                  if (val & SO_DEBUG)
1882 1887                          used = strlcat(s, "|SO_DEBUG", CBSIZE);
1883 1888                  if (val & SO_ACCEPTCONN)
1884 1889                          used = strlcat(s, "|SO_ACCEPTCONN", CBSIZE);
1885 1890                  if (val & SO_REUSEADDR)
1886 1891                          used = strlcat(s, "|SO_REUSEADDR", CBSIZE);
1887 1892                  if (val & SO_KEEPALIVE)
1888 1893                          used = strlcat(s, "|SO_KEEPALIVE", CBSIZE);
1889 1894                  if (val & SO_DONTROUTE)
1890 1895                          used = strlcat(s, "|SO_DONTROUTE", CBSIZE);
1891 1896                  if (val & SO_BROADCAST)
1892 1897                          used = strlcat(s, "|SO_BROADCAST", CBSIZE);
1893 1898                  if (val & SO_USELOOPBACK)
1894 1899                          used = strlcat(s, "|SO_USELOOPBACK", CBSIZE);
1895 1900                  if (val & SO_LINGER)
1896 1901                          used = strlcat(s, "|SO_LINGER", CBSIZE);
1897 1902                  if (val & SO_OOBINLINE)
1898 1903                          used = strlcat(s, "|SO_OOBINLINE", CBSIZE);
1899 1904                  if (val & SO_DGRAM_ERRIND)
1900 1905                          used = strlcat(s, "|SO_DGRAM_ERRIND", CBSIZE);
1901 1906                  if (val & SO_RECVUCRED)
1902 1907                          used = strlcat(s, "|SO_RECVUCRED", CBSIZE);
1903 1908                  if (used >= CBSIZE || val == 0)
1904 1909                          (void) snprintf(s + 1, CBSIZE-1, "0x%lx", val);
1905 1910                  return ((const char *)(s + 1));
1906 1911          }
1907 1912  #undef CBSIZE
1908 1913  }
1909 1914  
1910 1915  const char *
1911 1916  route_optname(private_t *pri, long val)
1912 1917  {
1913 1918          switch (val) {
1914 1919          case RT_AWARE:
1915 1920                  return ("RT_AWARE");
1916 1921          default:
1917 1922                  (void) snprintf(pri->code_buf, sizeof (pri->code_buf),
1918 1923                      "0x%lx", val);
1919 1924                  return (pri->code_buf);
1920 1925          }
1921 1926  }
1922 1927  
1923 1928  const char *
1924 1929  tcp_optname(private_t *pri, long val)
1925 1930  {
1926 1931          switch (val) {
1927 1932          case TCP_NODELAY:               return ("TCP_NODELAY");
1928 1933          case TCP_MAXSEG:                return ("TCP_MAXSEG");
1929 1934          case TCP_KEEPALIVE:             return ("TCP_KEEPALIVE");
1930 1935          case TCP_NOTIFY_THRESHOLD:      return ("TCP_NOTIFY_THRESHOLD");
1931 1936          case TCP_ABORT_THRESHOLD:       return ("TCP_ABORT_THRESHOLD");
1932 1937          case TCP_CONN_NOTIFY_THRESHOLD: return ("TCP_CONN_NOTIFY_THRESHOLD");
1933 1938          case TCP_CONN_ABORT_THRESHOLD:  return ("TCP_CONN_ABORT_THRESHOLD");
1934 1939          case TCP_RECVDSTADDR:           return ("TCP_RECVDSTADDR");
1935 1940          case TCP_ANONPRIVBIND:          return ("TCP_ANONPRIVBIND");
1936 1941          case TCP_EXCLBIND:              return ("TCP_EXCLBIND");
1937 1942          case TCP_INIT_CWND:             return ("TCP_INIT_CWND");
1938 1943          case TCP_KEEPALIVE_THRESHOLD:   return ("TCP_KEEPALIVE_THRESHOLD");
1939 1944          case TCP_KEEPALIVE_ABORT_THRESHOLD:
1940 1945                  return ("TCP_KEEPALIVE_ABORT_THRESHOLD");
1941 1946          case TCP_CORK:                  return ("TCP_CORK");
1942 1947          case TCP_RTO_INITIAL:           return ("TCP_RTO_INITIAL");
1943 1948          case TCP_RTO_MIN:               return ("TCP_RTO_MIN");
1944 1949          case TCP_RTO_MAX:               return ("TCP_RTO_MAX");
1945 1950          case TCP_LINGER2:               return ("TCP_LINGER2");
1946 1951          case TCP_KEEPIDLE:              return ("TCP_KEEPIDLE");
1947 1952          case TCP_KEEPCNT:               return ("TCP_KEEPCNT");
1948 1953          case TCP_KEEPINTVL:             return ("TCP_KEEPINTVL");
1949 1954  
1950 1955          default:                        (void) snprintf(pri->code_buf,
1951 1956                                              sizeof (pri->code_buf),
1952 1957                                              "0x%lx", val);
1953 1958                                          return (pri->code_buf);
1954 1959          }
1955 1960  }
1956 1961  
1957 1962  
1958 1963  const char *
1959 1964  sctp_optname(private_t *pri, long val)
1960 1965  {
1961 1966          switch (val) {
1962 1967          case SCTP_RTOINFO:              return ("SCTP_RTOINFO");
1963 1968          case SCTP_ASSOCINFO:            return ("SCTP_ASSOCINFO");
1964 1969          case SCTP_INITMSG:              return ("SCTP_INITMSG");
1965 1970          case SCTP_NODELAY:              return ("SCTP_NODELAY");
1966 1971          case SCTP_AUTOCLOSE:            return ("SCTP_AUTOCLOSE");
1967 1972          case SCTP_SET_PEER_PRIMARY_ADDR:
1968 1973                  return ("SCTP_SET_PEER_PRIMARY_ADDR");
1969 1974          case SCTP_PRIMARY_ADDR:         return ("SCTP_PRIMARY_ADDR");
1970 1975          case SCTP_ADAPTATION_LAYER:     return ("SCTP_ADAPTATION_LAYER");
1971 1976          case SCTP_DISABLE_FRAGMENTS:    return ("SCTP_DISABLE_FRAGMENTS");
1972 1977          case SCTP_PEER_ADDR_PARAMS:     return ("SCTP_PEER_ADDR_PARAMS");
1973 1978          case SCTP_DEFAULT_SEND_PARAM:   return ("SCTP_DEFAULT_SEND_PARAM");
1974 1979          case SCTP_EVENTS:               return ("SCTP_EVENTS");
1975 1980          case SCTP_I_WANT_MAPPED_V4_ADDR:
1976 1981                  return ("SCTP_I_WANT_MAPPED_V4_ADDR");
1977 1982          case SCTP_MAXSEG:               return ("SCTP_MAXSEG");
1978 1983          case SCTP_STATUS:               return ("SCTP_STATUS");
1979 1984          case SCTP_GET_PEER_ADDR_INFO:   return ("SCTP_GET_PEER_ADDR_INFO");
1980 1985  
1981 1986          case SCTP_ADD_ADDR:             return ("SCTP_ADD_ADDR");
1982 1987          case SCTP_REM_ADDR:             return ("SCTP_REM_ADDR");
1983 1988  
1984 1989          default:                        (void) snprintf(pri->code_buf,
1985 1990                                              sizeof (pri->code_buf),
1986 1991                                              "0x%lx", val);
1987 1992                                          return (pri->code_buf);
1988 1993          }
1989 1994  }
1990 1995  
  
    | 
      ↓ open down ↓ | 
    1096 lines elided | 
    
      ↑ open up ↑ | 
  
1991 1996  
1992 1997  const char *
1993 1998  udp_optname(private_t *pri, long val)
1994 1999  {
1995 2000          switch (val) {
1996 2001          case UDP_CHECKSUM:              return ("UDP_CHECKSUM");
1997 2002          case UDP_ANONPRIVBIND:          return ("UDP_ANONPRIVBIND");
1998 2003          case UDP_EXCLBIND:              return ("UDP_EXCLBIND");
1999 2004          case UDP_RCVHDR:                return ("UDP_RCVHDR");
2000 2005          case UDP_NAT_T_ENDPOINT:        return ("UDP_NAT_T_ENDPOINT");
     2006 +        case UDP_SND_TO_CONNECTED:      return ("UDP_SND_TO_CONNECTED");
2001 2007  
2002 2008          default:                        (void) snprintf(pri->code_buf,
2003 2009                                              sizeof (pri->code_buf), "0x%lx",
2004 2010                                              val);
2005 2011                                          return (pri->code_buf);
2006 2012          }
2007 2013  }
2008 2014  
2009 2015  
2010 2016  /*
2011 2017   * Print setsockopt()/getsockopt() 3rd argument.
2012 2018   */
2013 2019  /*ARGSUSED*/
2014 2020  void
2015 2021  prt_son(private_t *pri, int raw, long val)
2016 2022  {
2017 2023          /* cheating -- look at the level */
2018 2024          switch (pri->sys_args[1]) {
2019 2025          case SOL_SOCKET:        outstring(pri, sol_optname(pri, val));
2020 2026                                  break;
2021 2027          case SOL_ROUTE:         outstring(pri, route_optname(pri, val));
2022 2028                                  break;
2023 2029          case IPPROTO_TCP:       outstring(pri, tcp_optname(pri, val));
2024 2030                                  break;
2025 2031          case IPPROTO_UDP:       outstring(pri, udp_optname(pri, val));
2026 2032                                  break;
2027 2033          case IPPROTO_SCTP:      outstring(pri, sctp_optname(pri, val));
2028 2034                                  break;
2029 2035          default:                prt_dec(pri, 0, val);
2030 2036                                  break;
2031 2037          }
2032 2038  }
2033 2039  
2034 2040  
2035 2041  /*
2036 2042   * Print utrap type
2037 2043   */
2038 2044  /*ARGSUSED*/
2039 2045  void
2040 2046  prt_utt(private_t *pri, int raw, long val)
2041 2047  {
2042 2048          const char *s = NULL;
2043 2049  
2044 2050  #ifdef __sparc
2045 2051          if (!raw) {
2046 2052                  switch (val) {
2047 2053                  case UT_INSTRUCTION_DISABLED:
2048 2054                          s = "UT_INSTRUCTION_DISABLED"; break;
2049 2055                  case UT_INSTRUCTION_ERROR:
2050 2056                          s = "UT_INSTRUCTION_ERROR"; break;
2051 2057                  case UT_INSTRUCTION_PROTECTION:
2052 2058                          s = "UT_INSTRUCTION_PROTECTION"; break;
2053 2059                  case UT_ILLTRAP_INSTRUCTION:
2054 2060                          s = "UT_ILLTRAP_INSTRUCTION"; break;
2055 2061                  case UT_ILLEGAL_INSTRUCTION:
2056 2062                          s = "UT_ILLEGAL_INSTRUCTION"; break;
2057 2063                  case UT_PRIVILEGED_OPCODE:
2058 2064                          s = "UT_PRIVILEGED_OPCODE"; break;
2059 2065                  case UT_FP_DISABLED:
2060 2066                          s = "UT_FP_DISABLED"; break;
2061 2067                  case UT_FP_EXCEPTION_IEEE_754:
2062 2068                          s = "UT_FP_EXCEPTION_IEEE_754"; break;
2063 2069                  case UT_FP_EXCEPTION_OTHER:
2064 2070                          s = "UT_FP_EXCEPTION_OTHER"; break;
2065 2071                  case UT_TAG_OVERFLOW:
2066 2072                          s = "UT_TAG_OVERFLOW"; break;
2067 2073                  case UT_DIVISION_BY_ZERO:
2068 2074                          s = "UT_DIVISION_BY_ZERO"; break;
2069 2075                  case UT_DATA_EXCEPTION:
2070 2076                          s = "UT_DATA_EXCEPTION"; break;
2071 2077                  case UT_DATA_ERROR:
2072 2078                          s = "UT_DATA_ERROR"; break;
2073 2079                  case UT_DATA_PROTECTION:
2074 2080                          s = "UT_DATA_PROTECTION"; break;
2075 2081                  case UT_MEM_ADDRESS_NOT_ALIGNED:
2076 2082                          s = "UT_MEM_ADDRESS_NOT_ALIGNED"; break;
2077 2083                  case UT_PRIVILEGED_ACTION:
2078 2084                          s = "UT_PRIVILEGED_ACTION"; break;
2079 2085                  case UT_ASYNC_DATA_ERROR:
2080 2086                          s = "UT_ASYNC_DATA_ERROR"; break;
2081 2087                  case UT_TRAP_INSTRUCTION_16:
2082 2088                          s = "UT_TRAP_INSTRUCTION_16"; break;
2083 2089                  case UT_TRAP_INSTRUCTION_17:
2084 2090                          s = "UT_TRAP_INSTRUCTION_17"; break;
2085 2091                  case UT_TRAP_INSTRUCTION_18:
2086 2092                          s = "UT_TRAP_INSTRUCTION_18"; break;
2087 2093                  case UT_TRAP_INSTRUCTION_19:
2088 2094                          s = "UT_TRAP_INSTRUCTION_19"; break;
2089 2095                  case UT_TRAP_INSTRUCTION_20:
2090 2096                          s = "UT_TRAP_INSTRUCTION_20"; break;
2091 2097                  case UT_TRAP_INSTRUCTION_21:
2092 2098                          s = "UT_TRAP_INSTRUCTION_21"; break;
2093 2099                  case UT_TRAP_INSTRUCTION_22:
2094 2100                          s = "UT_TRAP_INSTRUCTION_22"; break;
2095 2101                  case UT_TRAP_INSTRUCTION_23:
2096 2102                          s = "UT_TRAP_INSTRUCTION_23"; break;
2097 2103                  case UT_TRAP_INSTRUCTION_24:
2098 2104                          s = "UT_TRAP_INSTRUCTION_24"; break;
2099 2105                  case UT_TRAP_INSTRUCTION_25:
2100 2106                          s = "UT_TRAP_INSTRUCTION_25"; break;
2101 2107                  case UT_TRAP_INSTRUCTION_26:
2102 2108                          s = "UT_TRAP_INSTRUCTION_26"; break;
2103 2109                  case UT_TRAP_INSTRUCTION_27:
2104 2110                          s = "UT_TRAP_INSTRUCTION_27"; break;
2105 2111                  case UT_TRAP_INSTRUCTION_28:
2106 2112                          s = "UT_TRAP_INSTRUCTION_28"; break;
2107 2113                  case UT_TRAP_INSTRUCTION_29:
2108 2114                          s = "UT_TRAP_INSTRUCTION_29"; break;
2109 2115                  case UT_TRAP_INSTRUCTION_30:
2110 2116                          s = "UT_TRAP_INSTRUCTION_30"; break;
2111 2117                  case UT_TRAP_INSTRUCTION_31:
2112 2118                          s = "UT_TRAP_INSTRUCTION_31"; break;
2113 2119                  }
2114 2120          }
2115 2121  #endif /* __sparc */
2116 2122  
2117 2123          if (s == NULL)
2118 2124                  prt_dec(pri, 0, val);
2119 2125          else
2120 2126                  outstring(pri, s);
2121 2127  }
2122 2128  
2123 2129  
2124 2130  /*
2125 2131   * Print utrap handler
2126 2132   */
2127 2133  void
2128 2134  prt_uth(private_t *pri, int raw, long val)
2129 2135  {
2130 2136          const char *s = NULL;
2131 2137  
2132 2138          if (!raw) {
2133 2139                  switch (val) {
2134 2140                  case (long)UTH_NOCHANGE:        s = "UTH_NOCHANGE"; break;
2135 2141                  }
2136 2142          }
2137 2143  
2138 2144          if (s == NULL)
2139 2145                  prt_hex(pri, 0, val);
2140 2146          else
2141 2147                  outstring(pri, s);
2142 2148  }
2143 2149  
2144 2150  const char *
2145 2151  access_flags(private_t *pri, long arg)
2146 2152  {
2147 2153  #define E_OK 010
2148 2154          char *str = pri->code_buf;
2149 2155  
2150 2156          if (arg & ~(R_OK|W_OK|X_OK|E_OK))
2151 2157                  return (NULL);
2152 2158  
2153 2159          /* NB: F_OK == 0 */
2154 2160          if (arg == F_OK)
2155 2161                  return ("F_OK");
2156 2162          if (arg == E_OK)
2157 2163                  return ("F_OK|E_OK");
2158 2164  
2159 2165          *str = '\0';
2160 2166          if (arg & R_OK)
2161 2167                  (void) strlcat(str, "|R_OK", sizeof (pri->code_buf));
2162 2168          if (arg & W_OK)
2163 2169                  (void) strlcat(str, "|W_OK", sizeof (pri->code_buf));
2164 2170          if (arg & X_OK)
2165 2171                  (void) strlcat(str, "|X_OK", sizeof (pri->code_buf));
2166 2172          if (arg & E_OK)
2167 2173                  (void) strlcat(str, "|E_OK", sizeof (pri->code_buf));
2168 2174          return ((const char *)(str + 1));
2169 2175  #undef E_OK
2170 2176  }
2171 2177  
2172 2178  /*
2173 2179   * Print access() flags.
2174 2180   */
2175 2181  void
2176 2182  prt_acc(private_t *pri, int raw, long val)
2177 2183  {
2178 2184          const char *s = raw? NULL : access_flags(pri, val);
2179 2185  
2180 2186          if (s == NULL)
2181 2187                  prt_dex(pri, 0, val);
2182 2188          else
2183 2189                  outstring(pri, s);
2184 2190  }
2185 2191  
2186 2192  /*
2187 2193   * Print shutdown() "how" (2nd) argument
2188 2194   */
2189 2195  void
2190 2196  prt_sht(private_t *pri, int raw, long val)
2191 2197  {
2192 2198          if (raw) {
2193 2199                  prt_dex(pri, 0, val);
2194 2200                  return;
2195 2201          }
2196 2202          switch (val) {
2197 2203          case SHUT_RD:   outstring(pri, "SHUT_RD");      break;
2198 2204          case SHUT_WR:   outstring(pri, "SHUT_WR");      break;
2199 2205          case SHUT_RDWR: outstring(pri, "SHUT_RDWR");    break;
2200 2206          default:        prt_dec(pri, 0, val);           break;
2201 2207          }
2202 2208  }
2203 2209  
2204 2210  /*
2205 2211   * Print fcntl() F_SETFL flags (3rd) argument or fdsync flag (2nd arg)
2206 2212   */
2207 2213  static struct fcntl_flags {
2208 2214          long            val;
2209 2215          const char      *name;
2210 2216  } fcntl_flags[] = {
2211 2217  #define FC_FL(flag)     { (long)flag, "|" # flag }
2212 2218          FC_FL(FREVOKED),
2213 2219          FC_FL(FREAD),
2214 2220          FC_FL(FWRITE),
2215 2221          FC_FL(FNDELAY),
2216 2222          FC_FL(FAPPEND),
2217 2223          FC_FL(FSYNC),
2218 2224          FC_FL(FDSYNC),
2219 2225          FC_FL(FRSYNC),
2220 2226          FC_FL(FOFFMAX),
2221 2227          FC_FL(FNONBLOCK),
2222 2228          FC_FL(FCREAT),
2223 2229          FC_FL(FTRUNC),
2224 2230          FC_FL(FEXCL),
2225 2231          FC_FL(FNOCTTY),
2226 2232          FC_FL(FXATTR),
2227 2233          FC_FL(FASYNC),
2228 2234          FC_FL(FNODSYNC)
2229 2235  #undef FC_FL
2230 2236  };
2231 2237  
2232 2238  void
2233 2239  prt_ffg(private_t *pri, int raw, long val)
2234 2240  {
2235 2241  #define CBSIZE  sizeof (pri->code_buf)
2236 2242          char *s = pri->code_buf;
2237 2243          size_t used = 1;
2238 2244          struct fcntl_flags *fp;
2239 2245  
2240 2246          if (raw) {
2241 2247                  (void) snprintf(s, CBSIZE, "0x%lx", val);
2242 2248                  outstring(pri, s);
2243 2249                  return;
2244 2250          }
2245 2251          if (val == 0) {
2246 2252                  outstring(pri, "(no flags)");
2247 2253                  return;
2248 2254          }
2249 2255  
2250 2256          *s = '\0';
2251 2257          for (fp = fcntl_flags;
2252 2258              fp < &fcntl_flags[sizeof (fcntl_flags) / sizeof (*fp)]; fp++) {
2253 2259                  if (val & fp->val) {
2254 2260                          used = strlcat(s, fp->name, CBSIZE);
2255 2261                          val &= ~fp->val;
2256 2262                  }
2257 2263          }
2258 2264  
2259 2265          if (val != 0 && used <= CBSIZE)
2260 2266                  used += snprintf(s + used, CBSIZE - used, "|0x%lx", val);
2261 2267  
2262 2268          if (used >= CBSIZE)
2263 2269                  (void) snprintf(s + 1, CBSIZE-1, "0x%lx", val);
2264 2270          outstring(pri, s + 1);
2265 2271  #undef CBSIZE
2266 2272  }
2267 2273  
2268 2274  void
2269 2275  prt_prs(private_t *pri, int raw, long val)
2270 2276  {
2271 2277          static size_t setsize;
2272 2278          priv_set_t *set = priv_allocset();
2273 2279  
2274 2280          if (setsize == 0) {
2275 2281                  const priv_impl_info_t *info = getprivimplinfo();
2276 2282                  if (info != NULL)
2277 2283                          setsize = info->priv_setsize * sizeof (priv_chunk_t);
2278 2284          }
2279 2285  
2280 2286          if (setsize != 0 && !raw && set != NULL &&
2281 2287              Pread(Proc, set, setsize, val) == setsize) {
2282 2288                  int i;
2283 2289  
2284 2290                  outstring(pri, "{");
2285 2291                  for (i = 0; i < setsize / sizeof (priv_chunk_t); i++) {
2286 2292                          char buf[9];    /* 8 hex digits + '\0' */
2287 2293                          (void) snprintf(buf, sizeof (buf), "%08x",
2288 2294                              ((priv_chunk_t *)set)[i]);
2289 2295                          outstring(pri, buf);
2290 2296                  }
2291 2297  
2292 2298                  outstring(pri, "}");
2293 2299          } else {
2294 2300                  prt_hex(pri, 0, val);
2295 2301          }
2296 2302  
2297 2303          if (set != NULL)
2298 2304                  priv_freeset(set);
2299 2305  }
2300 2306  
2301 2307  /*
2302 2308   * Print privilege set operation.
2303 2309   */
2304 2310  void
2305 2311  prt_pro(private_t *pri, int raw, long val)
2306 2312  {
2307 2313          const char *s = NULL;
2308 2314  
2309 2315          if (!raw) {
2310 2316                  switch ((priv_op_t)val) {
2311 2317                  case PRIV_ON:           s = "PRIV_ON";          break;
2312 2318                  case PRIV_OFF:          s = "PRIV_OFF";         break;
2313 2319                  case PRIV_SET:          s = "PRIV_SET";         break;
2314 2320                  }
2315 2321          }
2316 2322  
2317 2323          if (s == NULL)
2318 2324                  prt_dec(pri, 0, val);
2319 2325          else
2320 2326                  outstring(pri, s);
2321 2327  }
2322 2328  
2323 2329  /*
2324 2330   * Print privilege set name
2325 2331   */
2326 2332  void
2327 2333  prt_prn(private_t *pri, int raw, long val)
2328 2334  {
2329 2335          const char *s = NULL;
2330 2336  
2331 2337          if (!raw)
2332 2338                  s = priv_getsetbynum((int)val);
2333 2339  
2334 2340          if (s == NULL)
2335 2341                  prt_dec(pri, 0, val);
2336 2342          else {
2337 2343                  char *dup = strdup(s);
2338 2344                  char *q;
2339 2345  
2340 2346                  /* Do the best we can in this case */
2341 2347                  if (dup == NULL) {
2342 2348                          outstring(pri, s);
2343 2349                          return;
2344 2350                  }
2345 2351  
2346 2352                  outstring(pri, "PRIV_");
2347 2353  
2348 2354                  q = dup;
2349 2355  
2350 2356                  while (*q != '\0') {
2351 2357                          *q = toupper(*q);
2352 2358                          q++;
2353 2359                  }
2354 2360                  outstring(pri, dup);
2355 2361                  free(dup);
2356 2362          }
2357 2363  }
2358 2364  
2359 2365  /*
2360 2366   * Print process flag names.
2361 2367   */
2362 2368  void
2363 2369  prt_pfl(private_t *pri, int raw, long val)
2364 2370  {
2365 2371          const char *s = NULL;
2366 2372  
2367 2373          if (!raw) {
2368 2374                  switch ((int)val) {
2369 2375                  case PRIV_DEBUG:        s = "PRIV_DEBUG";       break;
2370 2376                  case PRIV_AWARE:        s = "PRIV_AWARE";       break;
2371 2377                  case PRIV_XPOLICY:      s = "PRIV_XPOLICY";     break;
2372 2378                  case PRIV_AWARE_RESET:  s = "PRIV_AWARE_RESET"; break;
2373 2379                  case PRIV_PFEXEC:       s = "PRIV_PFEXEC";      break;
2374 2380                  case NET_MAC_AWARE:     s =  "NET_MAC_AWARE";   break;
2375 2381                  case NET_MAC_AWARE_INHERIT:
2376 2382                          s = "NET_MAC_AWARE_INHERIT";
2377 2383                          break;
2378 2384                  }
2379 2385          }
2380 2386  
2381 2387          if (s == NULL)
2382 2388                  prt_dec(pri, 0, val);
2383 2389          else
2384 2390                  outstring(pri, s);
2385 2391  }
2386 2392  
2387 2393  /*
2388 2394   * Print lgrp_affinity_{get,set}() arguments.
2389 2395   */
2390 2396  /*ARGSUSED*/
2391 2397  void
2392 2398  prt_laf(private_t *pri, int raw, long val)
2393 2399  {
2394 2400          lgrp_affinity_args_t    laff;
2395 2401  
2396 2402          if (Pread(Proc, &laff, sizeof (lgrp_affinity_args_t), val) !=
2397 2403              sizeof (lgrp_affinity_args_t)) {
2398 2404                  prt_hex(pri, 0, val);
2399 2405                  return;
2400 2406          }
2401 2407          /*
2402 2408           * arrange the arguments in the order that user calls with
2403 2409           */
2404 2410          prt_dec(pri, 0, laff.idtype);
2405 2411          outstring(pri, ", ");
2406 2412          prt_dec(pri, 0, laff.id);
2407 2413          outstring(pri, ", ");
2408 2414          prt_dec(pri, 0, laff.lgrp);
2409 2415          outstring(pri, ", ");
2410 2416          if (pri->sys_args[0] == LGRP_SYS_AFFINITY_SET)
2411 2417                  prt_dec(pri, 0, laff.aff);
2412 2418  }
2413 2419  
2414 2420  /*
2415 2421   * Print a key_t as IPC_PRIVATE if it is 0.
2416 2422   */
2417 2423  void
2418 2424  prt_key(private_t *pri, int raw, long val)
2419 2425  {
2420 2426          if (!raw && val == 0)
2421 2427                  outstring(pri, "IPC_PRIVATE");
2422 2428          else
2423 2429                  prt_dec(pri, 0, val);
2424 2430  }
2425 2431  
2426 2432  
2427 2433  /*
2428 2434   * Print zone_getattr() attribute types.
2429 2435   */
2430 2436  void
2431 2437  prt_zga(private_t *pri, int raw, long val)
2432 2438  {
2433 2439          const char *s = NULL;
2434 2440  
2435 2441          if (!raw) {
2436 2442                  switch ((int)val) {
2437 2443                  case ZONE_ATTR_NAME:    s = "ZONE_ATTR_NAME";   break;
2438 2444                  case ZONE_ATTR_ROOT:    s = "ZONE_ATTR_ROOT";   break;
  
    | 
      ↓ open down ↓ | 
    428 lines elided | 
    
      ↑ open up ↑ | 
  
2439 2445                  case ZONE_ATTR_STATUS:  s = "ZONE_ATTR_STATUS"; break;
2440 2446                  case ZONE_ATTR_PRIVSET: s = "ZONE_ATTR_PRIVSET"; break;
2441 2447                  case ZONE_ATTR_UNIQID:  s = "ZONE_ATTR_UNIQID"; break;
2442 2448                  case ZONE_ATTR_POOLID:  s = "ZONE_ATTR_POOLID"; break;
2443 2449                  case ZONE_ATTR_INITPID: s = "ZONE_ATTR_INITPID"; break;
2444 2450                  case ZONE_ATTR_SLBL:    s = "ZONE_ATTR_SLBL"; break;
2445 2451                  case ZONE_ATTR_INITNAME:        s = "ZONE_ATTR_INITNAME"; break;
2446 2452                  case ZONE_ATTR_BOOTARGS:        s = "ZONE_ATTR_BOOTARGS"; break;
2447 2453                  case ZONE_ATTR_BRAND:   s = "ZONE_ATTR_BRAND"; break;
2448 2454                  case ZONE_ATTR_FLAGS:   s = "ZONE_ATTR_FLAGS"; break;
2449      -                case ZONE_ATTR_PHYS_MCAP: s = "ZONE_ATTR_PHYS_MCAP"; break;
     2455 +                case ZONE_ATTR_DID:     s = "ZONE_ATTR_DID"; break;
     2456 +                case ZONE_ATTR_PMCAP_NOVER: s = "ZONE_ATTR_PMCAP_NOVER"; break;
     2457 +                case ZONE_ATTR_PMCAP_PAGEOUT: s = "ZONE_ATTR_PMCAP_PAGEOUT";
     2458 +                                        break;
2450 2459                  }
2451 2460          }
2452 2461  
2453 2462          if (s == NULL)
2454 2463                  prt_dec(pri, 0, val);
2455 2464          else
2456 2465                  outstring(pri, s);
2457 2466  }
2458 2467  
2459 2468  /*
2460 2469   * Print a file descriptor as AT_FDCWD if necessary
2461 2470   */
2462 2471  void
2463 2472  prt_atc(private_t *pri, int raw, long val)
2464 2473  {
2465 2474          if ((int)val == AT_FDCWD) {
2466 2475                  if (raw)
2467 2476                          prt_hex(pri, 0, (uint_t)AT_FDCWD);
2468 2477                  else
2469 2478                          outstring(pri, "AT_FDCWD");
2470 2479          } else {
2471 2480                  prt_dec(pri, 0, val);
2472 2481          }
2473 2482  }
2474 2483  
2475 2484  /*
2476 2485   * Print Trusted Networking database operation codes (labelsys; tn*)
2477 2486   */
2478 2487  static void
2479 2488  prt_tnd(private_t *pri, int raw, long val)
2480 2489  {
2481 2490          const char *s = NULL;
2482 2491  
2483 2492          if (!raw) {
2484 2493                  switch ((tsol_dbops_t)val) {
2485 2494                  case TNDB_NOOP:         s = "TNDB_NOOP";        break;
2486 2495                  case TNDB_LOAD:         s = "TNDB_LOAD";        break;
2487 2496                  case TNDB_DELETE:       s = "TNDB_DELETE";      break;
2488 2497                  case TNDB_FLUSH:        s = "TNDB_FLUSH";       break;
2489 2498                  case TNDB_GET:          s = "TNDB_GET";         break;
2490 2499                  }
2491 2500          }
2492 2501  
2493 2502          if (s == NULL)
2494 2503                  prt_dec(pri, 0, val);
2495 2504          else
2496 2505                  outstring(pri, s);
2497 2506  }
2498 2507  
2499 2508  /*
2500 2509   * Print LIO_XX flags
2501 2510   */
2502 2511  void
2503 2512  prt_lio(private_t *pri, int raw, long val)
2504 2513  {
2505 2514          if (raw)
2506 2515                  prt_dec(pri, 0, val);
2507 2516          else if (val == LIO_WAIT)
2508 2517                  outstring(pri, "LIO_WAIT");
2509 2518          else if (val == LIO_NOWAIT)
2510 2519                  outstring(pri, "LIO_NOWAIT");
2511 2520          else
2512 2521                  prt_dec(pri, 0, val);
2513 2522  }
2514 2523  
2515 2524  const char *
2516 2525  door_flags(private_t *pri, long val)
2517 2526  {
2518 2527          door_attr_t attr = (door_attr_t)val;
2519 2528          char *str = pri->code_buf;
2520 2529  
2521 2530          *str = '\0';
2522 2531  #define PROCESS_FLAG(flg)                                               \
2523 2532          if (attr & flg) {                                               \
2524 2533                  (void) strlcat(str, "|" #flg, sizeof (pri->code_buf));  \
2525 2534                  attr &= ~flg;                                           \
2526 2535          }
2527 2536  
2528 2537          PROCESS_FLAG(DOOR_UNREF);
2529 2538          PROCESS_FLAG(DOOR_UNREF_MULTI);
2530 2539          PROCESS_FLAG(DOOR_PRIVATE);
2531 2540          PROCESS_FLAG(DOOR_REFUSE_DESC);
2532 2541          PROCESS_FLAG(DOOR_NO_CANCEL);
2533 2542          PROCESS_FLAG(DOOR_LOCAL);
2534 2543          PROCESS_FLAG(DOOR_REVOKED);
2535 2544          PROCESS_FLAG(DOOR_IS_UNREF);
2536 2545  #undef PROCESS_FLAG
2537 2546  
2538 2547          if (attr != 0 || *str == '\0') {
2539 2548                  size_t len = strlen(str);
2540 2549                  (void) snprintf(str + len, sizeof (pri->code_buf) - len,
2541 2550                      "|0x%X", attr);
2542 2551          }
2543 2552  
2544 2553          return (str + 1);
2545 2554  }
2546 2555  
2547 2556  /*
2548 2557   * Print door_create() flags
2549 2558   */
2550 2559  void
2551 2560  prt_dfl(private_t *pri, int raw, long val)
2552 2561  {
2553 2562          if (raw)
2554 2563                  prt_hex(pri, 0, val);
2555 2564          else
2556 2565                  outstring(pri, door_flags(pri, val));
2557 2566  }
2558 2567  
2559 2568  /*
2560 2569   * Print door_*param() param argument
2561 2570   */
2562 2571  void
2563 2572  prt_dpm(private_t *pri, int raw, long val)
2564 2573  {
2565 2574          if (raw)
2566 2575                  prt_hex(pri, 0, val);
2567 2576          else if (val == DOOR_PARAM_DESC_MAX)
2568 2577                  outstring(pri, "DOOR_PARAM_DESC_MAX");
2569 2578          else if (val == DOOR_PARAM_DATA_MIN)
2570 2579                  outstring(pri, "DOOR_PARAM_DATA_MIN");
2571 2580          else if (val == DOOR_PARAM_DATA_MAX)
2572 2581                  outstring(pri, "DOOR_PARAM_DATA_MAX");
2573 2582          else
2574 2583                  prt_hex(pri, 0, val);
2575 2584  }
2576 2585  
2577 2586  /*
2578 2587   * Print rctlsys subcodes
2579 2588   */
2580 2589  void
2581 2590  prt_rsc(private_t *pri, int raw, long val)      /* print utssys code */
2582 2591  {
2583 2592          const char *s = raw? NULL : rctlsyscode(val);
2584 2593  
2585 2594          if (s == NULL)
2586 2595                  prt_dec(pri, 0, val);
2587 2596          else
2588 2597                  outstring(pri, s);
2589 2598  }
2590 2599  
2591 2600  /*
2592 2601   * Print getrctl flags
2593 2602   */
2594 2603  void
2595 2604  prt_rgf(private_t *pri, int raw, long val)
2596 2605  {
2597 2606          long action = val & (~RCTLSYS_ACTION_MASK);
2598 2607  
2599 2608          if (raw)
2600 2609                  prt_hex(pri, 0, val);
2601 2610          else if (action == RCTL_FIRST)
2602 2611                  outstring(pri, "RCTL_FIRST");
2603 2612          else if (action == RCTL_NEXT)
2604 2613                  outstring(pri, "RCTL_NEXT");
2605 2614          else if (action == RCTL_USAGE)
2606 2615                  outstring(pri, "RCTL_USAGE");
2607 2616          else
2608 2617                  prt_hex(pri, 0, val);
2609 2618  }
2610 2619  
2611 2620  /*
2612 2621   * Print setrctl flags
2613 2622   */
2614 2623  void
2615 2624  prt_rsf(private_t *pri, int raw, long val)
2616 2625  {
2617 2626          long action = val & (~RCTLSYS_ACTION_MASK);
2618 2627          long pval = val & RCTL_LOCAL_ACTION_MASK;
2619 2628          char *s = pri->code_buf;
2620 2629  
2621 2630          if (raw) {
2622 2631                  prt_hex(pri, 0, val);
2623 2632                  return;
2624 2633          } else if (action == RCTL_INSERT)
2625 2634                  (void) strcpy(s, "RCTL_INSERT");
2626 2635          else if (action == RCTL_DELETE)
2627 2636                  (void) strcpy(s, "RCTL_DELETE");
2628 2637          else if (action == RCTL_REPLACE)
2629 2638                  (void) strcpy(s, "RCTL_REPLACE");
2630 2639          else {
2631 2640                  prt_hex(pri, 0, val);
2632 2641                  return;
2633 2642          }
2634 2643  
2635 2644          if (pval & RCTL_USE_RECIPIENT_PID) {
2636 2645                  pval ^= RCTL_USE_RECIPIENT_PID;
2637 2646                  (void) strlcat(s, "|RCTL_USE_RECIPIENT_PID",
2638 2647                      sizeof (pri->code_buf));
2639 2648          }
2640 2649  
2641 2650          if ((pval & RCTLSYS_ACTION_MASK) != 0)
2642 2651                  prt_hex(pri, 0, val);
2643 2652          else if (*s != '\0')
2644 2653                  outstring(pri, s);
2645 2654          else
2646 2655                  prt_hex(pri, 0, val);
2647 2656  }
2648 2657  
2649 2658  /*
2650 2659   * Print rctlctl flags
2651 2660   */
2652 2661  void
2653 2662  prt_rcf(private_t *pri, int raw, long val)
2654 2663  {
2655 2664          long action = val & (~RCTLSYS_ACTION_MASK);
2656 2665  
2657 2666          if (raw)
2658 2667                  prt_hex(pri, 0, val);
2659 2668          else if (action == RCTLCTL_GET)
2660 2669                  outstring(pri, "RCTLCTL_GET");
2661 2670          else if (action == RCTLCTL_SET)
2662 2671                  outstring(pri, "RCTLCTL_SET");
2663 2672          else
2664 2673                  prt_hex(pri, 0, val);
2665 2674  }
2666 2675  
2667 2676  /*
2668 2677   * Print setprojrctl flags
2669 2678   */
2670 2679  void
2671 2680  prt_spf(private_t *pri, int raw, long val)
2672 2681  {
2673 2682          long action = val & TASK_PROJ_MASK;
2674 2683  
2675 2684          if (!raw && (action == TASK_PROJ_PURGE))
2676 2685                  outstring(pri, "TASK_PROJ_PURGE");
2677 2686          else
2678 2687                  prt_hex(pri, 0, val);
2679 2688  }
2680 2689  
2681 2690  /*
2682 2691   * Print forkx() flags
2683 2692   */
2684 2693  void
2685 2694  prt_fxf(private_t *pri, int raw, long val)
2686 2695  {
2687 2696          char *str;
2688 2697  
2689 2698          if (val == 0)
2690 2699                  outstring(pri, "0");
2691 2700          else if (raw || (val & ~(FORK_NOSIGCHLD | FORK_WAITPID)))
2692 2701                  prt_hhx(pri, 0, val);
2693 2702          else {
2694 2703                  str = pri->code_buf;
2695 2704                  *str = '\0';
2696 2705                  if (val & FORK_NOSIGCHLD)
2697 2706                          (void) strlcat(str, "|FORK_NOSIGCHLD",
2698 2707                              sizeof (pri->code_buf));
2699 2708                  if (val & FORK_WAITPID)
2700 2709                          (void) strlcat(str, "|FORK_WAITPID",
2701 2710                              sizeof (pri->code_buf));
2702 2711                  outstring(pri, str + 1);
2703 2712          }
2704 2713  }
2705 2714  
2706 2715  /*
2707 2716   * Print faccessat() flag
2708 2717   */
2709 2718  void
2710 2719  prt_fat(private_t *pri, int raw, long val)
2711 2720  {
2712 2721          if (val == 0)
2713 2722                  outstring(pri, "0");
2714 2723          else if (!raw && val == AT_EACCESS)
2715 2724                  outstring(pri, "AT_EACCESS");
2716 2725          else
2717 2726                  prt_hex(pri, 0, val);
2718 2727  }
2719 2728  
2720 2729  /*
2721 2730   * Print unlinkat() flag
2722 2731   */
2723 2732  void
2724 2733  prt_uat(private_t *pri, int raw, long val)
2725 2734  {
2726 2735          if (val == 0)
2727 2736                  outstring(pri, "0");
2728 2737          else if (!raw && val == AT_REMOVEDIR)
2729 2738                  outstring(pri, "AT_REMOVEDIR");
2730 2739          else
2731 2740                  prt_hex(pri, 0, val);
2732 2741  }
2733 2742  
2734 2743  /*
2735 2744   * Print AT_SYMLINK_NOFOLLOW / AT_SYMLINK_FOLLOW flag
2736 2745   */
2737 2746  void
2738 2747  prt_snf(private_t *pri, int raw, long val)
2739 2748  {
2740 2749          if (val == 0)
2741 2750                  outstring(pri, "0");
2742 2751          else if (!raw && val == AT_SYMLINK_NOFOLLOW)
2743 2752                  outstring(pri, "AT_SYMLINK_NOFOLLOW");
2744 2753          else if (!raw && val == AT_SYMLINK_FOLLOW)
2745 2754                  outstring(pri, "AT_SYMLINK_FOLLOW");
2746 2755          else
2747 2756                  prt_hex(pri, 0, val);
2748 2757  }
2749 2758  
2750 2759  void
2751 2760  prt_grf(private_t *pri, int raw, long val)
2752 2761  {
2753 2762          int first = 1;
2754 2763  
2755 2764          if (raw != 0 || val == 0 ||
2756 2765              (val & ~(GRND_NONBLOCK | GRND_RANDOM)) != 0) {
2757 2766                  outstring(pri, "0");
2758 2767                  return;
2759 2768          }
2760 2769  
2761 2770          if (val & GRND_NONBLOCK) {
2762 2771                  outstring(pri, "|GRND_NONBLOCK" + first);
2763 2772                  first = 0;
2764 2773          }
2765 2774          if (val & GRND_RANDOM) {
2766 2775                  outstring(pri, "|GRND_RANDOM" + first);
2767 2776                  first = 0;
2768 2777          }
2769 2778  }
2770 2779  
2771 2780  /*
2772 2781   * Array of pointers to print functions, one for each format.
2773 2782   */
2774 2783  void (* const Print[])() = {
2775 2784          prt_nov,        /* NOV -- no value */
2776 2785          prt_dec,        /* DEC -- print value in decimal */
2777 2786          prt_oct,        /* OCT -- print value in octal */
2778 2787          prt_hex,        /* HEX -- print value in hexadecimal */
2779 2788          prt_dex,        /* DEX -- print value in hexadecimal if big enough */
2780 2789          prt_stg,        /* STG -- print value as string */
2781 2790          prt_ioc,        /* IOC -- print ioctl code */
2782 2791          prt_fcn,        /* FCN -- print fcntl code */
2783 2792          prt_s86,        /* S86 -- print sysi86 code */
2784 2793          prt_uts,        /* UTS -- print utssys code */
2785 2794          prt_opn,        /* OPN -- print open code */
2786 2795          prt_sig,        /* SIG -- print signal name plus flags */
2787 2796          prt_uat,        /* UAT -- print unlinkat() flag */
2788 2797          prt_msc,        /* MSC -- print msgsys command */
2789 2798          prt_msf,        /* MSF -- print msgsys flags */
2790 2799          prt_smc,        /* SMC -- print semsys command */
2791 2800          prt_sef,        /* SEF -- print semsys flags */
2792 2801          prt_shc,        /* SHC -- print shmsys command */
2793 2802          prt_shf,        /* SHF -- print shmsys flags */
2794 2803          prt_fat,        /* FAT -- print faccessat( flag */
2795 2804          prt_sfs,        /* SFS -- print sysfs code */
2796 2805          prt_rst,        /* RST -- print string returned by syscall */
2797 2806          prt_smf,        /* SMF -- print streams message flags */
2798 2807          prt_ioa,        /* IOA -- print ioctl argument */
2799 2808          prt_pip,        /* PIP -- print pipe flags */
2800 2809          prt_mtf,        /* MTF -- print mount flags */
2801 2810          prt_mft,        /* MFT -- print mount file system type */
2802 2811          prt_iob,        /* IOB -- print contents of I/O buffer */
2803 2812          prt_hhx,        /* HHX -- print value in hexadecimal (half size) */
2804 2813          prt_wop,        /* WOP -- print waitsys() options */
2805 2814          prt_spm,        /* SPM -- print sigprocmask argument */
2806 2815          prt_rlk,        /* RLK -- print readlink buffer */
2807 2816          prt_mpr,        /* MPR -- print mmap()/mprotect() flags */
2808 2817          prt_mty,        /* MTY -- print mmap() mapping type flags */
2809 2818          prt_mcf,        /* MCF -- print memcntl() function */
2810 2819          prt_mc4,        /* MC4 -- print memcntl() (fourth) argument */
2811 2820          prt_mc5,        /* MC5 -- print memcntl() (fifth) argument */
2812 2821          prt_mad,        /* MAD -- print madvise() argument */
2813 2822          prt_ulm,        /* ULM -- print ulimit() argument */
2814 2823          prt_rlm,        /* RLM -- print get/setrlimit() argument */
2815 2824          prt_cnf,        /* CNF -- print sysconfig() argument */
2816 2825          prt_inf,        /* INF -- print sysinfo() argument */
2817 2826          prt_ptc,        /* PTC -- print pathconf/fpathconf() argument */
2818 2827          prt_fui,        /* FUI -- print fusers() input argument */
2819 2828          prt_idt,        /* IDT -- print idtype_t, waitid() argument */
2820 2829          prt_lwf,        /* LWF -- print lwp_create() flags */
2821 2830          prt_itm,        /* ITM -- print [get|set]itimer() arg */
2822 2831          prt_llo,        /* LLO -- print long long offset arg */
2823 2832          prt_mod,        /* MOD -- print modctl() subcode */
2824 2833          prt_whn,        /* WHN -- print lseek() whence arguiment */
2825 2834          prt_acl,        /* ACL -- print acl() code */
2826 2835          prt_aio,        /* AIO -- print kaio() code */
2827 2836          prt_aud,        /* AUD -- print auditsys() code */
2828 2837          prt_uns,        /* DEC -- print value in unsigned decimal */
2829 2838          prt_clc,        /* CLC -- print cladm command argument */
2830 2839          prt_clf,        /* CLF -- print cladm flag argument */
2831 2840          prt_cor,        /* COR -- print corectl() subcode */
2832 2841          prt_cco,        /* CCO -- print corectl() options */
2833 2842          prt_ccc,        /* CCC -- print corectl() content */
2834 2843          prt_rcc,        /* RCC -- print corectl() returned content */
2835 2844          prt_cpc,        /* CPC -- print cpc() subcode */
2836 2845          prt_sqc,        /* SQC -- print sigqueue() si_code argument */
2837 2846          prt_pc4,        /* PC4 -- print priocntlsys() (fourth) argument */
2838 2847          prt_pc5,        /* PC5 -- print priocntlsys() (key, value) pairs */
2839 2848          prt_pst,        /* PST -- print processor set id */
2840 2849          prt_mif,        /* MIF -- print meminfo() arguments */
2841 2850          prt_pfm,        /* PFM -- print so_socket() proto-family (1st) arg */
2842 2851          prt_skt,        /* SKT -- print so_socket() socket-type (2nd) arg */
2843 2852          prt_skp,        /* SKP -- print so_socket() protocol (3rd) arg */
2844 2853          prt_skv,        /* SKV -- print socket version arg */
2845 2854          prt_sol,        /* SOL -- print [sg]etsockopt() level (2nd) arg */
2846 2855          prt_son,        /* SON -- print [sg]etsockopt() opt-name (3rd) arg */
2847 2856          prt_utt,        /* UTT -- print utrap type */
2848 2857          prt_uth,        /* UTH -- print utrap handler */
2849 2858          prt_acc,        /* ACC -- print access() flags */
2850 2859          prt_sht,        /* SHT -- print shutdown() how (2nd) argument */
2851 2860          prt_ffg,        /* FFG -- print fcntl() flags (3rd) argument */
2852 2861          prt_prs,        /* PRS -- print privilege set */
2853 2862          prt_pro,        /* PRO -- print privilege set operation */
2854 2863          prt_prn,        /* PRN -- print privilege set name */
2855 2864          prt_pfl,        /* PFL -- print privilege/process flag name */
2856 2865          prt_laf,        /* LAF -- print lgrp_affinity arguments */
2857 2866          prt_key,        /* KEY -- print key_t 0 as IPC_PRIVATE */
2858 2867          prt_zga,        /* ZGA -- print zone_getattr attribute types */
2859 2868          prt_atc,        /* ATC -- print AT_FDCWD or file descriptor */
2860 2869          prt_lio,        /* LIO -- print LIO_XX flags */
2861 2870          prt_dfl,        /* DFL -- print door_create() flags */
2862 2871          prt_dpm,        /* DPM -- print DOOR_PARAM_XX flags */
2863 2872          prt_tnd,        /* TND -- print trusted network data base opcode */
2864 2873          prt_rsc,        /* RSC -- print rctlsys() subcodes */
2865 2874          prt_rgf,        /* RGF -- print getrctl() flags */
2866 2875          prt_rsf,        /* RSF -- print setrctl() flags */
2867 2876          prt_rcf,        /* RCF -- print rctlsys_ctl() flags */
2868 2877          prt_fxf,        /* FXF -- print forkx() flags */
2869 2878          prt_spf,        /* SPF -- print rctlsys_projset() flags */
2870 2879          prt_un1,        /* UN1 -- as prt_uns except for -1 */
2871 2880          prt_mob,        /* MOB -- print mmapobj() flags */
2872 2881          prt_snf,        /* SNF -- print AT_SYMLINK_[NO]FOLLOW flag */
2873 2882          prt_skc,        /* SKC -- print sockconfig() subcode */
2874 2883          prt_acf,        /* ACF -- print accept4 flags */
2875 2884          prt_pfd,        /* PFD -- print pipe fds */
2876 2885          prt_grf,        /* GRF -- print getrandom flags */
2877 2886          prt_dec,        /* HID -- hidden argument, make this the last one */
2878 2887  };
  
    | 
      ↓ open down ↓ | 
    419 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX