Minor fixes in opentcp

This commit is contained in:
Michiel Broek 2002-12-21 22:23:14 +00:00
parent b3f78e2934
commit 16256e4a39
3 changed files with 161 additions and 154 deletions

View File

@ -32,6 +32,9 @@ v0.35.07 11-Dec-2002
The index command displays LFN names in the webpages again. The index command displays LFN names in the webpages again.
The real download still sends the 8.3 name. The real download still sends the 8.3 name.
mbcico:
Code cleanup in opentcp, better handling of given ports and
better logging.
v0.35.06 13-Nov-2002 - 11-Dec-2002 v0.35.06 13-Nov-2002 - 11-Dec-2002

3
TODO
View File

@ -102,6 +102,9 @@ mbcico:
N: Implement binkp resync when getting files. Transmit works. N: Implement binkp resync when getting files. Transmit works.
N: Add better check for stale outbound locks, check if the pid is from
a non-mbse program or add a age check.
mbfile: mbfile:
N: Add a check to see if the magic filenames are (still) valid. N: Add a check to see if the magic filenames are (still) valid.

View File

@ -80,187 +80,188 @@ static int tcp_is_open = FALSE;
int opentcp(char *name) int opentcp(char *name)
{ {
struct servent *se; struct servent *se;
struct hostent *he; struct hostent *he;
int a1,a2,a3,a4; int a1, a2, a3, a4, Fd, GotPort = FALSE;
char *errmsg; char *errmsg, *portname;
char *portname; short portnum;
int Fd; struct sockaddr_in server;
short portnum;
struct sockaddr_in server;
Syslog('d', "Try open tcp connection to %s",MBSE_SS(name)); Syslog('+', "Open TCP connection to \"%s\"", MBSE_SS(name));
tcp_is_open = FALSE; tcp_is_open = FALSE;
memset(&telnet_options, 0, sizeof(telnet_options)); memset(&telnet_options, 0, sizeof(telnet_options));
server.sin_family = AF_INET; server.sin_family = AF_INET;
if ((portname = strchr(name,':'))) { /*
*portname++='\0'; * Get port number from name argument if there is a : part
if ((portnum = atoi(portname))) */
server.sin_port=htons(portnum); if ((portname = strchr(name,':'))) {
else if ((se = getservbyname(portname, "tcp"))) *portname++='\0';
server.sin_port = se->s_port; if ((portnum = atoi(portname))) {
else server.sin_port=htons(portnum);
server.sin_port = htons(FIDOPORT); GotPort = TRUE;
} else { } else if ((se = getservbyname(portname, "tcp"))) {
switch (tcp_mode) { server.sin_port = se->s_port;
case TCPMODE_IFC: if ((se = getservbyname("fido", "tcp"))) GotPort = TRUE;
server.sin_port = se->s_port;
else
server.sin_port = htons(FIDOPORT);
break;
case TCPMODE_ITN: if ((se = getservbyname("tfido", "tcp")))
server.sin_port = se->s_port;
else
server.sin_port = htons(TELNPORT);
break;
case TCPMODE_IBN: if ((se = getservbyname("binkd", "tcp")))
server.sin_port = se->s_port;
else
server.sin_port = htons(BINKPORT);
break;
default: server.sin_port = htons(FIDOPORT);
}
} }
}
if (sscanf(name,"%d.%d.%d.%d",&a1,&a2,&a3,&a4) == 4) /*
server.sin_addr.s_addr = inet_addr(name); * If not a forced port number, get the defaults.
else if ((he = gethostbyname(name))) */
memcpy(&server.sin_addr,he->h_addr,he->h_length); if (! GotPort) {
else {
switch (h_errno) {
case HOST_NOT_FOUND: errmsg=(char *)"Authoritative: Host not found"; break;
case TRY_AGAIN: errmsg=(char *)"Non-Authoritive: Host not found"; break;
case NO_RECOVERY: errmsg=(char *)"Non recoverable errors"; break;
default: errmsg=(char *)"Unknown error"; break;
}
Syslog('+', "No IP address for %s: %s\n", name, errmsg);
return -1;
}
Syslog('d', "Trying %s at port %d",
inet_ntoa(server.sin_addr),(int)ntohs(server.sin_port));
signal(SIGPIPE,linedrop);
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");
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;
switch (tcp_mode) { switch (tcp_mode) {
case TCPMODE_ITN: tel_enter_binary(3); case TCPMODE_IFC: if ((se = getservbyname("fido", "tcp")))
Syslog('+', "Established ITN/TCP connection with %s", inet_ntoa(server.sin_addr)); server.sin_port = se->s_port;
else
server.sin_port = htons(FIDOPORT);
break; break;
case TCPMODE_IFC: Syslog('+', "Established IFC/TCP connection with %s", inet_ntoa(server.sin_addr)); case TCPMODE_ITN: if ((se = getservbyname("tfido", "tcp")))
server.sin_port = se->s_port;
else
server.sin_port = htons(TELNPORT);
break; break;
case TCPMODE_IBN: Syslog('+', "Established IBN/TCP connection with %s", inet_ntoa(server.sin_addr)); case TCPMODE_IBN: if ((se = getservbyname("binkd", "tcp")))
server.sin_port = se->s_port;
else
server.sin_port = htons(BINKPORT);
break; break;
default: WriteError("Established TCP connection with unknow protocol"); default: server.sin_port = htons(FIDOPORT);
} }
c_start = time(NULL); }
carrier = TRUE;
tcp_is_open = TRUE; /*
return 0; * Get IP address for the hostname
*/
if (sscanf(name,"%d.%d.%d.%d",&a1,&a2,&a3,&a4) == 4)
server.sin_addr.s_addr = inet_addr(name);
else if ((he = gethostbyname(name)))
memcpy(&server.sin_addr,he->h_addr,he->h_length);
else {
switch (h_errno) {
case HOST_NOT_FOUND: errmsg = (char *)"Authoritative: Host not found"; break;
case TRY_AGAIN: errmsg = (char *)"Non-Authoritive: Host not found"; break;
case NO_RECOVERY: errmsg = (char *)"Non recoverable errors"; break;
default: errmsg = (char *)"Unknown error"; break;
}
Syslog('+', "No IP address for %s: %s\n", name, errmsg);
return -1;
}
signal(SIGPIPE,linedrop);
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");
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;
if (tcp_mode == TCPMODE_ITN)
tel_enter_binary(3);
Syslog('+', "Established %s/TCP connection with %s, port %d",
(tcp_mode == TCPMODE_ITN) ? "ITN":(tcp_mode == TCPMODE_IFC) ? "IFC":(tcp_mode == TCPMODE_IBN) ? "IBN":"Unknown",
inet_ntoa(server.sin_addr), (int)ntohs(server.sin_port));
c_start = time(NULL);
carrier = TRUE;
tcp_is_open = TRUE;
return 0;
} }
void closetcp(void) void closetcp(void)
{ {
FILE *fph; FILE *fph;
char *tmp; char *tmp;
if (!tcp_is_open) if (!tcp_is_open)
return; return;
Syslog('d', "Closing TCP connection"); if (tcp_mode == TCPMODE_ITN)
tel_leave_binary(3);
if (tcp_mode == TCPMODE_ITN) shutdown(fd, 2);
tel_leave_binary(3); signal(SIGPIPE,SIG_DFL);
shutdown(fd,2); if (carrier) {
signal(SIGPIPE,SIG_DFL); c_end = time(NULL);
online += (c_end - c_start);
if (carrier) { Syslog('+', "Closing TCP connection, connected %s", t_elapsed(c_start, c_end));
c_end = time(NULL); carrier = FALSE;
online += (c_end - c_start); history.offline = c_end;
Syslog('+', "Connection time %s", t_elapsed(c_start, c_end)); history.online = c_start;
carrier = FALSE; history.sent_bytes = sentbytes;
history.offline = c_end; history.rcvd_bytes = rcvdbytes;
history.online = c_start; history.inbound = ~master;
history.sent_bytes = sentbytes; tmp = calloc(PATH_MAX, sizeof(char));
history.rcvd_bytes = rcvdbytes; sprintf(tmp, "%s/var/mailer.hist", getenv("MBSE_ROOT"));
history.inbound = ~master; if ((fph = fopen(tmp, "a")) == NULL)
tmp = calloc(128, sizeof(char)); WriteError("$Can't open %s", tmp);
sprintf(tmp, "%s/var/mailer.hist", getenv("MBSE_ROOT")); else {
if ((fph = fopen(tmp, "a")) == NULL) fwrite(&history, sizeof(history), 1, fph);
WriteError("$Can't open %s", tmp); fclose(fph);
else {
fwrite(&history, sizeof(history), 1, fph);
fclose(fph);
}
free(tmp);
memset(&history, 0, sizeof(history));
if (Loaded) {
nodes.LastDate = time(NULL);
UpdateNode();
}
} }
tcp_is_open = FALSE; free(tmp);
memset(&history, 0, sizeof(history));
if (Loaded) {
nodes.LastDate = time(NULL);
UpdateNode();
}
}
tcp_is_open = FALSE;
} }
void tel_enter_binary(int rw) void tel_enter_binary(int rw)
{ {
Syslog('d', "Telnet enter binary %d", rw); Syslog('d', "Telnet enter binary %d", rw);
if (rw & 1) if (rw & 1)
send_do(TELOPT_BINARY); send_do(TELOPT_BINARY);
if (rw & 2) if (rw & 2)
send_will(TELOPT_BINARY); send_will(TELOPT_BINARY);
send_dont(TELOPT_ECHO); send_dont(TELOPT_ECHO);
send_do(TELOPT_SGA); send_do(TELOPT_SGA);
send_dont(TELOPT_RCTE); send_dont(TELOPT_RCTE);
send_dont(TELOPT_TTYPE); send_dont(TELOPT_TTYPE);
send_wont(TELOPT_ECHO); send_wont(TELOPT_ECHO);
send_will(TELOPT_SGA); send_will(TELOPT_SGA);
send_wont(TELOPT_RCTE); send_wont(TELOPT_RCTE);
send_wont(TELOPT_TTYPE); send_wont(TELOPT_TTYPE);
} }
void tel_leave_binary(int rw) void tel_leave_binary(int rw)
{ {
Syslog('d', "Telnet leave binary %d", rw); Syslog('d', "Telnet leave binary %d", rw);
if (rw & 1) if (rw & 1)
send_dont(TELOPT_BINARY); send_dont(TELOPT_BINARY);
if (rw & 2) if (rw & 2)
send_wont(TELOPT_BINARY); send_wont(TELOPT_BINARY);
} }
@ -274,29 +275,29 @@ void tel_leave_binary(int rw)
void send_do(register int c) void send_do(register int c)
{ {
NET2ADD(IAC, DO); NET2ADD(IAC, DO);
NETADD(c); NETADD(c);
} }
void send_dont(register int c) void send_dont(register int c)
{ {
NET2ADD(IAC, DONT); NET2ADD(IAC, DONT);
NETADD(c); NETADD(c);
} }
void send_will(register int c) void send_will(register int c)
{ {
NET2ADD(IAC, WILL); NET2ADD(IAC, WILL);
NETADD(c); NETADD(c);
} }
void send_wont(register int c) void send_wont(register int c)
{ {
NET2ADD(IAC, WONT); NET2ADD(IAC, WONT);
NETADD(c); NETADD(c);
} }