#define PROT(proto) () #include <ioctl.h> #include <stdio.h> #include <osbind.h> #include <mintbind.h> #include <signal.h> #include <string.h> #include <ctype.h> #include "comm.h" #include "config.h" #include "telnet.h" volatile struct sock_buff my_buff; int echo_mode = 1; void do_print() { char *str; unsigned char *command; static last_was_iac = 0; if ( my_buff.out_count ) { str = my_buff.out; str[my_buff.out_count] = 0; if (last_was_iac) { last_was_iac = 0; command = str; goto interpret_command; } while(command = (unsigned char*)strchr(str, IAC)) { *command++ = '\0'; printf("%s", str); interpret_command: switch (*command++) { struct sgttyb my_sb; case WONT: switch (*command++) { case TELOPT_ECHO: #if 0 gtty(0, &my_sb); my_sb.sg_flags |= ECHO; stty(0, &my_sb); #endif echo_mode = 1; break; default: printf("Unknown telnet command : WONT %d.\n", command[-1]); exit(-1); } break; case WILL: switch (*command++) { case TELOPT_ECHO: #if 0 gtty(0, &my_sb); my_sb.sg_flags &= ~ECHO; stty(0, &my_sb); #endif echo_mode = 0; break; default: printf("Unknown telnet command : WILL %d.\n", *--command); exit(-1); } break; case IP: printf("Exiting.\n"); exit(0); case IAC: /* quoted IAC */ printf("%c", IAC); break; case 0: last_was_iac = 1; my_buff.out_count=0; return; default: --command; if (isascii(*command)) { break; } printf("Unknown telnet command : %d.\n", *command); exit(-1); } str = (char *)command; } printf("%s", str); my_buff.out_count=0; fflush(stdout); } } void fputchar(c) char c; { putchar(c); } main() { volatile struct bind *bind_ptr; struct cookie *cookie_ptr,*scan_ptr; char c; cookie_ptr = (struct cookie *)Setexc(0x168,0); scan_ptr = cookie_ptr - 1; do { if ( (++scan_ptr)->c == BIND ) break; } while ( scan_ptr->c ); if (!scan_ptr->c) { exit (-1); } bind_ptr = (struct bind *)scan_ptr->v; for (;bind_ptr && bind_ptr->port != PORTNO ;bind_ptr = bind_ptr->next) printf("searching the port\n"); if (!bind_ptr) exit(-1); my_buff.in_count = 0; my_buff.out_count = 0; (void)Psignal(SIGUSR1, do_print); my_buff.pid = Pgetpid(); while (bind_ptr->incoming) printf("waiting for free 'incoming' slot\n"); bind_ptr->incoming = &my_buff; printf("starting main loop\n"); for(;;){ int i; c=Fgetchar(0,0); /* getc() evaluates ECHO mode too late :-( */ i=0; while ( my_buff.in_count ){ if (!(i++&0xfff)) printf(""); usleep(1000); } i=0; while ( i < 160 && c != '\r' ) { if (c == 0x7f) c='\b'; if (echo_mode) { if (c == '\b') { if (i) { fputchar(c); fputchar(' '); fputchar(c); fflush(stdout); i--; } c=Fgetchar(0,0); continue; } fputchar(c); fflush(stdout); } my_buff.in[i++] = c; c=Fgetchar(0,0); } my_buff.in[i++] = c; my_buff.in[i++] = '\n'; if (echo_mode) { fputchar(c); fputchar('\n'); fflush(stdout); } my_buff.in_count = i; } }