86 lines
1.9 KiB
C
86 lines
1.9 KiB
C
/*
|
|
* 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... */
|
|
}
|