New nodelist features test

This commit is contained in:
Michiel Broek 2003-01-02 16:44:28 +00:00
parent 92e96084b5
commit 79d31bda0a
4 changed files with 307 additions and 367 deletions

View File

@ -30,6 +30,8 @@ v0.37.00 26-Dec-2002.
mbcico: mbcico:
With binkp and EMSI sessions double received remote aka's are With binkp and EMSI sessions double received remote aka's are
filtered. filtered.
When calling ITN nodes, the default port is now 23.
Call setup changed and uses now the nodelist lookup URL.
mbout: mbout:
When a poll was removed, the outbound was not rescanned. When a poll was removed, the outbound was not rescanned.

View File

@ -4,7 +4,7 @@
* Purpose ...............: Fidonet mailer * Purpose ...............: Fidonet mailer
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -52,11 +52,11 @@
extern int tcp_mode; extern int tcp_mode;
extern int forcedcalls;
extern int immediatecall; extern int immediatecall;
extern char *forcedphone; extern char *forcedphone;
extern char *forcedline; extern char *forcedline;
extern char *inetaddr; extern char *inetaddr;
extern char *protocol;
@ -70,7 +70,6 @@ int portopen(faddr *addr)
if ((rc = opentcp(inetaddr))) { if ((rc = opentcp(inetaddr))) {
Syslog('+', "Cannot connect %s", inetaddr); Syslog('+', "Cannot connect %s", inetaddr);
nodeulock(addr); nodeulock(addr);
// putstatus(addr,1,MBERR_NO_CONNECTION);
return MBERR_NO_CONNECTION; return MBERR_NO_CONNECTION;
} }
return MBERR_OK; return MBERR_OK;
@ -104,10 +103,9 @@ int portopen(faddr *addr)
int call(faddr *addr) int call(faddr *addr)
{ {
int i, rc = 1, proto = FALSE; int rc = 1;
struct hostent *he; char *p, temp[81];
unsigned long cmmask, ipmask; unsigned long cmmask;
nodelist_modem **tmpm;
/* /*
* Don't call points, call their boss instead. * Don't call points, call their boss instead.
@ -152,91 +150,56 @@ int call(faddr *addr)
sprintf(history.aka.domain, "%s", addr->domain); sprintf(history.aka.domain, "%s", addr->domain);
/* /*
* First see if this node can be reached over the internet and * Extract the protocol from the URL.
* that internet calls are allowed.
*/ */
if (nlent->iflags) { strncpy(temp, nlent->url, 80);
if (!inetaddr) { p = strchr(temp, ':');
Syslog('d', "Trying to find IP address..."); *p = '\0';
/* protocol = xstrcpy(temp);
* There is no fdn or IP address at the commandline.
* First check nodesetup for an override in the phone field.
* Try to find the fdn in several places in the nodelist fields.
*/
if ((nlent->phone != NULL) && (strncmp(nlent->phone, (char *)"000-", 4) == 0)) {
inetaddr = xstrcpy(nlent->phone+4);
for (i = 0; i < strlen(inetaddr); i++)
if (inetaddr[i] == '-')
inetaddr[i] = '.';
Syslog('d', "Got IP address from phone field");
} else if ((he = gethostbyname(nlent->name))) {
inetaddr = xstrcpy(nlent->name);
Syslog('d', "Got hostname from nodelist system name");
} else if ((he = gethostbyname(nlent->location))) {
/*
* A fdn at the nodelist location field is not in the specs
* but the real world differs from the specs.
*/
inetaddr = xstrcpy(nlent->location);
Syslog('d', "Got hostname from nodelist location");
}
}
if (strcasecmp(protocol, "pots") && strcasecmp(protocol, "isdn")) {
if (!inetaddr) {
/* /*
* If we have an internet address, set protocol * Get the internet address from the URL.
*/ */
if (inetaddr) { p = strchr(nlent->url, '/');
p++;
p++;
inetaddr = xstrcpy(p);
}
RegTCP(); RegTCP();
Syslog('d', "TCP/IP node \"%s\"", MBSE_SS(inetaddr));
if (tcp_mode == TCPMODE_NONE) { if (tcp_mode == TCPMODE_NONE) {
/* if (strcmp(protocol, "binkp") == 0) {
* If protocol not forced at the commandline, get it
* from the nodelist. If it fails, fallback to dial.
* Priority IBN, IFC, ITN.
*/
ipmask = 0;
for (tmpm = &nl_tcpip; *tmpm; tmpm=&((*tmpm)->next))
if (strcmp("IBN", (*tmpm)->name) == 0)
ipmask = (*tmpm)->mask;
if (nlent->iflags & ipmask) {
tcp_mode = TCPMODE_IBN; tcp_mode = TCPMODE_IBN;
Syslog('d', "TCP/IP mode set to IBN"); } else if (strcmp(protocol, "fido") == 0) {
proto = TRUE;
}
if (!proto) {
for (tmpm = &nl_tcpip; *tmpm; tmpm=&((*tmpm)->next))
if (strcmp("IFC", (*tmpm)->name) == 0)
ipmask = (*tmpm)->mask;
if (nlent->iflags & ipmask) {
tcp_mode = TCPMODE_IFC; tcp_mode = TCPMODE_IFC;
Syslog('d', "TCP/IP mode set to IFC"); } else if (strcmp(protocol, "telnet") == 0) {
proto = TRUE;
}
}
if (!proto) {
for (tmpm = &nl_tcpip; *tmpm; tmpm=&((*tmpm)->next))
if (strcmp("ITN", (*tmpm)->name) == 0)
ipmask = (*tmpm)->mask;
if (nlent->iflags & ipmask) {
tcp_mode = TCPMODE_ITN; tcp_mode = TCPMODE_ITN;
Syslog('d', "TCP/IP mode seto to ITN"); } else {
proto = TRUE;
}
}
if (!proto) {
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);
inetaddr = NULL; inetaddr = NULL;
} }
} }
} else {
if (inetaddr == NULL) {
WriteError("No IP address, abort call"); WriteError("No IP address, abort call");
rc = MBERR_NO_IP_ADDRESS; rc = MBERR_NO_IP_ADDRESS;
putstatus(addr, 10, rc); putstatus(addr, 10, rc);
nodeulock(addr); nodeulock(addr);
return rc; return rc;
} }
} else {
if (!forcedphone) {
/*
* Get the phone number from the URL.
*/
p = strchr(nlent->url, '/');
p++;
p++;
forcedphone = xstrcpy(p);
}
} }
if (((nlent->oflags & cmmask) == 0) && (!IsZMH())) { if (((nlent->oflags & cmmask) == 0) && (!IsZMH())) {
@ -249,20 +212,19 @@ int call(faddr *addr)
/* /*
* Call when: * Call when:
* the nodelist has a phone, or phone on commandline, or TCP address given * there is a phone number or fqdn/ip-address
* and * and
* nodenumber on commandline, or node is CM and not down, hold, pvt * nodenumber on commandline, or node is CM and not down, hold, pvt
* and * and
* nocall is false * nocall is false
*/ */
if ((nlent->phone || forcedphone || inetaddr ) && if ((forcedphone||inetaddr) && (((nlent->pflag & (NL_DUMMY|NL_DOWN|NL_HOLD|NL_PVT))==0) && ((localoptions & NOCALL)==0))) {
(forcedcalls || (((nlent->pflag & (NL_DUMMY|NL_DOWN|NL_HOLD|NL_PVT)) == 0) && ((localoptions & NOCALL) == 0)))) { Syslog('+', "Calling %s (%s, phone %s)", ascfnode(addr,0x1f), nlent->name, forcedphone);
Syslog('+', "Calling %s (%s, phone %s)",ascfnode(addr,0x1f), nlent->name,nlent->phone?nlent->phone:forcedphone);
IsDoing("Call %s", ascfnode(addr, 0x0f)); IsDoing("Call %s", ascfnode(addr, 0x0f));
rc = portopen(addr); rc = portopen(addr);
if ((rc == MBERR_OK) && (!inetaddr)) { if ((rc == MBERR_OK) && (forcedphone)) {
if ((rc = dialphone(forcedphone?forcedphone:nlent->phone))) { if ((rc = dialphone(forcedphone))) {
Syslog('+', "Dial failed"); Syslog('+', "Dial failed");
nodeulock(addr); nodeulock(addr);
} }
@ -297,7 +259,7 @@ int call(faddr *addr)
} }
} else { } else {
IsDoing("NoCall"); IsDoing("NoCall");
Syslog('+', "Cannot call %s (%s, phone %s)", ascfnode(addr,0x1f),MBSE_SS(nlent->name), MBSE_SS(nlent->phone)); Syslog('+', "Cannot call %s (%s)", ascfnode(addr,0x1f), MBSE_SS(nlent->name));
rc = MBERR_NO_CONNECTION; rc = MBERR_NO_CONNECTION;
putstatus(addr, 10, rc); putstatus(addr, 10, rc);
nodeulock(addr); nodeulock(addr);

View File

@ -4,7 +4,7 @@
* Purpose: Fidonet mailer * Purpose: Fidonet mailer
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -51,11 +51,11 @@
int master = 0; int master = 0;
int forcedcalls = 0;
int immediatecall = FALSE; int immediatecall = FALSE;
char *forcedphone = NULL; char *forcedphone = NULL;
char *forcedline = NULL; char *forcedline = NULL;
char *inetaddr = NULL; char *inetaddr = NULL;
char *protocol = NULL;
char *envptr = NULL; char *envptr = NULL;
time_t t_start; time_t t_start;
time_t t_end; time_t t_end;
@ -82,7 +82,7 @@ void usage(void)
{ {
fprintf(stderr,"ifcico; (c) Eugene G. Crosser, 1993-1997\n"); fprintf(stderr,"ifcico; (c) Eugene G. Crosser, 1993-1997\n");
fprintf(stderr,"mbcico ver. %s; (c) %s\n\n", VERSION, SHORTRIGHT); fprintf(stderr,"mbcico ver. %s; (c) %s\n\n", VERSION, SHORTRIGHT);
fprintf(stderr,"-r<role> -a<inetaddr> <node> ...\n"); fprintf(stderr,"-a<inetaddr> <node>\n");
fprintf(stderr,"-n<phone> forced phone number\n"); fprintf(stderr,"-n<phone> forced phone number\n");
fprintf(stderr,"-l<ttydevice> forced tty device\n"); fprintf(stderr,"-l<ttydevice> forced tty device\n");
fprintf(stderr,"-t<tcpmode> must be one of ifc|itn|ibn, forces TCP/IP\n"); fprintf(stderr,"-t<tcpmode> must be one of ifc|itn|ibn, forces TCP/IP\n");
@ -127,8 +127,7 @@ void die(int onsig)
total = (int)(c_end - c_start); total = (int)(c_end - c_start);
if (!total) if (!total)
total = 1; total = 1;
Syslog('+', "Sent %lu bytes, received %lu bytes, avg %d cps", Syslog('+', "Sent %lu bytes, received %lu bytes, avg %d cps", sentbytes, rcvdbytes, (sentbytes + rcvdbytes) / total);
sentbytes, rcvdbytes, (sentbytes + rcvdbytes) / total);
} }
if (online) if (online)
@ -149,15 +148,13 @@ void die(int onsig)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int i, c, uid; faddr *addr = NULL;
fa_list *callist = NULL, **tmpl; int i, c, uid, rc, maxrc;
faddr *tmp;
int rc, maxrc, callno = 0, succno = 0;
char *answermode = NULL, *p = NULL, *cmd = NULL; char *answermode = NULL, *p = NULL, *cmd = NULL;
struct passwd *pw; struct passwd *pw;
FILE *fp; FILE *fp;
#ifdef IEMSI #ifdef IEMSI
char temp[81]; char temp[PATH_MAX];
#endif #endif
#ifdef MEMWATCH #ifdef MEMWATCH
@ -203,14 +200,15 @@ int main(int argc, char *argv[])
for (i = 0; i < NSIG; i++) { for (i = 0; i < NSIG; i++) {
if ((i == SIGINT) || (i == SIGBUS) || (i == SIGFPE) || (i == SIGSEGV)) { if ((i == SIGINT) || (i == SIGBUS) || (i == SIGFPE) || (i == SIGSEGV)) {
signal(i, (void (*))die); signal(i, (void (*))die);
} else } else {
signal(i, SIG_DFL); signal(i, SIG_DFL);
} }
}
/* /*
* Check if history file exists, if not create a new one. * Check if history file exists, if not create a new one.
*/ */
cmd = calloc(128, sizeof(char)); cmd = calloc(PATH_MAX, sizeof(char));
sprintf(cmd, "%s/var/mailer.hist", getenv("MBSE_ROOT")); sprintf(cmd, "%s/var/mailer.hist", getenv("MBSE_ROOT"));
if ((fp = fopen(cmd, "r")) == NULL) { if ((fp = fopen(cmd, "r")) == NULL) {
if ((fp = fopen(cmd, "a")) == NULL) { if ((fp = fopen(cmd, "a")) == NULL) {
@ -239,7 +237,7 @@ int main(int argc, char *argv[])
setmyname(argv[0]); setmyname(argv[0]);
while ((c=getopt(argc,argv,"r:n:l:t:a:I:h")) != -1) while ((c = getopt(argc,argv,"r:n:l:t:a:I:h")) != -1) {
switch (c) { switch (c) {
case 'r': WriteError("commandline option -r is obsolete"); case 'r': WriteError("commandline option -r is obsolete");
break; break;
@ -248,13 +246,16 @@ int main(int argc, char *argv[])
break; break;
case 't': p = xstrcpy(optarg); case 't': p = xstrcpy(optarg);
if (strncmp(p, "ifc", 3) == 0) if (strncmp(p, "ifc", 3) == 0) {
tcp_mode = TCPMODE_IFC; tcp_mode = TCPMODE_IFC;
else if (strncmp(p, "itn", 3) == 0) protocol = xstrcpy((char *)"fido");
} else if (strncmp(p, "itn", 3) == 0) {
tcp_mode = TCPMODE_ITN; tcp_mode = TCPMODE_ITN;
else if (strncmp(p, "ibn", 3) == 0) protocol = xstrcpy((char *)"telnet");
} else if (strncmp(p, "ibn", 3) == 0) {
tcp_mode = TCPMODE_IBN; tcp_mode = TCPMODE_IBN;
else { protocol = xstrcpy((char *)"binkp");
} else {
usage(); usage();
die(MBERR_COMMANDLINE); die(MBERR_COMMANDLINE);
} }
@ -271,6 +272,7 @@ int main(int argc, char *argv[])
default: usage(); default: usage();
die(MBERR_COMMANDLINE); die(MBERR_COMMANDLINE);
} }
}
/* /*
* Load rest of the configuration * Load rest of the configuration
@ -281,8 +283,6 @@ int main(int argc, char *argv[])
phone = xstrcpy(CFG.Phone); phone = xstrcpy(CFG.Phone);
flags = xstrcpy(CFG.Flags); flags = xstrcpy(CFG.Flags);
tmpl = &callist;
while (argv[optind]) { while (argv[optind]) {
for (p = argv[optind]; (*p) && (*p == '*'); p++); for (p = argv[optind]; (*p) && (*p == '*'); p++);
@ -318,22 +318,14 @@ int main(int argc, char *argv[])
answermode = argv[optind]; answermode = argv[optind];
Syslog('S', "Inbound \"%s\" mode", MBSE_SS(answermode)); Syslog('S', "Inbound \"%s\" mode", MBSE_SS(answermode));
} else { } else {
Syslog('-', "Callist entry \"%s\"", argv[optind]); if ((addr = parsefaddr(argv[optind]))) {
if ((tmp = parsefaddr(argv[optind]))) {
*tmpl = (fa_list *)malloc(sizeof(fa_list));
(*tmpl)->next = NULL;
(*tmpl)->addr = tmp;
tmpl = &((*tmpl)->next);
immediatecall = TRUE; immediatecall = TRUE;
} else master = 1;
} else {
WriteError("Unrecognizable address \"%s\"", argv[optind]); WriteError("Unrecognizable address \"%s\"", argv[optind]);
} }
optind++;
} }
optind++;
if (callist) {
master = 1;
forcedcalls = 1;
} }
/* /*
@ -368,40 +360,24 @@ int main(int argc, char *argv[])
if (!diskfree(CFG.freespace)) if (!diskfree(CFG.freespace))
die(MBERR_DISK_FULL); die(MBERR_DISK_FULL);
if (callist == NULL) { if (addr == NULL) {
WriteError("Calling mbcico without node address not supported anymore"); WriteError("Calling mbcico without node address not supported anymore");
die(MBERR_COMMANDLINE); die(MBERR_COMMANDLINE);
} }
for (tmpl = &callist; *tmpl; tmpl = &((*tmpl)->next)) { rc = call(addr);
callno++; Syslog('+', "Call to %s %s (rc=%d)", ascfnode(addr, 0x1f), rc?"failed":"successful", rc);
forcedcalls = (*tmpl)->force;
rc = call((*tmpl)->addr);
Syslog('+', "Call to %s %s (rc=%d)", ascfnode((*tmpl)->addr,0x1f), rc?"failed":"successful",rc);
if (rc > maxrc) if (rc > maxrc)
maxrc=rc; maxrc=rc;
if (rc == 0) {
succno++;
break;
}
}
// if (callist == NULL)
// if (IsSema((char *)"scanout"))
// RemoveSema((char *)"scanout");
} else { } else {
/* slave */ /* slave */
if (!answermode && tcp_mode == TCPMODE_IBN) if (!answermode && tcp_mode == TCPMODE_IBN)
answermode = xstrcpy((char *)"ibn"); answermode = xstrcpy((char *)"ibn");
maxrc = answer(answermode); rc = maxrc = answer(answermode);
callno = 1; Syslog('+', "Incoming call %s (rc=%d)", rc?"failed":"successful", rc);
succno = (maxrc == 0);
} }
if (callno) tidy_faddr(addr);
Syslog('+', "%d of %d calls, maxrc=%d",succno,callno,maxrc);
tidy_falist(&callist);
if (maxrc) if (maxrc)
die(maxrc); die(maxrc);
else else

View File

@ -4,7 +4,7 @@
* Purpose ...............: Fidonet mailer * Purpose ...............: Fidonet mailer
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -118,7 +118,7 @@ int opentcp(char *name)
else else
server.sin_port = htons(FIDOPORT); server.sin_port = htons(FIDOPORT);
break; break;
case TCPMODE_ITN: if ((se = getservbyname("tfido", "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);