home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume25 / pty4 / part03 / sessmenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-19  |  3.2 KB  |  157 lines

  1. #include <stdio.h>
  2. extern char *malloc();
  3.  
  4. static char crterase[3] = { 8, ' ', 8 };
  5.  
  6. main(argc,argv,envp)
  7. int argc;
  8. char *argv[];
  9. char *envp[];
  10. {
  11.  int flagecho;
  12.  int flagdisc;
  13.  int flagseveral;
  14.  FILE *fi;
  15.  int ch;
  16.  char okext1;
  17.  char okext2;
  18.  char ext1;
  19.  char ext2;
  20.  int i;
  21.  char cmd[200];
  22.  char **newargv;
  23.  
  24.  flagdisc = 0;
  25.  flagseveral = 0;
  26.  flagecho = 1;
  27.  
  28.  fi = popen("sesslist -0","r");
  29.  if (fi)
  30.   {
  31.    while ((ch = getc(fi)) != EOF)
  32.     {
  33.      if (ch == 's')
  34.       {
  35.        while (((ch = getc(fi)) != EOF) && (ch != ' '))
  36.      ;
  37.        if (ch == EOF) break;
  38.        if ((ch = getc(fi)) == EOF) break; ext1 = ch;
  39.        if ((ch = getc(fi)) == EOF) break; ext2 = ch;
  40.        for (i = 0;i < 5;++i)
  41.     {
  42.      while (((ch = getc(fi)) != EOF) && (ch != ' '))
  43.        ;
  44.      if (ch == EOF) break;
  45.     }
  46.        if (ch == EOF) break;
  47.        if ((ch = getc(fi)) != 'd') goto breakif;
  48.  
  49.        /* Now ext1 and ext2 give a disconnected session. */
  50.        if (flagdisc)
  51.      flagseveral = 1;
  52.        else
  53.          flagdisc = 1;
  54.        okext1 = ext1;
  55.        okext2 = ext2;
  56.        printf("You have a disconnected session on /dev/tty%c%c, with these processes:\r\n",ext1,ext2); fflush(stdout);
  57.        sprintf(cmd,"ps augxt%c%c | sed 's/$/\r/'",ext1,ext2);
  58.        system(cmd);
  59.        while (((ch = getc(fi)) != EOF) && (ch != 'd'))
  60.      ;
  61.        if ((ch = getc(fi)) == ':')
  62.     {
  63.      printf("Session %c%c is named:",ext1,ext2); fflush(stdout);
  64.      while (((ch = getc(fi)) != EOF) && ch)
  65.        putchar(ch);
  66.      printf(".\r\n"); fflush(stdout);
  67.     }
  68.       }
  69.      breakif: ;
  70.      if (ch == EOF) break;
  71.      if (ch)
  72.        while (((ch = getc(fi)) != EOF) && ch)
  73.          ;
  74.      if (ch == EOF) break;
  75.     }
  76.    pclose(fi); /* XXX: or maybe it's not worth waiting? */
  77.   }
  78.  
  79.  if (flagdisc)
  80.   {
  81.    char r1;
  82.    char r2;
  83.    int pos;
  84.    char ch;
  85.  
  86.    if (flagseveral)
  87.      sprintf(cmd,"\
  88. Would you like to reconnect to one of those sessions?\r\n\
  89. If so, type its two-character extension, like %c%c for the last one.\r\n\
  90. To instead start a new session as usual, just press return: ",okext1,okext2);
  91.    else
  92.      sprintf(cmd,"\
  93. Would you like to reconnect to that session?\r\n\
  94. If so, type its two-character extension, %c%c.\r\n\
  95. To instead start a new session as usual, just press return: ",okext1,okext2);
  96.    write(1,cmd,strlen(cmd));
  97.  
  98.    pos = 0;
  99.    while (read(0,&ch,1) == 1)
  100.     {
  101.      if ((ch == 8) || (ch == 127))
  102.       {
  103.        if (pos)
  104.     {
  105.      --pos;
  106.          if (flagecho)
  107.            write(1,crterase,3);
  108.     }
  109.        continue;
  110.       }
  111.      if ((ch == 10) || (ch == 13))
  112.       {
  113.        if (flagecho)
  114.      write(1,"\r\n",2);
  115.        if (pos < 2)
  116.      break;
  117.        sprintf(cmd,"exec pty -d reconnect %c%c",r1,r2);
  118.        execl("/bin/sh","sh","-c",cmd,(char *) 0);
  119.        /* XXX: warning? */
  120.        exit(1);
  121.       }
  122.      /* XXX: other special chars? */
  123.      switch(pos)
  124.       {
  125.        case 0:
  126.      r1 = ch;
  127.      ++pos;
  128.      if (flagecho)
  129.        write(1,&ch,1);
  130.      break;
  131.        case 1:
  132.      r2 = ch;
  133.      ++pos;
  134.      if (flagecho)
  135.        write(1,&ch,1);
  136.      break;
  137.        case 2:
  138.      ch = 7;
  139.      write(1,&ch,1);
  140.      break;
  141.       }
  142.     }
  143.   }
  144.  
  145.  newargv = (char **) malloc((argc + 4) * sizeof(char *));
  146.  if (!newargv)
  147.    exit(1); /*XXXX*/
  148.  
  149.  for (i = 0;i <= argc;++i)
  150.    newargv[i + 2] = argv[i + 1];
  151.  newargv[0] = "pty";
  152.  newargv[1] = "-ds";
  153.  execvp("pty",newargv,envp);
  154.  /* XXX: warning? */
  155.  exit(1);
  156. }
  157.