Minor fixes in opentcp
This commit is contained in:
parent
b3f78e2934
commit
16256e4a39
@ -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
3
TODO
@ -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.
|
||||||
|
|
||||||
|
309
mbcico/opentcp.c
309
mbcico/opentcp.c
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user