87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * 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, <waltje@uwalt.nl.mugnet.org>
 | |
|  *              Michael Temari, <temari@temari.ae.ge.com>
 | |
|  *
 | |
|  * 07/29/92 MT  Telnet options hack which seems to work okay
 | |
|  * 01/12/93 MT  Better telnet options processing instead of hack
 | |
|  */
 | |
| #include <sys/types.h>
 | |
| #include <errno.h>
 | |
| #if 0
 | |
| #include <fcntl.h>
 | |
| #endif
 | |
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| #include <string.h>
 | |
| #include <stdio.h>
 | |
| #include <signal.h>
 | |
| #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... */
 | |
| }
 | 
