Listing 2: Sample mediator program

#include <iostream.h>
#include <errno.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <unistd.h>
#include "PseudoTerminal.h"

int main(int argc, char* argv[])
{
  char* args[4];

  ////
  // start xterm (doesn't have to be started by the pty but
  // it is convenient)
  PseudoTerminal xterm_pty;

  // build the command line for xterm
  args[0] = "xterm";
    char Sxxd[6];      // setup the -Sxxd argument for xterm
    Sxxd[0] = '\0';
    strcpy(Sxxd, "-S");
    Sxxd[2] = xterm_pty.getPtyX();
    Sxxd[3] = xterm_pty.getPtyY();
    Sxxd[4] = '1';     // number of the inherited File descriptor
    Sxxd[5] = 0;       // last argument -- NULL
  args[1] = Sxxd;
  args[2] = NULL;

  // start the xterm and wait on it to tell us what its window id is
  xterm_pty.forkvp(args);
  xterm_pty.read();
  cerr << "xterm is up wid=" << xterm_pty.getBuffer();


  ////
  // start telnet
  PseudoTerminal telnet_pty;
  args[0] = "telnet";
  args[1] = "localhost";
  args[2] = NULL;
  telnet_pty.forkvp(args);


  try
  {
    // setup the file descriptors for select (using the operator
    // int() to return the master fd)
    fd_set fds;
    int max_fd = (telnet_pty > xterm_pty) ? telnet_pty : xterm_pty;
    max_fd++;
    String str;

    // mediator loop (mediates between the xterm and telnet)
    for (;;)
    {
      // build the select fd's so we can mediate between
      // the xterm and telnet
      FD_ZERO(&fds);
      FD_SET(xterm_pty, &fds);
      FD_SET(telnet_pty, &fds);

      // call select and wait on some data from either the
      // xterm or telnet
      int rc = select(max_fd, &fds, NULL, NULL, NULL);

      if (FD_ISSET(xterm_pty, &fds))
      {
        // read the users input into a string
        xterm_pty >> str;
        // check for accelerator keys (^Q to quit the app for now)
        if (str == "^Q")
        {
          cerr << "quiting" << endl;
          break;
        }
        else
          telnet_pty << str;  // forward the input on to telnet
      }
      else
        if (FD_ISSET(telnet_pty, &fds))
        {
          // forward the telnet output on to the xterm
          telnet_pty >> xterm_pty;
        }
    }
  }
  catch (int& pty_errno)
  {
    // an exception will be thrown if telnet or the xterm is closed
    cerr << "caught an exception " << strerror(pty_errno) << endl;
  }
  return(0);
}

//End of File