--- sbbs/sbbs3/telgate.cpp 2018/04/24 16:39:34 1.1.1.1 +++ sbbs/sbbs3/telgate.cpp 2018/04/24 16:40:33 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet telnet gateway routines */ -/* $Id: telgate.cpp,v 1.1.1.1 2018/04/24 16:39:34 root Exp $ */ +/* $Id: telgate.cpp,v 1.1.1.2 2018/04/24 16:40:33 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -38,29 +38,13 @@ #include "sbbs.h" #include "telnet.h" -extern "C" { -int open_socket(int); -int close_socket(int); -} - -u_long resolve_ip(char *addr) -{ - HOSTENT* host; - - if(isdigit(addr[0])) - return(inet_addr(addr)); - if ((host=gethostbyname(addr))==NULL) - return(0); - return(*((ulong*)host->h_addr_list[0])); -} - void sbbs_t::telnet_gate(char* destaddr, ulong mode) { char* p; - char str[128]; uchar buf[512]; int i; int rd; + uint attempts; ulong l; bool gotline; ushort port; @@ -81,9 +65,9 @@ void sbbs_t::telnet_gate(char* destaddr, } ip_addr=resolve_ip(destaddr); - if(!ip_addr) { - lprintf("!Failed to resolve address: %s",destaddr); - bprintf("!Failed to resolve address: %s\n",destaddr); + if(ip_addr==INADDR_NONE) { + lprintf(LOG_NOTICE,"!TELGATE Failed to resolve address: %s",destaddr); + bprintf("!Failed to resolve address: %s\r\n",destaddr); return; } @@ -93,13 +77,13 @@ void sbbs_t::telnet_gate(char* destaddr, } memset(&addr,0,sizeof(addr)); - addr.sin_addr.s_addr = htonl(cfg.startup->telnet_interface); + addr.sin_addr.s_addr = htonl(startup->telnet_interface); addr.sin_family = AF_INET; if((i=bind(remote_socket, (struct sockaddr *) &addr, sizeof (addr)))!=0) { + lprintf(LOG_NOTICE,"!TELGATE ERROR %d (%d) binding to socket %d",i, ERROR_VALUE, remote_socket); + bprintf("!ERROR %d (%d) binding to socket\r\n",i, ERROR_VALUE); close_socket(remote_socket); - lprintf("!ERROR %d (%d) binding to socket %d",i, ERROR_VALUE, socket); - bprintf("!ERROR %d (%d) binding to socket\n",i, ERROR_VALUE); return; } @@ -109,24 +93,24 @@ void sbbs_t::telnet_gate(char* destaddr, addr.sin_port = htons(port); if((i=connect(remote_socket, (struct sockaddr *)&addr, sizeof(addr)))!=0) { - close_socket(remote_socket); - lprintf("!ERROR %d (%d) connecting to server: %s" + lprintf(LOG_NOTICE,"!TELGATE ERROR %d (%d) connecting to server: %s" ,i,ERROR_VALUE, destaddr); - bprintf("!ERROR %d (%d) connecting to server: %s\n" + bprintf("!ERROR %d (%d) connecting to server: %s\r\n" ,i,ERROR_VALUE, destaddr); + close_socket(remote_socket); return; } l=1; if((i = ioctlsocket(remote_socket, FIONBIO, &l))!=0) { - close_socket(remote_socket); - lprintf("!ERROR %d (%d) disabling socket blocking" + lprintf(LOG_NOTICE,"!TELGATE ERROR %d (%d) disabling socket blocking" ,i, ERROR_VALUE); + close_socket(remote_socket); return; } - lprintf("Node %d %s gate to %s port %d on socket %d" + lprintf(LOG_INFO,"Node %d %s gate to %s port %d on socket %d" ,cfg.node_num ,mode&TG_RLOGIN ? "RLogin" : "Telnet" ,destaddr,port,remote_socket); @@ -140,21 +124,39 @@ void sbbs_t::telnet_gate(char* destaddr, if(mode&TG_RLOGIN) { p=(char*)buf; *(p++)=0; - strcpy(p,useron.alias); - p+=strlen(p)+1; - strcpy(p,useron.name); - p+=strlen(p)+1; - strcpy(p,"vt100/57600"); - p+=strlen(p)+1; + p+=sprintf(p,"%s",useron.alias); + p++; // Add NULL + p+=sprintf(p,"%s",useron.name); + p++; // Add NULL + p+=sprintf(p,"%s/57600",terminal); + p++; // Add NULL l=p-(char*)buf; - send(remote_socket,(char*)buf,l,0); + sendsocket(remote_socket,(char*)buf,l); } + /* This is required for gating to Unix telnetd */ + if(mode&TG_NOTERMTYPE) + request_telnet_opt(TELNET_DONT,TELNET_TERM_TYPE); // Re-negotiation of terminal type + + /* Text/NVT mode by default */ + request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX); + while(online) { - gettimeleft(); + if(!(mode&TG_NOCHKTIME)) + gettimeleft(); rd=RingBufRead(&inbuf,buf,sizeof(buf)); if(rd) { - if(!(telnet_mode&TELNET_MODE_BIN_RX)) { +#if 0 + if(memchr(buf,TELNET_IAC,rd)) { + char dump[2048]; + dump[0]; + p=dump; + for(int i=0;i=0) + break; + if(ERROR_VALUE!=EWOULDBLOCK) + break; + mswait(500); + } + if(i<0) { + lprintf(LOG_NOTICE,"!TELGATE ERROR %d sending on socket %d",ERROR_VALUE,remote_socket); break; } } @@ -216,29 +227,42 @@ void sbbs_t::telnet_gate(char* destaddr, if(ERROR_VALUE==EWOULDBLOCK) { if(mode&TG_NODESYNC) { SYNC; + } else { + // Check if the node has been interrupted + getnodedat(cfg.node_num,&thisnode,0); + if(thisnode.misc&NODE_INTR) + break; } - mswait(1); + YIELD(); continue; } - lprintf("!TELGATE ERROR %d receiving on socket %d",ERROR_VALUE,remote_socket); + lprintf(LOG_NOTICE,"!TELGATE ERROR %d receiving on socket %d",ERROR_VALUE,remote_socket); break; } if(!rd) { - lprintf("Node %d Telnet gate disconnected",cfg.node_num); + lprintf(LOG_INFO,"Node %d Telnet gate disconnected",cfg.node_num); break; } +#if 0 + if(memchr(buf,TELNET_IAC,rd)) { + char dump[2048]; + dump[0]; + p=dump; + for(int i=0;i