home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume14 / 3bconnect / talk.c < prev    next >
C/C++ Source or Header  |  1988-05-08  |  1KB  |  70 lines

  1. /*
  2.  * talk.c: routines to talk to the remote shell, run on the remote system
  3.  */
  4. #include "ni.h"
  5.  
  6.  
  7. passon(r, output)
  8. register struct request *r;    /* stuff to send        */
  9. int output;            /* file descriptor to write on    */
  10. {
  11.     int ok = 1;
  12.     switch(r->r_type) {
  13.     case TERMINATE:
  14.         ok = 0;
  15.         break;
  16.     case RMTSIGINT:
  17.         kill(0, SIGINT);
  18.         break;
  19.     case RMTSIGQUIT:
  20.         kill(0, SIGQUIT);
  21.         break;
  22.     case DATA:
  23.         write(output, r->r_data, r->r_size);
  24.         break;
  25.     default:
  26.         sprintf(r->r_data, "Bad packet type %d\n", r->r_type);
  27.             send(r, strlen(r->r_data), DATA, client);
  28.     }
  29.     return(ok);
  30. }
  31. #define PTTY "/dev/ptc"
  32. #define MAXPTTYS 8
  33. /*
  34.  * special case routine - use the PC-Interface pseudo-ttys to get a real
  35.  * remote login!
  36.  */
  37. dologin(r)
  38. register struct request *r;
  39. {
  40.     int dev;            /* file descriptor    */
  41.     int i, n, reader;
  42.     char name[sizeof PTTY + 4];
  43.     for(i=0;i<MAXPTTYS;i++) {
  44.         sprintf(name, "%s%02d", PTTY, i);
  45.         if((dev = open(name, 2)) != -1) break;
  46.     }
  47.     if(dev == -1) {
  48.         n = sprintf(r->r_data, "No PC-Interface ports available");
  49.         send(r, n, TERMINATE, client);
  50.         exit(1);
  51.     }
  52.     if(reader = fork()) {
  53.         while(1) {
  54.             recv(r);
  55.             if(passon(r, dev) == 0) {
  56.                 skill(reader, SIGTERM);
  57.                 exit(0);
  58.             }
  59.         }
  60.     }
  61.     else {
  62.         while(1) {
  63.             n = read(dev, r->r_data, sizeof r->r_data);
  64.             send(r, n, DATA, client);
  65.         }
  66.     }
  67. }
  68.  
  69.         
  70.