Print this page
14249 pseudo-terminal nomenclature should reflect POSIX
Change-Id: Ib4a3cef899ff4c71b09cb0dc6878863c5e8357bc

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/script/script.c
          +++ new/usr/src/cmd/script/script.c
   1    1  /*
   2    2   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
   3    3   * Use is subject to license terms.
   4    4   */
   5    5  
   6      -/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
   7      -/*        All Rights Reserved   */
        6 +/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
        7 +/*        All Rights Reserved */
   8    8  
   9    9  
  10   10  /*
  11   11   * Copyright (c) 1980 Regents of the University of California.
  12   12   * All rights reserved.  The Berkeley software License Agreement
  13   13   * specifies the terms and conditions for redistribution.
  14   14   */
  15   15  
  16   16  /*      Portions Copyright(c) 1988, Sun Microsystems, Inc.      */
  17   17  /*      All Rights Reserved.                                    */
↓ open down ↓ 8 lines elided ↑ open up ↑
  26   26  #include <fcntl.h>
  27   27  #include <locale.h>
  28   28  #include <time.h>
  29   29  #include <sys/stropts.h>
  30   30  #include <sys/types.h>
  31   31  #include <sys/stat.h>
  32   32  #include <sys/termios.h>
  33   33  #include <sys/file.h>
  34   34  #include <errno.h>
  35   35  
  36      -int     grantpt();
  37      -int     unlockpt();
       36 +int     grantpt();
       37 +int     unlockpt();
  38   38  char    *ptsname();
  39   39  void    doinput() __NORETURN;
  40   40  void    dooutput();
  41   41  void    doshell();
  42   42  void    fixtty();
  43   43  void    fail();
  44   44  void    done() __NORETURN;
  45      -void    getmaster();
  46      -void    getslave();
       45 +void    getmanager();
       46 +void    getsubsid();
  47   47  
  48   48  char    *shell;
  49   49  FILE    *fscript;
  50      -int     master;                 /* file descriptor for master pseudo-tty */
  51      -int     slave;                  /* file descriptor for slave pseudo-tty */
       50 +int     manager;        /* file descriptor for manager pseudo-tty */
       51 +int     subsid;         /* file descriptor for subsidiary pseudo-tty */
  52   52  int     child;
  53   53  int     subchild;
  54   54  char    *fname = "typescript";
  55   55  void    sigwinch();
  56   56  void    finish();
  57   57  
  58   58  struct  termios b;
  59   59  struct  winsize size;
  60   60  int     lb;
  61   61  int     l;
  62      -char    *mptname = "/dev/ptmx"; /* master pseudo-tty device */
       62 +char    *mptname = "/dev/ptmx"; /* manager pseudo-tty device */
  63   63  
  64   64  int     aflg;
  65   65  
  66   66  int
  67   67  main(int argc, char *argv[])
  68   68  {
  69   69          uid_t ruidt;
  70   70          gid_t gidt;
  71   71  
  72   72          (void) setlocale(LC_ALL, "");
↓ open down ↓ 23 lines elided ↑ open up ↑
  96   96          if (argc > 0)
  97   97                  fname = argv[0];
  98   98          ruidt = getuid();
  99   99          gidt = getgid();
 100  100          if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL) {
 101  101                  perror(fname);
 102  102                  fail();
 103  103          }
 104  104          setbuf(fscript, NULL);
 105  105          chown(fname, ruidt, gidt);
 106      -        getmaster();
      106 +        getmanager();
 107  107          printf(gettext("Script started, file is %s\n"), fname);
 108  108          fixtty();
 109  109  
 110  110          (void) signal(SIGCHLD, finish);
 111  111          child = fork();
 112  112          if (child < 0) {
 113  113                  perror("fork");
 114  114                  fail();
 115  115          }
 116  116          if (child == 0) {
↓ open down ↓ 22 lines elided ↑ open up ↑
 139  139          sigset(SIGWINCH, sigwinch);
 140  140  
 141  141          while ((cc = read(0, ibuf, BUFSIZ)) != 0) {
 142  142                  if (cc == -1) {
 143  143                          if (errno == EINTR) {   /* SIGWINCH probably */
 144  144                                  continue;
 145  145                          } else {
 146  146                                  break;
 147  147                          }
 148  148                  }
 149      -                (void) write(master, ibuf, cc);
      149 +                (void) write(manager, ibuf, cc);
 150  150          }
 151  151          done();
 152  152  }
 153  153  
 154  154  void
 155  155  sigwinch()
 156  156  {
 157  157          struct winsize ws;
 158  158  
 159  159          if (ioctl(0, TIOCGWINSZ, &ws) == 0)
 160      -                (void) ioctl(master, TIOCSWINSZ, &ws);
      160 +                (void) ioctl(manager, TIOCSWINSZ, &ws);
 161  161  }
 162  162  
 163  163  #include <sys/wait.h>
 164  164  
 165  165  void
 166  166  finish()
 167  167  {
 168  168          int status;
 169  169          register int pid;
 170  170          register int die = 0;
↓ open down ↓ 12 lines elided ↑ open up ↑
 183  183          time_t tvec;
 184  184          char obuf[BUFSIZ];
 185  185          char tbuf[BUFSIZ];
 186  186          int cc;
 187  187  
 188  188          (void) close(0);
 189  189          tvec = time((time_t *)0);
 190  190          strftime(tbuf, BUFSIZ, "%c", localtime(&tvec));
 191  191          fprintf(fscript, gettext("Script started on %s\n"), tbuf);
 192  192          for (;;) {
 193      -                cc = read(master, obuf, sizeof (obuf));
      193 +                cc = read(manager, obuf, sizeof (obuf));
 194  194                  if (cc <= 0)
 195  195                          break;
 196  196                  (void) write(1, obuf, cc);
 197  197                  (void) fwrite(obuf, 1, cc, fscript);
 198  198          }
 199  199          done();
 200  200  }
 201  201  
 202  202  void
 203  203  doshell()
 204  204  {
 205  205  
 206  206          setpgrp();      /* relinquish control terminal */
 207      -        getslave();
 208      -        (void) close(master);
      207 +        getsubsid();
      208 +        (void) close(manager);
 209  209          (void) fclose(fscript);
 210      -        (void) dup2(slave, 0);
 211      -        (void) dup2(slave, 1);
 212      -        (void) dup2(slave, 2);
 213      -        (void) close(slave);
      210 +        (void) dup2(subsid, 0);
      211 +        (void) dup2(subsid, 1);
      212 +        (void) dup2(subsid, 2);
      213 +        (void) close(subsid);
 214  214          execl(shell, shell, "-i", (char *)0);
 215  215          perror(shell);
 216  216          fail();
 217  217  }
 218  218  
 219  219  void
 220  220  fixtty()
 221  221  {
 222  222          struct termios sbuf;
 223  223  
↓ open down ↓ 18 lines elided ↑ open up ↑
 242  242  done()
 243  243  {
 244  244          time_t tvec;
 245  245          char tbuf[BUFSIZ];
 246  246  
 247  247          if (subchild) {
 248  248                  tvec = time((time_t *)0);
 249  249                  strftime(tbuf, BUFSIZ, "%c", localtime(&tvec));
 250  250                  fprintf(fscript, gettext("\nscript done on %s\n"), tbuf);
 251  251                  (void) fclose(fscript);
 252      -                (void) close(master);
      252 +                (void) close(manager);
 253  253          } else {
 254  254                  (void) ioctl(0, TCSETSW, (char *)&b);
 255  255                  printf(gettext("Script done, file is %s\n"), fname);
 256  256          }
 257  257          exit(0);
 258  258  }
 259  259  
 260  260  void
 261      -getmaster()
      261 +getmanager()
 262  262  {
 263  263          struct stat stb;
 264  264  
 265      -        if ((master = open(mptname, O_RDWR)) >= 0) { /* a pseudo-tty is free */
      265 +        if ((manager = open(mptname, O_RDWR)) >= 0) { /* a pseudo-tty is free */
 266  266                  (void) ioctl(0, TCGETS, (char *)&b);
 267  267                  (void) ioctl(0, TIOCGWINSZ, (char *)&size);
 268  268                  return;
 269  269          } else {                                /* out of pseudo-tty's */
 270  270                  perror(mptname);
 271  271                  fprintf(stderr, gettext("Out of pseudo-tty's\n"));
 272  272                  fail();
 273  273          }
 274  274  }
 275  275  
 276  276  void
 277      -getslave()
      277 +getsubsid()
 278  278  {
 279      -        char *slavename;        /* name of slave pseudo-tty */
      279 +        char *subsidname;       /* name of subsidiary pseudo-tty */
 280  280  
 281      -        grantpt(master);                /* change permissions of slave */
 282      -        unlockpt(master);                       /* unlock slave */
 283      -        slavename = ptsname(master);            /* get name of slave */
 284      -        slave = open(slavename, O_RDWR);        /* open slave */
 285      -        if (slave < 0) {                        /* error on opening slave */
 286      -                perror(slavename);
      281 +        grantpt(manager);               /* change permissions of subsidiary */
      282 +        unlockpt(manager);                      /* unlock subsidiary */
      283 +        subsidname = ptsname(manager);          /* get name of subsidiary */
      284 +        subsid = open(subsidname, O_RDWR);      /* open subsidiary */
      285 +        if (subsid < 0) {                       /* error opening subsidiary */
      286 +                perror(subsidname);
 287  287                  fail();
 288  288          }
 289      -        ioctl(slave, I_PUSH, "ptem");   /* push pt hw emulation module */
 290      -        ioctl(slave, I_PUSH, "ldterm");         /* push line discipline */
      289 +        ioctl(subsid, I_PUSH, "ptem");  /* push pt hw emulation module */
      290 +        ioctl(subsid, I_PUSH, "ldterm");        /* push line discipline */
 291  291  
 292      -        (void) ioctl(slave, TCSETSF, (char *)&b);
 293      -        (void) ioctl(slave, TIOCSWINSZ, (char *)&size);
      292 +        (void) ioctl(subsid, TCSETSF, (char *)&b);
      293 +        (void) ioctl(subsid, TIOCSWINSZ, (char *)&size);
 294  294  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX