+ willoption(TELOPT_NAWS, 1);
+ dooption(TELOPT_STATUS, 1);
+ flowmode = 1; /* default flow control state */
+ willoption(TELOPT_LFLOW, 1);
+
+ /*
+ * Spin, waiting for a response from the DO ECHO. However,
+ * some REALLY DUMB telnets out there might not respond
+ * to the DO ECHO. So, we spin looking for NAWS, (most dumb
+ * telnets so far seem to respond with WONT for a DO that
+ * they don't understand...) because by the time we get the
+ * response, it will already have processed the DO ECHO.
+ * Kludge upon kludge.
+ */
+ while (hiswants[TELOPT_NAWS] != hisopts[TELOPT_NAWS])
+ ttloop();
+
+ /*
+ * On the off chance that the telnet client is broken and does not
+ * respond to the DO ECHO we sent, (after all, we did send the
+ * DO NAWS negotiation after the DO ECHO, and we won't get here
+ * until a response to the DO NAWS comes back) simulate the
+ * receipt of a will echo. This will also send a WONT ECHO
+ * to the client, since we assume that the client failed to
+ * respond because it believes that it is already in DO ECHO
+ * mode, which we do not want.
+ */
+ if (hiswants[TELOPT_ECHO] == OPT_YES)
+ willoption(TELOPT_ECHO, 0);
+
+ /*
+ * Finally, to clean things up, we turn on our echo. This
+ * will break stupid 4.2 telnets out of local terminal echo.
+ */
+
+ if (!myopts[TELOPT_ECHO])
+ dooption(TELOPT_ECHO);
+
+ /*
+ * Turn on packet mode, and default to line at at time mode.
+ */
+ (void) ioctl(p, TIOCPKT, (char *)&on);
+#ifdef LINEMODE
+ tty_setlinemode(1);
+
+# ifdef KLUDGELINEMODE
+ /*
+ * Continuing line mode support. If client does not support
+ * real linemode, attempt to negotiate kludge linemode by sending
+ * the do timing mark sequence.
+ */
+ if (lmodetype < REAL_LINEMODE)
+ willoption(TELOPT_TM, 1);
+# endif /* KLUDGELINEMODE */
+#endif /* LINEMODE */
+
+ /*
+ * Call telrcv() once to pick up anything received during
+ * terminal type negotiation, 4.2/4.3 determination, and
+ * linemode negotiation.
+ */
+ telrcv();
+
+ (void) ioctl(f, FIONBIO, (char *)&on);
+ (void) ioctl(p, FIONBIO, (char *)&on);
+#ifdef CRAY2
+ init_termdriver(f, p, interrupt, sendbrk);
+#endif
+
+#if defined(SO_OOBINLINE)
+ (void) setsockopt(net, SOL_SOCKET, SO_OOBINLINE, &on, sizeof on);
+#endif /* defined(SO_OOBINLINE) */
+
+#ifdef SIGTSTP
+ (void) signal(SIGTSTP, SIG_IGN);
+#endif
+#ifdef SIGTTOU
+ /*
+ * Ignoring SIGTTOU keeps the kernel from blocking us
+ * in ttioct() in /sys/tty.c.
+ */
+ (void) signal(SIGTTOU, SIG_IGN);
+#endif
+
+ (void) signal(SIGCHLD, cleanup);
+
+#if defined(CRAY2)
+ /*
+ * Cray-2 will send a signal when pty modes are changed by slave
+ * side. Set up signal handler now.
+ */
+ if ((int)signal(SIGUSR1, termstat) < 0)
+ perror("signal");
+ else if (ioctl(p, TCSIGME, (char *)SIGUSR1) < 0)
+ perror("ioctl:TCSIGME");
+ /*
+ * Make processing loop check terminal characteristics early on.
+ */
+ termstat();
+#endif
+
+ (void) setpgrp(0, 0);
+
+ /*
+ * Show banner that getty never gave.
+ *
+ * We put the banner in the pty input buffer. This way, it
+ * gets carriage return null processing, etc., just like all
+ * other pty --> client data.
+ */
+
+ (void) gethostname(hostname, sizeof (hostname));
+
+ if (getent(defent, "default") == 1) {
+ char *getstr();
+ char *cp=defstrs;
+
+ HE = getstr("he", &cp);
+ HN = getstr("hn", &cp);
+ IM = getstr("im", &cp);
+ if (HN && *HN)
+ (void) strcpy(hostname, HN);
+ if (IM == 0)
+ IM = "";
+ } else {
+#ifdef CRAY
+ if (hostinfo == 0)
+ IM = 0;
+ else
+#endif
+ IM = DEFAULT_IM;
+ HE = 0;
+ }
+ edithost(HE, hostname);
+ if (IM && *IM)
+ putf(IM, ptyibuf2);
+
+ if (pcc)
+ (void) strncat(ptyibuf2, ptyip, pcc+1);
+ ptyip = ptyibuf2;
+ pcc = strlen(ptyip);
+