Removed obsolete mbtelind and mbtelout
This commit is contained in:
parent
8fd5458841
commit
5174b7af66
@ -12,7 +12,7 @@ SRCS = zmmisc.c zmrle.c zmrecv.c zmsend.c binkp.c md5b.c \
|
|||||||
filetime.c ftsc.c atoul.c portsel.c telnet.c \
|
filetime.c ftsc.c atoul.c portsel.c telnet.c \
|
||||||
ttyio.c lutil.c scanout.c emsi.c ulock.c \
|
ttyio.c lutil.c scanout.c emsi.c ulock.c \
|
||||||
callstat.c session.c call.c mbcico.c \
|
callstat.c session.c call.c mbcico.c \
|
||||||
outstat.c nlinfo.c mbout.c mbtelind.c mbtelout.c
|
outstat.c nlinfo.c mbout.c
|
||||||
HDRS = zmodem.h binkp.h config.h statetbl.h md5b.h \
|
HDRS = zmodem.h binkp.h config.h statetbl.h md5b.h \
|
||||||
xmsend.h xmrecv.h m7recv.h m7send.h hydra.h inbound.h \
|
xmsend.h xmrecv.h m7recv.h m7send.h hydra.h inbound.h \
|
||||||
answer.h chat.h dial.h dietifna.h emsidat.h filelist.h \
|
answer.h chat.h dial.h dietifna.h emsidat.h filelist.h \
|
||||||
@ -21,7 +21,7 @@ HDRS = zmodem.h binkp.h config.h statetbl.h md5b.h \
|
|||||||
filetime.h ftsc.h atoul.h portsel.h telnet.h \
|
filetime.h ftsc.h atoul.h portsel.h telnet.h \
|
||||||
ttyio.h lutil.h scanout.h emsi.h ulock.h \
|
ttyio.h lutil.h scanout.h emsi.h ulock.h \
|
||||||
callstat.h session.h call.h mbcico.h \
|
callstat.h session.h call.h mbcico.h \
|
||||||
outstat.h nlinfo.h mbtelind.h mbtelout.h
|
outstat.h nlinfo.h
|
||||||
MBCICO_OBJS = zmmisc.o zmrle.o zmrecv.o zmsend.o binkp.o md5b.o \
|
MBCICO_OBJS = zmmisc.o zmrle.o zmrecv.o zmsend.o binkp.o md5b.o \
|
||||||
xmsend.o xmrecv.o m7recv.o m7send.o hydra.o inbound.o \
|
xmsend.o xmrecv.o m7recv.o m7send.o hydra.o inbound.o \
|
||||||
answer.o chat.o dial.o dietifna.o emsidat.o filelist.o \
|
answer.o chat.o dial.o dietifna.o emsidat.o filelist.o \
|
||||||
@ -31,12 +31,10 @@ MBCICO_OBJS = zmmisc.o zmrle.o zmrecv.o zmsend.o binkp.o md5b.o \
|
|||||||
ttyio.o lutil.o scanout.o emsi.o ulock.o \
|
ttyio.o lutil.o scanout.o emsi.o ulock.o \
|
||||||
callstat.o session.o call.o mbcico.o
|
callstat.o session.o call.o mbcico.o
|
||||||
MBOUT_OBJS = outstat.o nlinfo.o mbout.o scanout.o callstat.o
|
MBOUT_OBJS = outstat.o nlinfo.o mbout.o scanout.o callstat.o
|
||||||
MBTELIND_OBJS = mbtelind.o
|
|
||||||
MBTELOUT_OBJS = mbtelout.o
|
|
||||||
LIBS += ../lib/libclcomm.a ../lib/libcommon.a \
|
LIBS += ../lib/libclcomm.a ../lib/libcommon.a \
|
||||||
../lib/libmsgbase.a ../lib/libdbase.a ../lib/libnodelist.a
|
../lib/libmsgbase.a ../lib/libdbase.a ../lib/libnodelist.a
|
||||||
OTHER = Makefile README
|
OTHER = Makefile README
|
||||||
TARGET = mbcico mbout mbtelind mbtelout
|
TARGET = mbcico mbout
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
@ -51,8 +49,6 @@ 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}
|
||||||
${INSTALL} -c -s -g ${GROUP} -o ${OWNER} -m 0755 mbtelind ${BINDIR}
|
|
||||||
${INSTALL} -c -s -g ${GROUP} -o ${OWNER} -m 0755 mbtelout ${BINDIR}
|
|
||||||
|
|
||||||
mbcico: ${MBCICO_OBJS} ${LIBS}
|
mbcico: ${MBCICO_OBJS} ${LIBS}
|
||||||
${CC} -o mbcico ${MBCICO_OBJS} ${LDFLAGS} ${LIBS}
|
${CC} -o mbcico ${MBCICO_OBJS} ${LDFLAGS} ${LIBS}
|
||||||
@ -60,12 +56,6 @@ mbcico: ${MBCICO_OBJS} ${LIBS}
|
|||||||
mbout: ${MBOUT_OBJS} ${LIBS}
|
mbout: ${MBOUT_OBJS} ${LIBS}
|
||||||
${CC} -o mbout ${MBOUT_OBJS} ${LDFLAGS} ${LIBS}
|
${CC} -o mbout ${MBOUT_OBJS} ${LDFLAGS} ${LIBS}
|
||||||
|
|
||||||
mbtelind: ${MBTELIND_OBJS} ${LIBS}
|
|
||||||
${CC} -o mbtelind ${MBTELIND_OBJS} ${LDFLAGS} ${LIBS}
|
|
||||||
|
|
||||||
mbtelout: ${MBTELOUT_OBJS} ${LIBS}
|
|
||||||
${CC} -o mbtelout ${MBTELOUT_OBJS} ${LDFLAGS} ${LIBS}
|
|
||||||
|
|
||||||
filelist: Makefile
|
filelist: Makefile
|
||||||
BASE=`pwd`; \
|
BASE=`pwd`; \
|
||||||
BASE=`basename $${BASE}`; \
|
BASE=`basename $${BASE}`; \
|
||||||
|
@ -1,388 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
* Purpose ...............: Fidonet telnet input proxy daemon
|
|
||||||
*
|
|
||||||
*****************************************************************************
|
|
||||||
* Copyright (C) 1997-2003
|
|
||||||
*
|
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
|
||||||
* Beekmansbos 10
|
|
||||||
* 1971 BV IJmuiden
|
|
||||||
* the Netherlands
|
|
||||||
*
|
|
||||||
* This file is part of MBSE BBS.
|
|
||||||
*
|
|
||||||
* This BBS is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License as published by the
|
|
||||||
* Free Software Foundation; either version 2, or (at your option) any
|
|
||||||
* later version.
|
|
||||||
*
|
|
||||||
* MBSE BBS is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with MBSE BBS; see the file COPYING. If not, write to the Free
|
|
||||||
* Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Simple proxy daemon for ifcico to work with SIO/VMODEM.
|
|
||||||
========================================================
|
|
||||||
Written by: Vadim Zaliva, lord@crocodile.kiev.ua, 2:463/80
|
|
||||||
|
|
||||||
This software is provided ``as is'' without express or implied warranty.
|
|
||||||
Feel free to distribute it.
|
|
||||||
|
|
||||||
Feel free to contact me with improovments request
|
|
||||||
and bug reports.
|
|
||||||
|
|
||||||
Some parts of this code are taken from
|
|
||||||
1. serge terekhov, 2:5000/13@fidonet path for ifmail
|
|
||||||
2. Vadim Kurland, vadim@gu.kiev.ua transl daemon.
|
|
||||||
Thanks them.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../config.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/dbcfg.h"
|
|
||||||
#include "../lib/mberrors.h"
|
|
||||||
#include "mbtelind.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Timeout, less then 10 minutes because we need to keep the connection
|
|
||||||
* with mbtask alive.
|
|
||||||
*/
|
|
||||||
#define MBT_TIMEOUT 500
|
|
||||||
#define MBT_BUFLEN 8192
|
|
||||||
|
|
||||||
|
|
||||||
char *envptr = NULL;
|
|
||||||
time_t t_start, t_end;
|
|
||||||
static int tellen;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void die(int onsig)
|
|
||||||
{
|
|
||||||
signal(onsig, SIG_IGN);
|
|
||||||
|
|
||||||
if (onsig) {
|
|
||||||
if (onsig <= NSIG)
|
|
||||||
WriteError("Terminated on signal %d (%s)", onsig, SigName[onsig]);
|
|
||||||
else
|
|
||||||
Syslog('+', "Terminated with error %d", onsig);
|
|
||||||
}
|
|
||||||
|
|
||||||
t_end = time(NULL);
|
|
||||||
Syslog(' ', "MBTELIND finished in %s", t_elapsed(t_start, t_end));
|
|
||||||
if (envptr)
|
|
||||||
free(envptr);
|
|
||||||
ExitClient(onsig);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int ac, char **av)
|
|
||||||
{
|
|
||||||
struct sockaddr_in peeraddr;
|
|
||||||
int addrlen = sizeof(struct sockaddr_in);
|
|
||||||
char *remote_name = NULL;
|
|
||||||
char *remote_port = NULL;
|
|
||||||
int s; /* socket to remote*/
|
|
||||||
int i;
|
|
||||||
struct hostent *hp;
|
|
||||||
struct servent *sp;
|
|
||||||
struct sockaddr_in server;
|
|
||||||
char *tmp = NULL;
|
|
||||||
struct passwd *pw;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The next trick is to supply a fake environment variable
|
|
||||||
* MBSE_ROOT in case we are started from inetd or mgetty,
|
|
||||||
* this will setup the variable so InitConfig() will work.
|
|
||||||
* The /etc/passwd must point to the correct homedirectory.
|
|
||||||
*/
|
|
||||||
pw = getpwuid(getuid());
|
|
||||||
if (getenv("MBSE_ROOT") == NULL) {
|
|
||||||
envptr = xstrcpy((char *)"MBSE_ROOT=");
|
|
||||||
envptr = xstrcat(envptr, pw->pw_dir);
|
|
||||||
putenv(envptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
InitConfig();
|
|
||||||
t_start = time(NULL);
|
|
||||||
|
|
||||||
InitClient(pw->pw_name, (char *)"mbtelind", CFG.location, CFG.logfile,
|
|
||||||
CFG.util_loglevel, CFG.error_log, CFG.mgrlog, CFG.debuglog);
|
|
||||||
|
|
||||||
Syslog(' ', " ");
|
|
||||||
Syslog(' ', "MBTELIND v%s", VERSION);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Catch all signals we can, and ignore the rest.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < NSIG; i++) {
|
|
||||||
if ((i == SIGINT) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV) || (i == SIGTERM) || (i == SIGKILL)) {
|
|
||||||
signal(i, (void (*))die);
|
|
||||||
} else {
|
|
||||||
signal(i, SIG_IGN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remote_name = xstrcpy((char *)"localhost");
|
|
||||||
remote_port = xstrcpy((char *)"fido");
|
|
||||||
|
|
||||||
if (getpeername(0,(struct sockaddr*)&peeraddr,&addrlen) == 0) {
|
|
||||||
tmp = strdup(inet_ntoa(peeraddr.sin_addr));
|
|
||||||
Syslog('+', "Incoming TCP connection from %s", tmp ? tmp : "Unknown");
|
|
||||||
Syslog('+', "Rerouting to %s:%s", remote_name, remote_port);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tmp)
|
|
||||||
free(tmp);
|
|
||||||
|
|
||||||
if ((sp = getservbyname(remote_port, "tcp")) == NULL) {
|
|
||||||
WriteError("Can't find service: %s", remote_port);
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
die(MBERR_INIT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((s = socket(AF_INET,SOCK_STREAM,0)) == -1) {
|
|
||||||
WriteError("Can't create Internet domain socket");
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
die(MBERR_INIT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((hp = gethostbyname(remote_name)) == NULL) {
|
|
||||||
WriteError("%s - Unknown host", remote_name);
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
die(MBERR_INIT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&server,0,sizeof(server));
|
|
||||||
memcpy((char *)&server.sin_addr,hp->h_addr,hp->h_length);
|
|
||||||
|
|
||||||
server.sin_family=hp->h_addrtype;
|
|
||||||
server.sin_port = sp->s_port;
|
|
||||||
|
|
||||||
if (connect(s,(struct sockaddr *)&server,sizeof(server)) == -1) {
|
|
||||||
WriteError("Can't connect %s", remote_name);
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
die(MBERR_INIT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
telnet_init();
|
|
||||||
|
|
||||||
tmp = calloc(81, sizeof(char ));
|
|
||||||
sprintf(tmp, "mbtelind v%s\r\n", VERSION);
|
|
||||||
telnet_write(tmp, strlen(tmp));
|
|
||||||
free(tmp);
|
|
||||||
|
|
||||||
com_gw(s);
|
|
||||||
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
close(s);
|
|
||||||
die(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void com_gw(int in)
|
|
||||||
{
|
|
||||||
fd_set fds;
|
|
||||||
int n, fdsbits;
|
|
||||||
static struct timeval tout = { MBT_TIMEOUT, 0 };
|
|
||||||
unsigned char buf[MBT_BUFLEN];
|
|
||||||
|
|
||||||
alarm(0);
|
|
||||||
fdsbits = in + 1;
|
|
||||||
|
|
||||||
while (TRUE) {
|
|
||||||
FD_ZERO(& fds);
|
|
||||||
FD_SET (in, &fds);
|
|
||||||
FD_SET (0 , &fds);
|
|
||||||
FD_SET (1 , &fds);
|
|
||||||
|
|
||||||
tout.tv_sec = MBT_TIMEOUT;
|
|
||||||
tout.tv_usec = 0;
|
|
||||||
if ((n = select(fdsbits, &fds, NULL, NULL, &tout)) > 0) {
|
|
||||||
if (FD_ISSET(in, &fds)) {
|
|
||||||
if ((n = read(in, buf, sizeof buf)) > 0) {
|
|
||||||
if (telnet_write(buf, n) < 0) {
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (FD_ISSET(0, &fds)) {
|
|
||||||
if ((n = telnet_read(buf, sizeof buf)) > 0) {
|
|
||||||
if (write(in, buf, n) < 0) goto bad;
|
|
||||||
} else {
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
Nopper();
|
|
||||||
}
|
|
||||||
bad: ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* --- This is an artwork of serge terekhov, 2:5000/13@fidonet :) --- */
|
|
||||||
|
|
||||||
void telnet_answer(int tag, int opt)
|
|
||||||
{
|
|
||||||
char buf[3];
|
|
||||||
char *r = (char *)"???";
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case WILL:
|
|
||||||
r = (char *)"WILL";
|
|
||||||
break;
|
|
||||||
case WONT:
|
|
||||||
r = (char *)"WONT";
|
|
||||||
break;
|
|
||||||
case DO:
|
|
||||||
r = (char *)"DO";
|
|
||||||
break;
|
|
||||||
case DONT:
|
|
||||||
r = (char *)"DONT";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Syslog('s', "Telnet: send %s %d", r, opt);
|
|
||||||
|
|
||||||
buf[0] = IAC;
|
|
||||||
buf[1] = tag;
|
|
||||||
buf[2] = opt;
|
|
||||||
if (write (1, buf, 3) != 3)
|
|
||||||
WriteError("$answer cant send");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int telnet_init(void)
|
|
||||||
{
|
|
||||||
Syslog('s', "telnet_init()");
|
|
||||||
tellen = 0;
|
|
||||||
telnet_answer(DO, TOPT_SUPP);
|
|
||||||
telnet_answer(WILL, TOPT_SUPP);
|
|
||||||
telnet_answer(DO, TOPT_BIN);
|
|
||||||
telnet_answer(WILL, TOPT_BIN);
|
|
||||||
telnet_answer(DO, TOPT_ECHO);
|
|
||||||
telnet_answer(WILL, TOPT_ECHO);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read function for mbtelnetd
|
|
||||||
*/
|
|
||||||
int telnet_read(char *buf, int len)
|
|
||||||
{
|
|
||||||
int n = 0, m;
|
|
||||||
char *q, *p;
|
|
||||||
static char telbuf[4];
|
|
||||||
|
|
||||||
while ((n == 0) && (n = read (0, buf + tellen, MBT_BUFLEN - tellen)) > 0) {
|
|
||||||
|
|
||||||
if (n < 0) {
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tellen) {
|
|
||||||
memcpy(buf, telbuf, tellen);
|
|
||||||
n += tellen;
|
|
||||||
tellen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memchr (buf, IAC, n)) {
|
|
||||||
for (p = q = buf; n--; )
|
|
||||||
if ((m = (unsigned char)*q++) != IAC)
|
|
||||||
*p++ = m;
|
|
||||||
else {
|
|
||||||
if (n < 2) {
|
|
||||||
memcpy (telbuf, q - 1, tellen = n + 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
--n;
|
|
||||||
switch (m = (unsigned char)*q++) {
|
|
||||||
case WILL: m = (unsigned char)*q++; --n;
|
|
||||||
Syslog('s', "Telnet: recv WILL %d", m);
|
|
||||||
if (m != TOPT_BIN && m != TOPT_SUPP && m != TOPT_ECHO)
|
|
||||||
telnet_answer(DONT, m);
|
|
||||||
break;
|
|
||||||
case WONT: m = *q++;
|
|
||||||
--n;
|
|
||||||
Syslog('s', "Telnet: recv WONT %d", m);
|
|
||||||
break;
|
|
||||||
case DO: m = (unsigned char)*q++;
|
|
||||||
--n;
|
|
||||||
Syslog('s', "Telnet: recv DO %d", m);
|
|
||||||
if (m != TOPT_BIN && m != TOPT_SUPP && m != TOPT_ECHO)
|
|
||||||
telnet_answer(WONT, m);
|
|
||||||
break;
|
|
||||||
case DONT: m = (unsigned char)*q++;
|
|
||||||
--n;
|
|
||||||
Syslog('s', "Telnet: recv DONT %d", m);
|
|
||||||
break;
|
|
||||||
case IAC: *p++ = IAC;
|
|
||||||
break;
|
|
||||||
default: Syslog('s', "Telnet: recv IAC %d, not good", m);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
n = p - buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Telnet output filter, IAC characters are escaped.
|
|
||||||
*/
|
|
||||||
int telnet_write(char *buf, int len)
|
|
||||||
{
|
|
||||||
char *q;
|
|
||||||
int k, l;
|
|
||||||
|
|
||||||
l = len;
|
|
||||||
while ((len > 0) && (q = memchr(buf, IAC, len))) {
|
|
||||||
k = (q - buf) + 1;
|
|
||||||
if ((write(1, buf, k) != k) || (write(1, q, 1) != 1)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
buf += k;
|
|
||||||
len -= k;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((len > 0) && write(1, buf, len) != len) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
#ifndef _MBTELIND_H
|
|
||||||
#define _MBTELIND_H
|
|
||||||
|
|
||||||
/* $Id$ */
|
|
||||||
|
|
||||||
#define MBT_WILL 251
|
|
||||||
#define MBT_WONT 252
|
|
||||||
#define MBT_DO 253
|
|
||||||
#define MBT_DONT 254
|
|
||||||
#define MBT_IAC 255
|
|
||||||
|
|
||||||
#define TOPT_BIN 0
|
|
||||||
#define TOPT_ECHO 1
|
|
||||||
#define TOPT_SUPP 3
|
|
||||||
|
|
||||||
|
|
||||||
void die(int);
|
|
||||||
void com_gw(int);
|
|
||||||
void telnet_answer(int, int);
|
|
||||||
int telnet_init(void);
|
|
||||||
int telnet_read(char *, int);
|
|
||||||
int telnet_write(char *, int);
|
|
||||||
int telnet_buffer(char *, int);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,370 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
* Purpose ...............: Fidonet telnet output proxy
|
|
||||||
*
|
|
||||||
*****************************************************************************
|
|
||||||
* Copyright (C) 1997-2003
|
|
||||||
*
|
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
|
||||||
* Beekmansbos 10
|
|
||||||
* 1971 BV IJmuiden
|
|
||||||
* the Netherlands
|
|
||||||
*
|
|
||||||
* This file is part of MBSE BBS.
|
|
||||||
*
|
|
||||||
* This BBS is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License as published by the
|
|
||||||
* Free Software Foundation; either version 2, or (at your option) any
|
|
||||||
* later version.
|
|
||||||
*
|
|
||||||
* MBSE BBS is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with MBSE BBS; see the file COPYING. If not, write to the Free
|
|
||||||
* Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#include "../config.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/dbcfg.h"
|
|
||||||
#include "../lib/mberrors.h"
|
|
||||||
#include "mbtelout.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Timeout, less then 10 minutes because we need to keep the connection
|
|
||||||
* with mbtask alive.
|
|
||||||
*/
|
|
||||||
#define MBT_TIMEOUT 500
|
|
||||||
#define MBT_BUFLEN 8192
|
|
||||||
|
|
||||||
|
|
||||||
char *envptr = NULL;
|
|
||||||
time_t t_start, t_end;
|
|
||||||
static int tellen;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void die(int onsig)
|
|
||||||
{
|
|
||||||
signal(onsig, SIG_IGN);
|
|
||||||
|
|
||||||
if (onsig) {
|
|
||||||
if (onsig <= NSIG)
|
|
||||||
WriteError("Terminated on signal %d (%s)", onsig, SigName[onsig]);
|
|
||||||
else
|
|
||||||
Syslog('+', "Terminated with error %d", onsig);
|
|
||||||
}
|
|
||||||
|
|
||||||
t_end = time(NULL);
|
|
||||||
Syslog(' ', "MBTELOUT finished in %s", t_elapsed(t_start, t_end));
|
|
||||||
if (envptr)
|
|
||||||
free(envptr);
|
|
||||||
ExitClient(onsig);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int ac, char **av)
|
|
||||||
{
|
|
||||||
struct sockaddr_in peeraddr;
|
|
||||||
int addrlen = sizeof(struct sockaddr_in);
|
|
||||||
char *remote_name = NULL;
|
|
||||||
char *remote_port = NULL;
|
|
||||||
int s; /* socket to remote*/
|
|
||||||
int i;
|
|
||||||
struct hostent *hp;
|
|
||||||
struct servent *sp;
|
|
||||||
struct sockaddr_in server;
|
|
||||||
char *tmp = NULL;
|
|
||||||
struct passwd *pw;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The next trick is to supply a fake environment variable
|
|
||||||
* MBSE_ROOT in case we are started from inetd or mgetty,
|
|
||||||
* this will setup the variable so InitConfig() will work.
|
|
||||||
* The /etc/passwd must point to the correct homedirectory.
|
|
||||||
*/
|
|
||||||
pw = getpwuid(getuid());
|
|
||||||
if (getenv("MBSE_ROOT") == NULL) {
|
|
||||||
envptr = xstrcpy((char *)"MBSE_ROOT=");
|
|
||||||
envptr = xstrcat(envptr, pw->pw_dir);
|
|
||||||
putenv(envptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
InitConfig();
|
|
||||||
t_start = time(NULL);
|
|
||||||
|
|
||||||
InitClient(pw->pw_name, (char *)"mbtelout", CFG.location, CFG.logfile,
|
|
||||||
CFG.util_loglevel, CFG.error_log, CFG.mgrlog, CFG.debuglog);
|
|
||||||
|
|
||||||
Syslog(' ', " ");
|
|
||||||
Syslog(' ', "MBTELOUT v%s", VERSION);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Catch all signals we can, and ignore the rest.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < NSIG; i++) {
|
|
||||||
if ((i == SIGINT) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV) || (i == SIGTERM) || (i == SIGKILL)) {
|
|
||||||
signal(i, (void (*))die);
|
|
||||||
} else {
|
|
||||||
signal(i, SIG_IGN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remote_name = xstrcpy((char *)"localhost");
|
|
||||||
remote_port = xstrcpy((char *)"fido");
|
|
||||||
|
|
||||||
if (getpeername(0,(struct sockaddr*)&peeraddr,&addrlen) == 0) {
|
|
||||||
tmp = strdup(inet_ntoa(peeraddr.sin_addr));
|
|
||||||
Syslog('+', "Incoming TCP connection from %s", tmp ? tmp : "Unknown");
|
|
||||||
Syslog('+', "Rerouting to %s:%s", remote_name, remote_port);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tmp)
|
|
||||||
free(tmp);
|
|
||||||
|
|
||||||
if ((sp = getservbyname(remote_port, "tcp")) == NULL) {
|
|
||||||
WriteError("Can't find service: %s", remote_port);
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
die(MBERR_INIT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((s = socket(AF_INET,SOCK_STREAM,0)) == -1) {
|
|
||||||
WriteError("Can't create Internet domain socket");
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
die(MBERR_INIT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((hp = gethostbyname(remote_name)) == NULL) {
|
|
||||||
WriteError("%s - Unknown host", remote_name);
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
die(MBERR_INIT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&server,0,sizeof(server));
|
|
||||||
memcpy((char *)&server.sin_addr,hp->h_addr,hp->h_length);
|
|
||||||
|
|
||||||
server.sin_family=hp->h_addrtype;
|
|
||||||
server.sin_port = sp->s_port;
|
|
||||||
|
|
||||||
if (connect(s,(struct sockaddr *)&server,sizeof(server)) == -1) {
|
|
||||||
WriteError("Can't connect %s", remote_name);
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
die(MBERR_INIT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
telnet_init();
|
|
||||||
|
|
||||||
tmp = calloc(81, sizeof(char ));
|
|
||||||
sprintf(tmp, "mbtelout v%s\r\n", VERSION);
|
|
||||||
telnet_write(tmp, strlen(tmp));
|
|
||||||
free(tmp);
|
|
||||||
|
|
||||||
com_gw(s);
|
|
||||||
|
|
||||||
free(remote_name);
|
|
||||||
free(remote_port);
|
|
||||||
close(s);
|
|
||||||
die(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void com_gw(int in)
|
|
||||||
{
|
|
||||||
fd_set fds;
|
|
||||||
int n, fdsbits;
|
|
||||||
static struct timeval tout = { MBT_TIMEOUT, 0 };
|
|
||||||
unsigned char buf[MBT_BUFLEN];
|
|
||||||
|
|
||||||
alarm(0);
|
|
||||||
fdsbits = in + 1;
|
|
||||||
|
|
||||||
while (TRUE) {
|
|
||||||
FD_ZERO(& fds);
|
|
||||||
FD_SET (in, &fds);
|
|
||||||
FD_SET (0 , &fds);
|
|
||||||
FD_SET (1 , &fds);
|
|
||||||
|
|
||||||
tout.tv_sec = MBT_TIMEOUT;
|
|
||||||
tout.tv_usec = 0;
|
|
||||||
if ((n = select(fdsbits, &fds, NULL, NULL, &tout)) > 0) {
|
|
||||||
if (FD_ISSET(in, &fds)) {
|
|
||||||
if ((n = read(in, buf, sizeof buf)) > 0) {
|
|
||||||
if (telnet_write(buf, n) < 0) {
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (FD_ISSET(0, &fds)) {
|
|
||||||
if ((n = telnet_read(buf, sizeof buf)) > 0) {
|
|
||||||
if (write(in, buf, n) < 0) goto bad;
|
|
||||||
} else {
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
Nopper();
|
|
||||||
}
|
|
||||||
bad: ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* --- This is an artwork of serge terekhov, 2:5000/13@fidonet :) --- */
|
|
||||||
|
|
||||||
void telnet_answer(int tag, int opt)
|
|
||||||
{
|
|
||||||
char buf[3];
|
|
||||||
char *r = (char *)"???";
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case WILL:
|
|
||||||
r = (char *)"WILL";
|
|
||||||
break;
|
|
||||||
case WONT:
|
|
||||||
r = (char *)"WONT";
|
|
||||||
break;
|
|
||||||
case DO:
|
|
||||||
r = (char *)"DO";
|
|
||||||
break;
|
|
||||||
case DONT:
|
|
||||||
r = (char *)"DONT";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Syslog('s', "Telnet: send %s %d", r, opt);
|
|
||||||
|
|
||||||
buf[0] = IAC;
|
|
||||||
buf[1] = tag;
|
|
||||||
buf[2] = opt;
|
|
||||||
if (write (1, buf, 3) != 3)
|
|
||||||
WriteError("$answer cant send");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int telnet_init(void)
|
|
||||||
{
|
|
||||||
Syslog('s', "telnet_init()");
|
|
||||||
tellen = 0;
|
|
||||||
telnet_answer(DO, TOPT_SUPP);
|
|
||||||
telnet_answer(WILL, TOPT_SUPP);
|
|
||||||
telnet_answer(DO, TOPT_BIN);
|
|
||||||
telnet_answer(WILL, TOPT_BIN);
|
|
||||||
telnet_answer(DO, TOPT_ECHO);
|
|
||||||
telnet_answer(WILL, TOPT_ECHO);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read function for mbtelnetd
|
|
||||||
*/
|
|
||||||
int telnet_read(char *buf, int len)
|
|
||||||
{
|
|
||||||
int n = 0, m;
|
|
||||||
char *q, *p;
|
|
||||||
static char telbuf[4];
|
|
||||||
|
|
||||||
while ((n == 0) && (n = read (0, buf + tellen, MBT_BUFLEN - tellen)) > 0) {
|
|
||||||
|
|
||||||
if (n < 0) {
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tellen) {
|
|
||||||
memcpy(buf, telbuf, tellen);
|
|
||||||
n += tellen;
|
|
||||||
tellen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memchr (buf, IAC, n)) {
|
|
||||||
for (p = q = buf; n--; )
|
|
||||||
if ((m = (unsigned char)*q++) != IAC)
|
|
||||||
*p++ = m;
|
|
||||||
else {
|
|
||||||
if (n < 2) {
|
|
||||||
memcpy (telbuf, q - 1, tellen = n + 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
--n;
|
|
||||||
switch (m = (unsigned char)*q++) {
|
|
||||||
case WILL: m = (unsigned char)*q++; --n;
|
|
||||||
Syslog('s', "Telnet: recv WILL %d", m);
|
|
||||||
if (m != TOPT_BIN && m != TOPT_SUPP && m != TOPT_ECHO)
|
|
||||||
telnet_answer(DONT, m);
|
|
||||||
break;
|
|
||||||
case WONT: m = *q++;
|
|
||||||
--n;
|
|
||||||
Syslog('s', "Telnet: recv WONT %d", m);
|
|
||||||
break;
|
|
||||||
case DO: m = (unsigned char)*q++;
|
|
||||||
--n;
|
|
||||||
Syslog('s', "Telnet: recv DO %d", m);
|
|
||||||
if (m != TOPT_BIN && m != TOPT_SUPP && m != TOPT_ECHO)
|
|
||||||
telnet_answer(WONT, m);
|
|
||||||
break;
|
|
||||||
case DONT: m = (unsigned char)*q++;
|
|
||||||
--n;
|
|
||||||
Syslog('s', "Telnet: recv DONT %d", m);
|
|
||||||
break;
|
|
||||||
case IAC: *p++ = IAC;
|
|
||||||
break;
|
|
||||||
default: Syslog('s', "Telnet: recv IAC %d, not good", m);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
n = p - buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Telnet output filter, IAC characters are escaped.
|
|
||||||
*/
|
|
||||||
int telnet_write(char *buf, int len)
|
|
||||||
{
|
|
||||||
char *q;
|
|
||||||
int k, l;
|
|
||||||
|
|
||||||
l = len;
|
|
||||||
while ((len > 0) && (q = memchr(buf, IAC, len))) {
|
|
||||||
k = (q - buf) + 1;
|
|
||||||
if ((write(1, buf, k) != k) || (write(1, q, 1) != 1)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
buf += k;
|
|
||||||
len -= k;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((len > 0) && write(1, buf, len) != len) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
#ifndef _MBTELOUT_H
|
|
||||||
#define _MBTELOUT_H
|
|
||||||
|
|
||||||
/* $Id$ */
|
|
||||||
|
|
||||||
#define MBT_WILL 251
|
|
||||||
#define MBT_WONT 252
|
|
||||||
#define MBT_DO 253
|
|
||||||
#define MBT_DONT 254
|
|
||||||
#define MBT_IAC 255
|
|
||||||
|
|
||||||
#define TOPT_BIN 0
|
|
||||||
#define TOPT_ECHO 1
|
|
||||||
#define TOPT_SUPP 3
|
|
||||||
|
|
||||||
|
|
||||||
void die(int);
|
|
||||||
void com_gw(int);
|
|
||||||
void telnet_answer(int, int);
|
|
||||||
int telnet_init(void);
|
|
||||||
int telnet_read(char *, int);
|
|
||||||
int telnet_write(char *, int);
|
|
||||||
int telnet_buffer(char *, int);
|
|
||||||
|
|
||||||
#endif
|
|
Reference in New Issue
Block a user