Finished telnet sessions
This commit is contained in:
parent
5174b7af66
commit
3a2b52a619
@ -5,11 +5,14 @@ v0.39.9 29-Jan-2004
|
|||||||
general:
|
general:
|
||||||
Changed first time installation to install mbcico itself again
|
Changed first time installation to install mbcico itself again
|
||||||
to handle incoming telnet sessions at port 60177. The program
|
to handle incoming telnet sessions at port 60177. The program
|
||||||
mbtelind is obsolete, this was a temporary hack.
|
mbtelind is obsolete, this was a temporary hack. Change your
|
||||||
|
inetd or xinetd configuration for itn (tfido) calls.
|
||||||
|
See the documentation of mbcico how to do this.
|
||||||
|
|
||||||
mbcico:
|
mbcico:
|
||||||
Added experimental code for telnet outbound connections. This
|
Added telnet input and output filters so we can now call and
|
||||||
code is not compiled by default so don't worry or bother.
|
answer telnet (ITN) sessions. We don't need mbtelind anymore
|
||||||
|
to handle incoming calls.
|
||||||
|
|
||||||
mbsetup:
|
mbsetup:
|
||||||
Clearing the working message is now only done by the keyboard
|
Clearing the working message is now only done by the keyboard
|
||||||
|
@ -49,6 +49,8 @@ clean:
|
|||||||
install: all
|
install: all
|
||||||
${INSTALL} -c -s -g ${GROUP} -o ${OWNER} -m 4751 mbcico ${BINDIR}
|
${INSTALL} -c -s -g ${GROUP} -o ${OWNER} -m 4751 mbcico ${BINDIR}
|
||||||
${INSTALL} -c -s -g ${GROUP} -o ${OWNER} -m 0755 mbout ${BINDIR}
|
${INSTALL} -c -s -g ${GROUP} -o ${OWNER} -m 0755 mbout ${BINDIR}
|
||||||
|
@rm -f ${BINDIR}/mbtelind
|
||||||
|
@rm -f ${BINDIR}/mbtelout
|
||||||
|
|
||||||
mbcico: ${MBCICO_OBJS} ${LIBS}
|
mbcico: ${MBCICO_OBJS} ${LIBS}
|
||||||
${CC} -o mbcico ${MBCICO_OBJS} ${LDFLAGS} ${LIBS}
|
${CC} -o mbcico ${MBCICO_OBJS} ${LDFLAGS} ${LIBS}
|
||||||
@ -105,7 +107,7 @@ emsidat.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/reco
|
|||||||
filelist.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h ../lib/nodelist.h config.h session.h filelist.h
|
filelist.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h ../lib/nodelist.h config.h session.h filelist.h
|
||||||
openfile.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/clcomm.h ../lib/common.h ../lib/users.h ../lib/records.h config.h lutil.h openfile.h
|
openfile.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/clcomm.h ../lib/common.h ../lib/users.h ../lib/records.h config.h lutil.h openfile.h
|
||||||
openport.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h ulock.h ttyio.h mbcico.h openport.h
|
openport.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h ulock.h ttyio.h mbcico.h openport.h
|
||||||
opentcp.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/dbnode.h session.h ttyio.h openport.h telnet.h opentcp.h
|
opentcp.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/dbnode.h session.h ttyio.h openport.h opentcp.h
|
||||||
rdoptions.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/dbnode.h session.h config.h
|
rdoptions.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/dbnode.h session.h config.h
|
||||||
yoohoo.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h ../lib/nodelist.h ../lib/dbnode.h ../lib/mberrors.h statetbl.h ttyio.h session.h config.h emsi.h hydra.h rdoptions.h wazoo.h dietifna.h yoohoo.h inbound.h
|
yoohoo.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h ../lib/nodelist.h ../lib/dbnode.h ../lib/mberrors.h statetbl.h ttyio.h session.h config.h emsi.h hydra.h rdoptions.h wazoo.h dietifna.h yoohoo.h inbound.h
|
||||||
recvbark.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ttyio.h session.h statetbl.h recvbark.h respfreq.h filelist.h
|
recvbark.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ttyio.h session.h statetbl.h recvbark.h respfreq.h filelist.h
|
||||||
@ -118,7 +120,7 @@ filetime.o: ../config.h ../lib/libs.h filetime.h
|
|||||||
ftsc.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/mberrors.h session.h ttyio.h statetbl.h config.h ftsc.h rdoptions.h recvbark.h filelist.h sendbark.h respfreq.h xmrecv.h xmsend.h inbound.h
|
ftsc.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/mberrors.h session.h ttyio.h statetbl.h config.h ftsc.h rdoptions.h recvbark.h filelist.h sendbark.h respfreq.h xmrecv.h xmsend.h inbound.h
|
||||||
atoul.o: ../config.h ../lib/libs.h atoul.h
|
atoul.o: ../config.h ../lib/libs.h atoul.h
|
||||||
portsel.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h portsel.h
|
portsel.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h portsel.h
|
||||||
telnet.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/dbnode.h telnet.h
|
telnet.o: ../config.h ../lib/libs.h ../lib/clcomm.h ../lib/mberrors.h telnet.h
|
||||||
ttyio.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ttyio.h lutil.h
|
ttyio.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ttyio.h lutil.h
|
||||||
lutil.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h lutil.h
|
lutil.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h lutil.h
|
||||||
scanout.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbftn.h config.h scanout.h lutil.h
|
scanout.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbftn.h config.h scanout.h lutil.h
|
||||||
@ -131,6 +133,4 @@ mbcico.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/recor
|
|||||||
outstat.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbftn.h ../lib/mberrors.h scanout.h callstat.h outstat.h
|
outstat.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbftn.h ../lib/mberrors.h scanout.h callstat.h outstat.h
|
||||||
nlinfo.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h nlinfo.h
|
nlinfo.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h nlinfo.h
|
||||||
mbout.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbftn.h ../lib/mberrors.h outstat.h nlinfo.h
|
mbout.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbftn.h ../lib/mberrors.h outstat.h nlinfo.h
|
||||||
mbtelind.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/mberrors.h mbtelind.h
|
|
||||||
mbtelout.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/mberrors.h mbtelout.h
|
|
||||||
# End of generated dependencies
|
# End of generated dependencies
|
||||||
|
@ -181,11 +181,9 @@ int call(faddr *addr)
|
|||||||
tcp_mode = TCPMODE_IBN;
|
tcp_mode = TCPMODE_IBN;
|
||||||
} else if (strcmp(protocol, "fido") == 0) {
|
} else if (strcmp(protocol, "fido") == 0) {
|
||||||
tcp_mode = TCPMODE_IFC;
|
tcp_mode = TCPMODE_IFC;
|
||||||
#ifdef USE_EXPERIMENT
|
|
||||||
} else if (strcmp(protocol, "telnet") == 0) {
|
} else if (strcmp(protocol, "telnet") == 0) {
|
||||||
tcp_mode = TCPMODE_ITN;
|
tcp_mode = TCPMODE_ITN;
|
||||||
telnet = TRUE;
|
telnet = TRUE;
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
Syslog('+', "No common TCP/IP protocols for node %s", nlent->name);
|
Syslog('+', "No common TCP/IP protocols for node %s", nlent->name);
|
||||||
free(inetaddr);
|
free(inetaddr);
|
||||||
|
@ -369,17 +369,6 @@ int main(int argc, char *argv[])
|
|||||||
/*
|
/*
|
||||||
* Slave (answer) mode
|
* Slave (answer) mode
|
||||||
*/
|
*/
|
||||||
#ifdef USE_EXPERIMENT
|
|
||||||
if (telnet) {
|
|
||||||
Syslog('-', "Will use experimental telnet code");
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (telnet) {
|
|
||||||
WriteError("Answering calls with the \"-t itn\" option no longer supported");
|
|
||||||
WriteError("Install mbtelind to answer incoming telnet calls");
|
|
||||||
die(MBERR_COMMANDLINE);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (!answermode && tcp_mode == TCPMODE_IBN)
|
if (!answermode && tcp_mode == TCPMODE_IBN)
|
||||||
answermode = xstrcpy((char *)"ibn");
|
answermode = xstrcpy((char *)"ibn");
|
||||||
rc = maxrc = answer(answermode);
|
rc = maxrc = answer(answermode);
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Purpose ...............: Fidonet mailer
|
* Purpose ...............: Fidonet mailer
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2003
|
* Copyright (C) 1997-2004
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -238,7 +238,7 @@ int cookedport(void)
|
|||||||
{
|
{
|
||||||
Syslog('t', "SIGHUP => SIG_IGN");
|
Syslog('t', "SIGHUP => SIG_IGN");
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
Syslog('t', "SIGHUP => SIG_IGN");
|
Syslog('t', "SIGPIPE => SIG_IGN");
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
if (isatty(0))
|
if (isatty(0))
|
||||||
return tty_cooked();
|
return tty_cooked();
|
||||||
|
159
mbcico/opentcp.c
159
mbcico/opentcp.c
@ -40,7 +40,6 @@
|
|||||||
#include "session.h"
|
#include "session.h"
|
||||||
#include "ttyio.h"
|
#include "ttyio.h"
|
||||||
#include "openport.h"
|
#include "openport.h"
|
||||||
#include "telnet.h"
|
|
||||||
#include "opentcp.h"
|
#include "opentcp.h"
|
||||||
|
|
||||||
|
|
||||||
@ -71,11 +70,9 @@ int opentcp(char *name)
|
|||||||
struct servent *se;
|
struct servent *se;
|
||||||
struct hostent *he;
|
struct hostent *he;
|
||||||
struct sockaddr_in server;
|
struct sockaddr_in server;
|
||||||
int a1, a2, a3, a4, rc, Fd, Fdo, GotPort = FALSE;
|
int a1, a2, a3, a4, GotPort = FALSE;
|
||||||
char *errmsg, *portname;
|
char *errmsg, *portname;
|
||||||
short portnum;
|
short portnum;
|
||||||
int input_pipe[2], output_pipe[2];
|
|
||||||
pid_t fpid;
|
|
||||||
|
|
||||||
Syslog('+', "Open TCP connection to \"%s\"", MBSE_SS(name));
|
Syslog('+', "Open TCP connection to \"%s\"", MBSE_SS(name));
|
||||||
|
|
||||||
@ -106,13 +103,11 @@ int opentcp(char *name)
|
|||||||
else
|
else
|
||||||
server.sin_port = htons(FIDOPORT);
|
server.sin_port = htons(FIDOPORT);
|
||||||
break;
|
break;
|
||||||
#ifdef USE_EXPERIMENT
|
|
||||||
case TCPMODE_ITN: if ((se = getservbyname("telnet", "tcp")))
|
case TCPMODE_ITN: if ((se = getservbyname("telnet", "tcp")))
|
||||||
server.sin_port = se->s_port;
|
server.sin_port = se->s_port;
|
||||||
else
|
else
|
||||||
server.sin_port = htons(TELNPORT);
|
server.sin_port = htons(TELNPORT);
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case TCPMODE_IBN: if ((se = getservbyname("binkd", "tcp")))
|
case TCPMODE_IBN: if ((se = getservbyname("binkd", "tcp")))
|
||||||
server.sin_port = se->s_port;
|
server.sin_port = se->s_port;
|
||||||
else
|
else
|
||||||
@ -145,128 +140,32 @@ int opentcp(char *name)
|
|||||||
Syslog('d', "SIGHUP => linedrop()");
|
Syslog('d', "SIGHUP => linedrop()");
|
||||||
signal(SIGHUP, linedrop);
|
signal(SIGHUP, linedrop);
|
||||||
|
|
||||||
#ifdef USE_EXPERIMENT
|
fflush(stdin);
|
||||||
if (tcp_mode == TCPMODE_ITN) {
|
fflush(stdout);
|
||||||
Syslog('s', "Installing telnet filter...");
|
setbuf(stdin,NULL);
|
||||||
|
setbuf(stdout,NULL);
|
||||||
|
close(0);
|
||||||
|
close(1);
|
||||||
|
|
||||||
/*
|
if ((fd = socket(AF_INET,SOCK_STREAM,0)) != 0) {
|
||||||
* Create TCP socket and open
|
WriteError("$Cannot create socket (got %d, expected 0)", fd);
|
||||||
*/
|
open("/dev/null",O_RDONLY);
|
||||||
if ((Fdo = socket(AF_INET,SOCK_STREAM,0)) == -1) {
|
open("/dev/null",O_WRONLY);
|
||||||
WriteError("$Cannot create socket");
|
return -1;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (connect(Fdo,(struct sockaddr *)&server,sizeof(server)) == -1) {
|
|
||||||
Syslog('+', "Cannot connect %s",inet_ntoa(server.sin_addr));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
Syslog('s', "socket %d", Fdo);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Close stdin and stdout so that when we create the pipes to
|
|
||||||
* the telnet filter they get stdin and stdout as file descriptors.
|
|
||||||
*/
|
|
||||||
fflush(stdin);
|
|
||||||
fflush(stdout);
|
|
||||||
setbuf(stdin,NULL);
|
|
||||||
setbuf(stdout, NULL);
|
|
||||||
close(0);
|
|
||||||
close(1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create output pipe and start output filter.
|
|
||||||
*/
|
|
||||||
if ((rc = pipe(output_pipe)) == -1) {
|
|
||||||
WriteError("$could not create output_pipe");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
fpid = fork();
|
|
||||||
switch (fpid) {
|
|
||||||
case -1: WriteError("fork for telout_filter failed");
|
|
||||||
return -1;
|
|
||||||
case 0: if (close(output_pipe[1]) == -1) {
|
|
||||||
WriteError("$error close output_pipe[1]");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
telout_filter(output_pipe[0], Fdo);
|
|
||||||
/* NOT REACHED */
|
|
||||||
}
|
|
||||||
if (close(output_pipe[0] == -1)) {
|
|
||||||
WriteError("$error close output_pipe[0]");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
Syslog('s', "telout_filter forked with pid %d", fpid);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create input pipe and start input filter
|
|
||||||
*/
|
|
||||||
if ((rc = pipe(input_pipe)) == -1) {
|
|
||||||
WriteError("$could not create input_pipe");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
fpid = fork();
|
|
||||||
switch (fpid) {
|
|
||||||
case -1: WriteError("fork for telin_filter failed");
|
|
||||||
return -1;
|
|
||||||
case 0: if (close(input_pipe[0]) == -1) {
|
|
||||||
WriteError("$error close input_pipe[0]");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
telin_filter(input_pipe[1], Fdo);
|
|
||||||
/* NOT REACHED */
|
|
||||||
}
|
|
||||||
if (close(input_pipe[1]) == -1) {
|
|
||||||
WriteError("$error close input_pipe[1]");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
Syslog('s', "telin_filter forked with pid %d", fpid);
|
|
||||||
|
|
||||||
Syslog('s', "stdout = %d", output_pipe[1]);
|
|
||||||
Syslog('s', "stdin = %d", input_pipe[0]);
|
|
||||||
|
|
||||||
if ((input_pipe[0] != 0) || (output_pipe[1] != 1)) {
|
|
||||||
WriteError("Failed to create pipes on stdin and stdout");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Syslog('+', "Telnet I/O filters installed");
|
|
||||||
telnet_init(Fdo); /* Do we need that as originating system? */
|
|
||||||
f_flags=0;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Transparant 8 bits connection
|
|
||||||
*/
|
|
||||||
fflush(stdin);
|
|
||||||
fflush(stdout);
|
|
||||||
setbuf(stdin,NULL);
|
|
||||||
setbuf(stdout,NULL);
|
|
||||||
close(0);
|
|
||||||
close(1);
|
|
||||||
|
|
||||||
if ((Fd = socket(AF_INET,SOCK_STREAM,0)) != 0) {
|
|
||||||
WriteError("$Cannot create socket (got %d, expected 0)", Fd);
|
|
||||||
open("/dev/null",O_RDONLY);
|
|
||||||
open("/dev/null",O_WRONLY);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (dup(Fd) != 1) {
|
|
||||||
WriteError("$Cannot dup socket");
|
|
||||||
open("/dev/null",O_WRONLY);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
clearerr(stdin);
|
|
||||||
clearerr(stdout);
|
|
||||||
if (connect(Fd,(struct sockaddr *)&server,sizeof(server)) == -1) {
|
|
||||||
Syslog('+', "Cannot connect %s",inet_ntoa(server.sin_addr));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
f_flags=0;
|
|
||||||
#ifdef USE_EXPERIMENT
|
|
||||||
}
|
}
|
||||||
#endif
|
if (dup(fd) != 1) {
|
||||||
|
WriteError("$Cannot dup socket");
|
||||||
|
open("/dev/null",O_WRONLY);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
clearerr(stdin);
|
||||||
|
clearerr(stdout);
|
||||||
|
if (connect(fd,(struct sockaddr *)&server,sizeof(server)) == -1) {
|
||||||
|
Syslog('+', "Cannot connect %s",inet_ntoa(server.sin_addr));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
f_flags=0;
|
||||||
|
|
||||||
Syslog('+', "Established %s/TCP connection with %s, port %d",
|
Syslog('+', "Established %s/TCP connection with %s, port %d",
|
||||||
(tcp_mode == TCPMODE_IFC) ? "IFC":(tcp_mode == TCPMODE_ITN) ?"ITN":(tcp_mode == TCPMODE_IBN) ? "IBN":"Unknown",
|
(tcp_mode == TCPMODE_IFC) ? "IFC":(tcp_mode == TCPMODE_ITN) ?"ITN":(tcp_mode == TCPMODE_IBN) ? "IBN":"Unknown",
|
||||||
@ -287,14 +186,6 @@ void closetcp(void)
|
|||||||
if (!tcp_is_open)
|
if (!tcp_is_open)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef USE_EXPERIMENT
|
|
||||||
if (tcp_mode == TCPMODE_ITN) {
|
|
||||||
/*
|
|
||||||
* Check if telout thread is running
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
shutdown(fd, 2);
|
shutdown(fd, 2);
|
||||||
Syslog('d', "SIGHUP => SIG_IGN");
|
Syslog('d', "SIGHUP => SIG_IGN");
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
@ -87,10 +87,8 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
{
|
{
|
||||||
int rc = MBERR_OK, addrlen = sizeof(struct sockaddr_in);
|
int rc = MBERR_OK, addrlen = sizeof(struct sockaddr_in);
|
||||||
fa_list *tmpl;
|
fa_list *tmpl;
|
||||||
#ifdef USE_EXPERIMENT
|
int Fdo = -1, input_pipe[2], output_pipe[2];
|
||||||
int Fdo, input_pipe[2], output_pipe[2];
|
pid_t ipid, opid;
|
||||||
pid_t fpid;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
session_flags = 0;
|
session_flags = 0;
|
||||||
type = tp;
|
type = tp;
|
||||||
@ -115,9 +113,9 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
session_flags |= SESSION_TCP;
|
session_flags |= SESSION_TCP;
|
||||||
#ifdef USE_EXPERIMENT
|
|
||||||
if ((tcp_mode == TCPMODE_ITN) && (role == 0)) {
|
if (tcp_mode == TCPMODE_ITN) {
|
||||||
Syslog('-', "Will need to install telnet receiver thread");
|
Syslog('s', "Installing telnet filter...");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First make sure the current input socket gets a new file descriptor
|
* First make sure the current input socket gets a new file descriptor
|
||||||
@ -144,8 +142,8 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
WriteError("$could not create output_pipe");
|
WriteError("$could not create output_pipe");
|
||||||
die(MBERR_TTYIO_ERROR);
|
die(MBERR_TTYIO_ERROR);
|
||||||
}
|
}
|
||||||
fpid = fork();
|
opid = fork();
|
||||||
switch (fpid) {
|
switch (opid) {
|
||||||
case -1: WriteError("fork for telout_filter failed");
|
case -1: WriteError("fork for telout_filter failed");
|
||||||
die(MBERR_TTYIO_ERROR);
|
die(MBERR_TTYIO_ERROR);
|
||||||
case 0: if (close(output_pipe[1]) == -1) {
|
case 0: if (close(output_pipe[1]) == -1) {
|
||||||
@ -159,7 +157,7 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
WriteError("$error close output_pipe[0]");
|
WriteError("$error close output_pipe[0]");
|
||||||
die(MBERR_TTYIO_ERROR);
|
die(MBERR_TTYIO_ERROR);
|
||||||
}
|
}
|
||||||
Syslog('s', "telout_filter forked with pid %d", fpid);
|
Syslog('s', "telout_filter forked with pid %d", opid);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create input pipe and start input filter
|
* Create input pipe and start input filter
|
||||||
@ -168,8 +166,8 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
WriteError("$could not create input_pipe");
|
WriteError("$could not create input_pipe");
|
||||||
die(MBERR_TTYIO_ERROR);
|
die(MBERR_TTYIO_ERROR);
|
||||||
}
|
}
|
||||||
fpid = fork();
|
ipid = fork();
|
||||||
switch (fpid) {
|
switch (ipid) {
|
||||||
case -1: WriteError("fork for telin_filter failed");
|
case -1: WriteError("fork for telin_filter failed");
|
||||||
die(MBERR_TTYIO_ERROR);
|
die(MBERR_TTYIO_ERROR);
|
||||||
case 0: if (close(input_pipe[0]) == -1) {
|
case 0: if (close(input_pipe[0]) == -1) {
|
||||||
@ -183,7 +181,7 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
WriteError("$error close input_pipe[1]");
|
WriteError("$error close input_pipe[1]");
|
||||||
die(MBERR_TTYIO_ERROR);
|
die(MBERR_TTYIO_ERROR);
|
||||||
}
|
}
|
||||||
Syslog('s', "telin_filter forked with pid %d", fpid);
|
Syslog('s', "telin_filter forked with pid %d", ipid);
|
||||||
|
|
||||||
Syslog('s', "stdout = %d", output_pipe[1]);
|
Syslog('s', "stdout = %d", output_pipe[1]);
|
||||||
Syslog('s', "stdin = %d", input_pipe[0]);
|
Syslog('s', "stdin = %d", input_pipe[0]);
|
||||||
@ -195,7 +193,6 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
Syslog('+', "Telnet I/O filters installed");
|
Syslog('+', "Telnet I/O filters installed");
|
||||||
telnet_init(Fdo);
|
telnet_init(Fdo);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data)
|
if (data)
|
||||||
@ -265,6 +262,21 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
putstatus(tmpl->addr, 0, 0);
|
putstatus(tmpl->addr, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the socket for the telnet filter is open, close it so that the telnet filters exit.
|
||||||
|
* After that wait a little while to let the filter childs die before the main program
|
||||||
|
* does, else we get zombies.
|
||||||
|
*/
|
||||||
|
if (Fdo != -1) {
|
||||||
|
Syslog('s', "shutdown filter sockets and stdio");
|
||||||
|
shutdown(Fdo, 2);
|
||||||
|
close(0);
|
||||||
|
close(1);
|
||||||
|
close(output_pipe[1]);
|
||||||
|
close(input_pipe[0]);
|
||||||
|
msleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
tidy_falist(&remote);
|
tidy_falist(&remote);
|
||||||
if (data)
|
if (data)
|
||||||
free(data);
|
free(data);
|
||||||
|
@ -30,13 +30,8 @@
|
|||||||
|
|
||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
#include "../lib/libs.h"
|
#include "../lib/libs.h"
|
||||||
#include "../lib/structs.h"
|
|
||||||
#include "../lib/users.h"
|
|
||||||
#include "../lib/records.h"
|
|
||||||
#include "../lib/common.h"
|
|
||||||
#include "../lib/clcomm.h"
|
#include "../lib/clcomm.h"
|
||||||
#include "../lib/nodelist.h"
|
#include "../lib/mberrors.h"
|
||||||
#include "../lib/dbnode.h"
|
|
||||||
#include "telnet.h"
|
#include "telnet.h"
|
||||||
|
|
||||||
|
|
||||||
@ -45,8 +40,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_EXPERIMENT
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send options to the remote.
|
* Send options to the remote.
|
||||||
@ -106,7 +99,6 @@ void telout_filter(int fdi, int fdo)
|
|||||||
while ((rc = read(fdi, &ch, 1)) > 0) {
|
while ((rc = read(fdi, &ch, 1)) > 0) {
|
||||||
c = (int)ch & 0xff;
|
c = (int)ch & 0xff;
|
||||||
if (c == IAC) {
|
if (c == IAC) {
|
||||||
Syslog('s', "telout_filter: got IAC sending twice");
|
|
||||||
/*
|
/*
|
||||||
* Escape IAC characters by sending it twice.
|
* Escape IAC characters by sending it twice.
|
||||||
*/
|
*/
|
||||||
@ -114,11 +106,14 @@ void telout_filter(int fdi, int fdo)
|
|||||||
}
|
}
|
||||||
if ((rc = write(fdo, &ch, 1)) == -1) {
|
if ((rc = write(fdo, &ch, 1)) == -1) {
|
||||||
Syslog('s', "$telout_filter: write failed");
|
Syslog('s', "$telout_filter: write failed");
|
||||||
exit(1);
|
exit(MBERR_TTYIO_ERROR);
|
||||||
}
|
}
|
||||||
|
tcflush(fdo, TCOFLUSH);
|
||||||
}
|
}
|
||||||
|
|
||||||
Syslog('s', "$telout_filter: finished rc=%d", rc);
|
tcflush(fdi, TCIFLUSH);
|
||||||
|
tcflush(fdo, TCOFLUSH);
|
||||||
|
Syslog('s', "telout_filter: finished rc=%d", rc);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,12 +131,12 @@ void telin_filter(int fdo, int fdi)
|
|||||||
|
|
||||||
while ((rc = read(fdi, &ch, 1)) > 0) {
|
while ((rc = read(fdi, &ch, 1)) > 0) {
|
||||||
c = (int)ch & 0xff;
|
c = (int)ch & 0xff;
|
||||||
// Syslog('s', "telin_filter: ch=%s", printablec(c));
|
|
||||||
if (c == IAC) {
|
if (c == IAC) {
|
||||||
Syslog('s', "got IAC");
|
|
||||||
if ((read(fdi, &ch, 1) < 0))
|
if ((read(fdi, &ch, 1) < 0))
|
||||||
break;
|
break;
|
||||||
m = (int)ch & 0xff;
|
m = (int)ch & 0xff;
|
||||||
|
|
||||||
switch (m) {
|
switch (m) {
|
||||||
case WILL: read(fdi, &ch, 1);
|
case WILL: read(fdi, &ch, 1);
|
||||||
m = (int)ch & 0xff;
|
m = (int)ch & 0xff;
|
||||||
@ -165,22 +160,25 @@ void telin_filter(int fdo, int fdi)
|
|||||||
break;
|
break;
|
||||||
case IAC: ch = (char)m;
|
case IAC: ch = (char)m;
|
||||||
rc = write(fdo, &ch, 1);
|
rc = write(fdo, &ch, 1);
|
||||||
Syslog('s', "Telnet: got escaped IAC");
|
|
||||||
break;
|
break;
|
||||||
default: Syslog('s', "Telnet: recv IAC %d, not good", m);
|
default: Syslog('s', "Telnet: recv IAC %d, not good", m);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ch = (char)c;
|
ch = (char)c;
|
||||||
if ((rc = write(fdo, &ch, 1)) == -1) {
|
if ((rc = write(fdo, &ch, 1)) == -1) {
|
||||||
Syslog('s', "$telin_filter: write failed");
|
Syslog('s', "$telin_filter: write failed");
|
||||||
exit(1);
|
exit(MBERR_TTYIO_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
tcflush(fdo, TCOFLUSH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tcflush(fdi, TCIFLUSH);
|
||||||
|
tcflush(fdo, TCOFLUSH);
|
||||||
|
|
||||||
Syslog('s', "telin_filter: finished rc=%d", rc);
|
Syslog('s', "telin_filter: finished rc=%d", rc);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -3,10 +3,6 @@
|
|||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#ifdef USE_EXPERIMENT
|
|
||||||
|
|
||||||
// #define MBT_TIMEOUT 500
|
|
||||||
// #define MBT_BUFLEN 8192
|
|
||||||
|
|
||||||
#define TOPT_BIN 0
|
#define TOPT_BIN 0
|
||||||
#define TOPT_ECHO 1
|
#define TOPT_ECHO 1
|
||||||
@ -17,6 +13,5 @@ void telnet_answer(int, int, int);
|
|||||||
void telout_filter(int, int);
|
void telout_filter(int, int);
|
||||||
void telin_filter(int, int);
|
void telin_filter(int, int);
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user