/* * TNET A server program for MINIX which implements the TCP/IP * suite of networking protocols. It is based on the * TCP/IP code written by Phil Karn et al, as found in * his NET package for Packet Radio communications. * * Handle the TERMINAL module. * * Author: Fred N. van Kempen, * Michael Temari, * * 07/29/92 MT Telnet options hack which seems to work okay * 01/12/93 MT Better telnet options processing instead of hack */ #include #include #if 0 #include #endif #include #include #include #include #include #include "telnet.h" #include "telnetd.h" _PROTOTYPE(void sig_done, (int sig)); static char buff[4096]; void term_init() { tel_init(); telopt(1, WILL, TELOPT_SGA); telopt(1, DO, TELOPT_SGA); telopt(1, WILL, TELOPT_BINARY); telopt(1, DO, TELOPT_BINARY); telopt(1, WILL, TELOPT_ECHO); telopt(1, DO, TELOPT_WINCH); } static int io_done = 0; void term_inout(pty_fd) int pty_fd; { register int i; pid_t pid; struct sigaction sa; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = sig_done; sigaction(SIGALRM, &sa, (struct sigaction *) NULL); if ((pid = fork()) == -1) { sprintf(buff, "telnetd: fork() failed: %s\r\n", strerror(errno)); (void) write(1, buff, strlen(buff)); } if (pid != 0) { /* network -> login process */ while (!io_done && (i = read(0, buff, sizeof(buff))) > 0) { tel_in(pty_fd, 1, buff, i); } /* EOF, kill opposite number and exit. */ (void) kill(pid, SIGKILL); } else { /* login process -> network */ while ((i = read(pty_fd, buff, sizeof(buff))) > 0) { tel_out(1, buff, i); } /* EOF, alert opposite number and exit. */ (void) kill(getppid(), SIGALRM); } /* EOF. */ } void sig_done(sig) int sig; { io_done = 1; alarm(1); /* there is always a chance... */ }