Print this page
OS-3280 need a way to specify the root of a native system in the lx brand
OS-3279 lx brand should allow delegated datasets
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/ptools/pwait/pwait.c
          +++ new/usr/src/cmd/ptools/pwait/pwait.c
↓ open down ↓ 15 lines elided ↑ open up ↑
  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   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  23   23   * Use is subject to license terms.
  24   24   */
  25   25  
  26      -#pragma ident   "%Z%%M% %I%     %E% SMI"
  27      -
  28   26  #include <stdio.h>
  29   27  #include <stdio_ext.h>
  30   28  #include <ctype.h>
  31   29  #include <stdlib.h>
  32   30  #include <unistd.h>
  33   31  #include <fcntl.h>
  34   32  #include <string.h>
  35   33  #include <dirent.h>
  36   34  #include <errno.h>
  37   35  #include <sys/types.h>
  38   36  #include <stropts.h>
  39   37  #include <poll.h>
  40   38  #include <procfs.h>
  41   39  #include <sys/resource.h>
       40 +#include <limits.h>
       41 +#include "ptools_common.h"
  42   42  
  43   43  static int count_my_files();
  44   44  static char *command;
  45   45  
  46   46  /* slop to account for extra file descriptors opened by libraries we call */
  47   47  #define SLOP    5
  48   48  
  49   49  int
  50   50  main(int argc, char **argv)
  51   51  {
       52 +        char buf[PATH_MAX];
  52   53          unsigned long remain = 0;
  53   54          struct pollfd *pollfd;
  54   55          struct pollfd *pfd;
  55   56          struct rlimit rlim;
  56   57          char *arg;
  57   58          unsigned i;
  58   59          int verbose = 0;
  59   60  
  60   61          if ((command = strrchr(argv[0], '/')) != NULL)
  61   62                  command++;
↓ open down ↓ 6 lines elided ↑ open up ↑
  68   69          if (argc > 0 && strcmp(argv[0], "-v") == 0) {
  69   70                  verbose = 1;
  70   71                  argc--;
  71   72                  argv++;
  72   73          }
  73   74  
  74   75          if (argc <= 0) {
  75   76                  (void) fprintf(stderr, "usage:\t%s [-v] pid ...\n", command);
  76   77                  (void) fprintf(stderr, "  (wait for processes to terminate)\n");
  77   78                  (void) fprintf(stderr,
  78      -                        "  -v: verbose; report terminations to standard out\n");
       79 +                    "  -v: verbose; report terminations to standard out\n");
  79   80                  return (2);
  80   81          }
  81   82  
       83 +        (void) proc_snprintf(buf, sizeof (buf), "/proc/");
       84 +
  82   85          /* make sure we have enough file descriptors */
  83   86          if (getrlimit(RLIMIT_NOFILE, &rlim) == 0) {
  84   87                  int nfiles = count_my_files();
  85   88  
  86   89                  if (rlim.rlim_cur < argc + nfiles + SLOP) {
  87   90                          rlim.rlim_cur = argc + nfiles + SLOP;
  88   91                          if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) {
  89   92                                  (void) fprintf(stderr,
  90      -                                        "%s: insufficient file descriptors\n",
  91      -                                        command);
       93 +                                    "%s: insufficient file descriptors\n",
       94 +                                    command);
  92   95                                  return (2);
  93   96                          }
  94   97                  }
  95   98                  (void) enable_extended_FILE_stdio(-1, -1);
  96   99          }
  97  100  
  98  101          pollfd = (struct pollfd *)malloc(argc*sizeof (struct pollfd));
  99  102          if (pollfd == NULL) {
 100  103                  perror("malloc");
 101  104                  return (2);
 102  105          }
 103  106  
 104  107          for (i = 0; i < argc; i++) {
 105  108                  char psinfofile[100];
 106  109  
 107  110                  arg = argv[i];
 108  111                  if (strchr(arg, '/') != NULL)
 109  112                          (void) strncpy(psinfofile, arg, sizeof (psinfofile));
 110  113                  else {
 111      -                        (void) strcpy(psinfofile, "/proc/");
      114 +                        (void) strcpy(psinfofile, buf);
 112  115                          (void) strncat(psinfofile, arg, sizeof (psinfofile)-6);
 113  116                  }
 114  117                  (void) strncat(psinfofile, "/psinfo",
 115      -                        sizeof (psinfofile)-strlen(psinfofile));
      118 +                    sizeof (psinfofile)-strlen(psinfofile));
 116  119  
 117  120                  pfd = &pollfd[i];
 118  121                  if ((pfd->fd = open(psinfofile, O_RDONLY)) >= 0) {
 119  122                          remain++;
 120  123                          /*
 121  124                           * We set POLLPRI to detect system processes.
 122  125                           * We will get POLLNVAL below for a POLLPRI
 123  126                           * requested event on a system process.
 124  127                           */
 125  128                          pfd->events = POLLPRI;
 126  129                          pfd->revents = 0;
 127  130                  } else if (errno == ENOENT) {
 128  131                          (void) fprintf(stderr, "%s: no such process: %s\n",
 129      -                                command, arg);
      132 +                            command, arg);
 130  133                  } else {
 131  134                          perror(arg);
 132  135                  }
 133  136          }
 134  137  
 135  138          while (remain != 0) {
 136  139                  while (poll(pollfd, argc, INFTIM) < 0) {
 137  140                          if (errno != EAGAIN) {
 138  141                                  perror("poll");
 139  142                                  return (2);
↓ open down ↓ 13 lines elided ↑ open up ↑
 153  156                          }
 154  157  
 155  158                          if (verbose) {
 156  159                                  arg = argv[i];
 157  160                                  if (pfd->revents & POLLHUP) {
 158  161                                          psinfo_t psinfo;
 159  162  
 160  163                                          if (pread(pfd->fd, &psinfo,
 161  164                                              sizeof (psinfo), (off_t)0)
 162  165                                              == sizeof (psinfo)) {
 163      -                                                (void) printf(
 164      -                                        "%s: terminated, wait status 0x%.4x\n",
 165      -                                                        arg, psinfo.pr_wstat);
      166 +                                                (void) printf("%s: terminated, "
      167 +                                                    "wait status 0x%.4x\n",
      168 +                                                    arg, psinfo.pr_wstat);
 166  169                                          } else {
 167  170                                                  (void) printf(
 168  171                                                      "%s: terminated\n", arg);
 169  172                                          }
 170  173                                  }
 171  174                                  if (pfd->revents & POLLNVAL)
 172  175                                          (void) printf("%s: system process\n",
 173      -                                                arg);
      176 +                                            arg);
 174  177                                  if (pfd->revents & ~(POLLPRI|POLLHUP|POLLNVAL))
 175  178                                          (void) printf("%s: unknown error\n",
 176      -                                                arg);
      179 +                                            arg);
 177  180                          }
 178  181  
 179  182                          (void) close(pfd->fd);
 180  183                          pfd->fd = -1;
 181  184                          remain--;
 182  185                  }
 183  186          }
 184  187  
 185  188          return (0);
 186  189  }
↓ open down ↓ 17 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX