Hi,

   Here is a patch I sent Bob back in a couple of years ago to fix
   telnet support to handle correct negotiations. I am busy right now
   trying to get CTSS running on my 7090 sim, or I would move it
   forward to current release. Have at it, it works with Ckermit.

Rich

diff -cr sim372/sim_tmxr.c sim372f/sim_tmxr.c
*** sim372/sim_tmxr.c   Fri Aug 26 22:46:50 2005
--- sim372f/sim_tmxr.c  Sun Aug 12 16:13:13 2007
***************
*** 96,101 ****
--- 96,103 ----
  #define TNS_WILL        002                             /* WILL seen */
  #define TNS_WONT        003                             /* WONT seen */
  #define TNS_SKIP        004                             /* skip next */
+ #define TNS_DO          005                             /* DO seen */
+ #define TNS_DONT        006                             /* DONT seen */
  
  void tmxr_rmvrc (TMLN *lp, int32 p);
  int32 tmxr_send_buffered_data (TMLN *lp);
***************
*** 123,135 ****
  int32 i;
  uint32 ipaddr;
  static char mantra[] = {
!     TN_IAC, TN_WILL, TN_LINE,
      TN_IAC, TN_WILL, TN_SGA,
      TN_IAC, TN_WILL, TN_ECHO,
      TN_IAC, TN_WILL, TN_BIN,
      TN_IAC, TN_DO, TN_BIN
      };
  
  newsock = sim_accept_conn (mp->master, &ipaddr);        /* poll connect */
  if (newsock != INVALID_SOCKET) {                        /* got a live one? */
      for (i = 0; i < mp->lines; i++) {                   /* find avail line */
--- 125,138 ----
  int32 i;
  uint32 ipaddr;
  static char mantra[] = {
!     TN_IAC, TN_WONT, TN_LINE,
      TN_IAC, TN_WILL, TN_SGA,
      TN_IAC, TN_WILL, TN_ECHO,
      TN_IAC, TN_WILL, TN_BIN,
      TN_IAC, TN_DO, TN_BIN
      };
  
+ 
  newsock = sim_accept_conn (mp->master, &ipaddr);        /* poll connect */
  if (newsock != INVALID_SOCKET) {                        /* got a live one? */
      for (i = 0; i < mp->lines; i++) {                   /* find avail line */
***************
*** 215,220 ****
--- 218,224 ----
  {
  int32 i, nbytes, j;
  TMLN *lp;
+ char buff[3];
  
  for (i = 0; i < mp->lines; i++) {                       /* loop thru lines */
      lp = mp->ldsc + i;                                  /* get line desc */
***************
*** 270,284 ****
                      lp->tsta = TNS_WILL;
                  else if (tmp == TN_WONT)                /* IAC + WONT? */
                      lp->tsta = TNS_WONT;
                  else lp->tsta = TNS_SKIP;               /* IAC + other */
                  tmxr_rmvrc (lp, j);                     /* remove char */
                  break;
  
              case TNS_WILL: case TNS_WONT:               /* IAC+WILL/WONT prev 
*/
!                 if (tmp == TN_BIN) {                    /* BIN? */
!                     if (lp->tsta == TNS_WILL) lp->dstb = 0;
                      else lp->dstb = 1;
!                                       }
  
              case TNS_SKIP: default:                     /* skip char */
                  lp->tsta = TNS_NORM;                    /* next normal */
--- 274,338 ----
                      lp->tsta = TNS_WILL;
                  else if (tmp == TN_WONT)                /* IAC + WONT? */
                      lp->tsta = TNS_WONT;
+               else if (tmp == TN_DO)
+                   lp->tsta = TNS_DO;
+               else if (tmp == TN_DONT)
+                   lp->tsta = TNS_DONT;
                  else lp->tsta = TNS_SKIP;               /* IAC + other */
                  tmxr_rmvrc (lp, j);                     /* remove char */
                  break;
  
+           case TNS_DO:                                /* Handle do */
+               buff[0] = TN_IAC;
+               buff[1] = TN_WONT;
+               buff[2] = tmp;
+               if (tmp == TN_BIN) {
+                   if (!lp->dstb) {
+                       lp->tsta = TNS_NORM;            /* next normal */
+                       tmxr_rmvrc (lp, j);             /* remove char */
+                       break;
+                   }
+                   buff[1] = TN_WILL;
+                   lp->dstb = 0;
+               } else if (tmp == TN_ECHO || tmp == TN_SGA) {
+                   buff[1] = TN_WILL;
+               }
+                 sim_write_sock (lp->conn, buff, 3); 
+                 lp->tsta = TNS_NORM;                    /* next normal */
+                 tmxr_rmvrc (lp, j);                     /* remove char */
+               break;
+               
+           case TNS_DONT:                              /* Handle don't */
+               buff[0] = TN_IAC;
+               buff[1] = TN_WONT;
+               buff[2] = tmp;
+               if (tmp == TN_BIN) {
+                   if (lp->dstb) {
+                        lp->tsta = TNS_NORM;             /* next normal */
+                        tmxr_rmvrc (lp, j);              /* remove char */
+                      break;
+                   }
+                   lp->dstb = 1;
+               }
+                 sim_write_sock (lp->conn, buff, 3);
+                 lp->tsta = TNS_NORM;                    /* next normal */
+                 tmxr_rmvrc (lp, j);                     /* remove char */
+               break;
+ 
              case TNS_WILL: case TNS_WONT:               /* IAC+WILL/WONT prev 
*/
!               buff[0] = TN_IAC;
!               buff[1] = TN_DONT;
!               buff[2] = tmp;
!               if (tmp == TN_BIN) {                    /* BIN? */
!                     if (lp->tsta == TNS_WILL) {
!                       buff[1] = TN_DO;
!                       lp->dstb = 0;
!                   }
                      else lp->dstb = 1;
!               } else if (tmp == TN_ECHO || tmp == TN_SGA) {
!                   buff[1] = TN_DO;
!               }
!                 sim_write_sock (lp->conn, buff, 3);
  
              case TNS_SKIP: default:                     /* skip char */
                  lp->tsta = TNS_NORM;                    /* next normal */






-- 
==========================================================================
Richard Cornwell
[email protected]
http://sky-visions.com
==========================================================================

_______________________________________________
Simh mailing list
[email protected]
http://mailman.trailing-edge.com/mailman/listinfo/simh

Reply via email to