- if (pid) {
- char pibuf[1024], fibuf[1024], *pbp, *fbp;
- int pcc = 0, fcc = 0, on = 1;
-/* FILE *console = fopen("/dev/console", "w"); */
-/* setbuf(console, 0); */
-
-/* fprintf(console, "f %d p %d\r\n", f, p); */
- ioctl(f, FIONBIO, &on);
- ioctl(p, FIONBIO, &on);
- ioctl(p, TIOCPKT, &on);
- signal(SIGTSTP, SIG_IGN);
- signal(SIGCHLD, cleanup);
- for (;;) {
- int ibits = 0, obits = 0;
-
- if (fcc)
- obits |= (1<<p);
+ if (pid == 0) {
+ close(f), close(p);
+ dup2(t, 0), dup2(t, 1), dup2(t, 2);
+ close(t);
+ execl("/bin/login", "login", "-r", hp->h_name, 0);
+ fatalperror(2, "/bin/login", errno);
+ /*NOTREACHED*/
+ }
+ close(t);
+ ioctl(f, FIONBIO, &on);
+ ioctl(p, FIONBIO, &on);
+ ioctl(p, TIOCPKT, &on);
+ signal(SIGTSTP, SIG_IGN);
+ signal(SIGCHLD, cleanup);
+ setpgrp(0, 0);
+ protocol(f, p);
+ signal(SIGCHLD, SIG_IGN);
+ cleanup();
+}
+
+char magic[2] = { 0377, 0377 };
+char oobdata[] = {TIOCPKT_WINDOW};
+
+/*
+ * Handle a "control" request (signaled by magic being present)
+ * in the data stream. For now, we are only willing to handle
+ * window size changes.
+ */
+control(pty, cp, n)
+ int pty;
+ char *cp;
+ int n;
+{
+ struct winsize w;
+
+ if (n < 4+sizeof (w) || cp[2] != 's' || cp[3] != 's')
+ return (0);
+ oobdata[0] &= ~TIOCPKT_WINDOW; /* we know he heard */
+ bcopy(cp+4, (char *)&w, sizeof(w));
+ w.ws_row = ntohs(w.ws_row);
+ w.ws_col = ntohs(w.ws_col);
+ w.ws_xpixel = ntohs(w.ws_xpixel);
+ w.ws_ypixel = ntohs(w.ws_ypixel);
+ (void)ioctl(pty, TIOCSWINSZ, &w);
+ return (4+sizeof (w));
+}
+
+/*
+ * rlogin "protocol" machine.
+ */
+protocol(f, p)
+ int f, p;
+{
+ char pibuf[1024], fibuf[1024], *pbp, *fbp;
+ register pcc = 0, fcc = 0;
+ int cc;
+ char cntl;
+
+ /*
+ * Must ignore SIGTTOU, otherwise we'll stop
+ * when we try and set slave pty's window shape
+ * (our controlling tty is the master pty).
+ */
+ (void) signal(SIGTTOU, SIG_IGN);
+ send(f, oobdata, 1, MSG_OOB); /* indicate new rlogin */
+ for (;;) {
+ int ibits, obits, ebits;
+
+ ibits = 0;
+ obits = 0;
+ if (fcc)
+ obits |= (1<<p);
+ else
+ ibits |= (1<<f);
+ if (pcc >= 0)
+ if (pcc)
+ obits |= (1<<f);