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:
With binkp and EMSI sessions double received remote aka's are
filtered.
When calling ITN nodes, the default port is now 23.
Call setup changed and uses now the nodelist lookup URL.
mbout:
When a poll was removed, the outbound was not rescanned.

View File

@ -4,7 +4,7 @@
* Purpose ...............: Fidonet mailer
*
*****************************************************************************
* Copyright (C) 1997-2002
* Copyright (C) 1997-2003
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@ -52,11 +52,11 @@
extern int tcp_mode;
extern int forcedcalls;
extern int immediatecall;
extern char *forcedphone;
extern char *forcedline;
extern char *inetaddr;
extern char *protocol;
@ -70,7 +70,6 @@ int portopen(faddr *addr)
if ((rc = opentcp(inetaddr))) {
Syslog('+', "Cannot connect %s", inetaddr);
nodeulock(addr);
// putstatus(addr,1,MBERR_NO_CONNECTION);
return MBERR_NO_CONNECTION;
}
return MBERR_OK;
@ -104,10 +103,9 @@ int portopen(faddr *addr)
int call(faddr *addr)
{
int i, rc = 1, proto = FALSE;
struct hostent *he;
unsigned long cmmask, ipmask;
nodelist_modem **tmpm;
int rc = 1;
char *p, temp[81];
unsigned long cmmask;
/*
* Don't call points, call their boss instead.
@ -152,91 +150,56 @@ int call(faddr *addr)
sprintf(history.aka.domain, "%s", addr->domain);
/*
* First see if this node can be reached over the internet and
* that internet calls are allowed.
* Extract the protocol from the URL.
*/
if (nlent->iflags) {
strncpy(temp, nlent->url, 80);
p = strchr(temp, ':');
*p = '\0';
protocol = xstrcpy(temp);
if (strcasecmp(protocol, "pots") && strcasecmp(protocol, "isdn")) {
if (!inetaddr) {
Syslog('d', "Trying to find IP address...");
/*
* 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.
* Get the internet address from the URL.
*/
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");
p = strchr(nlent->url, '/');
p++;
p++;
inetaddr = xstrcpy(p);
}
RegTCP();
if (tcp_mode == TCPMODE_NONE) {
if (strcmp(protocol, "binkp") == 0) {
tcp_mode = TCPMODE_IBN;
} else if (strcmp(protocol, "fido") == 0) {
tcp_mode = TCPMODE_IFC;
} else if (strcmp(protocol, "telnet") == 0) {
tcp_mode = TCPMODE_ITN;
} else {
Syslog('+', "No common TCP/IP protocols for node %s", nlent->name);
free(inetaddr);
inetaddr = NULL;
}
}
/*
* If we have an internet address, set protocol
*/
if (inetaddr) {
RegTCP();
Syslog('d', "TCP/IP node \"%s\"", MBSE_SS(inetaddr));
if (tcp_mode == TCPMODE_NONE) {
/*
* 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;
Syslog('d', "TCP/IP mode set to IBN");
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;
Syslog('d', "TCP/IP mode set to IFC");
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;
Syslog('d', "TCP/IP mode seto to ITN");
proto = TRUE;
}
}
if (!proto) {
Syslog('+', "No common TCP/IP protocols for node %s", nlent->name);
free(inetaddr);
inetaddr = NULL;
}
}
} else {
if (inetaddr == NULL) {
WriteError("No IP address, abort call");
rc = MBERR_NO_IP_ADDRESS;
putstatus(addr, 10, rc);
nodeulock(addr);
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())) {
@ -249,20 +212,19 @@ int call(faddr *addr)
/*
* 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
* nodenumber on commandline, or node is CM and not down, hold, pvt
* and
* nocall is false
*/
if ((nlent->phone || forcedphone || inetaddr ) &&
(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,nlent->phone?nlent->phone:forcedphone);
if ((forcedphone||inetaddr) && (((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);
IsDoing("Call %s", ascfnode(addr, 0x0f));
rc = portopen(addr);
if ((rc == MBERR_OK) && (!inetaddr)) {
if ((rc = dialphone(forcedphone?forcedphone:nlent->phone))) {
if ((rc == MBERR_OK) && (forcedphone)) {
if ((rc = dialphone(forcedphone))) {
Syslog('+', "Dial failed");
nodeulock(addr);
}
@ -297,7 +259,7 @@ int call(faddr *addr)
}
} else {
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;
putstatus(addr, 10, rc);
nodeulock(addr);

View File

@ -4,7 +4,7 @@
* Purpose: Fidonet mailer
*
*****************************************************************************
* Copyright (C) 1997-2002
* Copyright (C) 1997-2003
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@ -51,11 +51,11 @@
int master = 0;
int forcedcalls = 0;
int immediatecall = FALSE;
char *forcedphone = NULL;
char *forcedline = NULL;
char *inetaddr = NULL;
char *protocol = NULL;
char *envptr = NULL;
time_t t_start;
time_t t_end;
@ -80,333 +80,309 @@ extern int mypid;
void usage(void)
{
fprintf(stderr,"ifcico; (c) Eugene G. Crosser, 1993-1997\n");
fprintf(stderr,"mbcico ver. %s; (c) %s\n\n", VERSION, SHORTRIGHT);
fprintf(stderr,"-r<role> -a<inetaddr> <node> ...\n");
fprintf(stderr,"-n<phone> forced phone number\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,"-a<inetaddr> supply internet hostname if not in nodelist\n");
fprintf(stderr," <node> should be in domain form, e.g. f11.n22.z3\n");
fprintf(stderr," (this implies master mode)\n");
fprintf(stderr,"\n or: %s tsync|yoohoo|**EMSI_INQC816|-t ibn|-t ifc|-t itn\n",myname);
fprintf(stderr," (this implies slave mode)\n");
fprintf(stderr,"ifcico; (c) Eugene G. Crosser, 1993-1997\n");
fprintf(stderr,"mbcico ver. %s; (c) %s\n\n", VERSION, SHORTRIGHT);
fprintf(stderr,"-a<inetaddr> <node>\n");
fprintf(stderr,"-n<phone> forced phone number\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,"-a<inetaddr> supply internet hostname if not in nodelist\n");
fprintf(stderr," <node> should be in domain form, e.g. f11.n22.z3\n");
fprintf(stderr," (this implies master mode)\n");
fprintf(stderr,"\n or: %s tsync|yoohoo|**EMSI_INQC816|-t ibn|-t ifc|-t itn\n",myname);
fprintf(stderr," (this implies slave mode)\n");
}
void free_mem(void)
{
free(inbound);
if (name)
free(name);
if (phone)
free(phone);
if (flags)
free(flags);
if (uxoutbound)
free(uxoutbound);
free(inbound);
if (name)
free(name);
if (phone)
free(phone);
if (flags)
free(flags);
if (uxoutbound)
free(uxoutbound);
}
void die(int onsig)
{
int total = 0;
int total = 0;
signal(onsig, SIG_IGN);
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);
}
if (onsig) {
if (onsig <= NSIG)
WriteError("Terminated on signal %d (%s)", onsig, SigName[onsig]);
else
Syslog('+', "Terminated with error %d", onsig);
}
if (sentbytes || rcvdbytes) {
total = (int)(c_end - c_start);
if (!total)
total = 1;
Syslog('+', "Sent %lu bytes, received %lu bytes, avg %d cps",
sentbytes, rcvdbytes, (sentbytes + rcvdbytes) / total);
}
if (sentbytes || rcvdbytes) {
total = (int)(c_end - c_start);
if (!total)
total = 1;
Syslog('+', "Sent %lu bytes, received %lu bytes, avg %d cps", sentbytes, rcvdbytes, (sentbytes + rcvdbytes) / total);
}
if (online)
Syslog('+', "Connected %s", str_time(online));
if (online)
Syslog('+', "Connected %s", str_time(online));
if (gotfiles)
CreateSema((char *)"mailin");
if (gotfiles)
CreateSema((char *)"mailin");
t_end = time(NULL);
Syslog(' ', "MBCICO finished in %s", t_elapsed(t_start, t_end));
free_mem();
if (envptr)
free(envptr);
ExitClient(onsig);
t_end = time(NULL);
Syslog(' ', "MBCICO finished in %s", t_elapsed(t_start, t_end));
free_mem();
if (envptr)
free(envptr);
ExitClient(onsig);
}
int main(int argc, char *argv[])
{
int i, c, uid;
fa_list *callist = NULL, **tmpl;
faddr *tmp;
int rc, maxrc, callno = 0, succno = 0;
char *answermode = NULL, *p = NULL, *cmd = NULL;
struct passwd *pw;
FILE *fp;
faddr *addr = NULL;
int i, c, uid, rc, maxrc;
char *answermode = NULL, *p = NULL, *cmd = NULL;
struct passwd *pw;
FILE *fp;
#ifdef IEMSI
char temp[81];
char temp[PATH_MAX];
#endif
#ifdef MEMWATCH
mwInit();
mwInit();
#endif
/*
* 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);
}
/*
* 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);
}
if (argc < 2) {
usage();
if (envptr)
free(envptr);
if (argc < 2) {
usage();
if (envptr)
free(envptr);
#ifdef MEMWATCH
mwTerm();
mwTerm();
#endif
exit(MBERR_COMMANDLINE);
}
exit(MBERR_COMMANDLINE);
}
InitConfig();
InitNode();
InitFidonet();
TermInit(1);
t_start = c_start = c_end = time(NULL);
InitConfig();
InitNode();
InitFidonet();
TermInit(1);
t_start = c_start = c_end = time(NULL);
InitClient(pw->pw_name, (char *)"mbcico", CFG.location, CFG.logfile, CFG.cico_loglevel, CFG.error_log, CFG.mgrlog);
Syslog(' ', " ");
Syslog(' ', "MBCICO v%s", VERSION);
InitClient(pw->pw_name, (char *)"mbcico", CFG.location, CFG.logfile, CFG.cico_loglevel, CFG.error_log, CFG.mgrlog);
Syslog(' ', " ");
Syslog(' ', "MBCICO v%s", VERSION);
/*
* Catch all signals we can, and handle the rest.
*/
for (i = 0; i < NSIG; i++) {
if ((i == SIGINT) || (i == SIGBUS) || (i == SIGFPE) || (i == SIGSEGV)) {
signal(i, (void (*))die);
} else
signal(i, SIG_DFL);
}
/*
* Check if history file exists, if not create a new one.
*/
cmd = calloc(128, sizeof(char));
sprintf(cmd, "%s/var/mailer.hist", getenv("MBSE_ROOT"));
if ((fp = fopen(cmd, "r")) == NULL) {
if ((fp = fopen(cmd, "a")) == NULL) {
WriteError("$Can't create %s", cmd);
} else {
memset(&history, 0, sizeof(history));
history.online = time(NULL);
history.offline = time(NULL);
fwrite(&history, sizeof(history), 1, fp);
fclose(fp);
Syslog('+', "Created new %s", cmd);
}
/*
* Catch all signals we can, and handle the rest.
*/
for (i = 0; i < NSIG; i++) {
if ((i == SIGINT) || (i == SIGBUS) || (i == SIGFPE) || (i == SIGSEGV)) {
signal(i, (void (*))die);
} else {
fclose(fp);
signal(i, SIG_DFL);
}
free(cmd);
memset(&history, 0, sizeof(history));
}
cmd = xstrcpy((char *)"Cmd: mbcico");
for (i = 1; i < argc; i++) {
cmd = xstrcat(cmd, (char *)" ");
cmd = xstrcat(cmd, argv[i]);
/*
* Check if history file exists, if not create a new one.
*/
cmd = calloc(PATH_MAX, sizeof(char));
sprintf(cmd, "%s/var/mailer.hist", getenv("MBSE_ROOT"));
if ((fp = fopen(cmd, "r")) == NULL) {
if ((fp = fopen(cmd, "a")) == NULL) {
WriteError("$Can't create %s", cmd);
} else {
memset(&history, 0, sizeof(history));
history.online = time(NULL);
history.offline = time(NULL);
fwrite(&history, sizeof(history), 1, fp);
fclose(fp);
Syslog('+', "Created new %s", cmd);
}
Syslog(' ', cmd);
free(cmd);
} else {
fclose(fp);
}
free(cmd);
memset(&history, 0, sizeof(history));
setmyname(argv[0]);
cmd = xstrcpy((char *)"Cmd: mbcico");
for (i = 1; i < argc; i++) {
cmd = xstrcat(cmd, (char *)" ");
cmd = xstrcat(cmd, argv[i]);
}
Syslog(' ', cmd);
free(cmd);
while ((c=getopt(argc,argv,"r:n:l:t:a:I:h")) != -1)
switch (c) {
case 'r': WriteError("commandline option -r is obsolete");
break;
setmyname(argv[0]);
case 'l': forcedline = optarg;
break;
while ((c = getopt(argc,argv,"r:n:l:t:a:I:h")) != -1) {
switch (c) {
case 'r': WriteError("commandline option -r is obsolete");
break;
case 't': p = xstrcpy(optarg);
if (strncmp(p, "ifc", 3) == 0)
tcp_mode = TCPMODE_IFC;
else if (strncmp(p, "itn", 3) == 0)
tcp_mode = TCPMODE_ITN;
else if (strncmp(p, "ibn", 3) == 0)
tcp_mode = TCPMODE_IBN;
else {
usage();
die(MBERR_COMMANDLINE);
}
free(p);
RegTCP();
break;
case 'l': forcedline = optarg;
break;
case 'a': inetaddr = optarg;
break;
case 'n': forcedphone = optarg;
break;
default: usage();
die(MBERR_COMMANDLINE);
}
/*
* Load rest of the configuration
*/
inbound = xstrcpy(CFG.inbound);
uxoutbound = xstrcpy(CFG.uxpath);
name = xstrcpy(CFG.bbs_name);
phone = xstrcpy(CFG.Phone);
flags = xstrcpy(CFG.Flags);
tmpl = &callist;
while (argv[optind]) {
for (p = argv[optind]; (*p) && (*p == '*'); p++);
#ifdef IEMSI
if (strncasecmp(p, "EMSI_NAKEEC3", 12) == 0) {
Syslog('+', "Detected IEMSI client, starting BBS");
sprintf(temp, "%s/bin/mbsebbs", getenv("MBSE_ROOT"));
socket_shutdown(mypid);
if (execl(temp, "mbsebbs", (char *)NULL) == -1)
perror("FATAL: Error loading BBS!");
/*
* If this happens, nothing is logged!
*/
printf("\n\nFATAL: Loading of the BBS failed!\n\n");
sleep(3);
free_mem();
if (envptr)
free(envptr);
#ifdef MEMWATCH
mwTerm();
#endif
exit(MBERROR_EXEC_FAILED);
}
#endif
if ((strcasecmp(argv[optind],"tsync") == 0) ||
(strcasecmp(argv[optind],"yoohoo") == 0) ||
(strcasecmp(argv[optind],"ibn") == 0) ||
(strncasecmp(p,"EMSI_",5) == 0)) {
master = 0;
answermode = argv[optind];
Syslog('S', "Inbound \"%s\" mode", MBSE_SS(answermode));
} else {
Syslog('-', "Callist entry \"%s\"", 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;
} else
WriteError("Unrecognizable address \"%s\"", argv[optind]);
}
optind++;
}
if (callist) {
master = 1;
forcedcalls = 1;
}
/*
The following witchkraft about uid-s is necessary to make
access() work right. Unforunately, access() checks the real
uid, if mbcico is invoked with supervisor real uid (as when
called by uugetty) it returns X_OK for the magic files that
even do not have `x' bit set. Therefore, `reference' magic
file requests are taken for `execute' requests (and the
actual execution natually fails). Here we set real uid equal
to effective. If real uid is not zero, all these fails, but
in this case it is not necessary anyway.
*/
uid=geteuid();
seteuid(0);
setuid(uid);
seteuid(uid);
umask(066); /* packets may contain confidential information */
p = xstrcpy(inbound);
p = xstrcat(p,(char *)"/tmp/fooinb");
mkdirs(p, 0700);
free(p);
maxrc=0;
if (master) {
/*
* Don't do outbound calls if low diskspace
*/
if (!diskfree(CFG.freespace))
die(MBERR_DISK_FULL);
if (callist == NULL) {
WriteError("Calling mbcico without node address not supported anymore");
die(MBERR_COMMANDLINE);
}
for (tmpl = &callist; *tmpl; tmpl = &((*tmpl)->next)) {
callno++;
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)
maxrc=rc;
if (rc == 0) {
succno++;
break;
case 't': p = xstrcpy(optarg);
if (strncmp(p, "ifc", 3) == 0) {
tcp_mode = TCPMODE_IFC;
protocol = xstrcpy((char *)"fido");
} else if (strncmp(p, "itn", 3) == 0) {
tcp_mode = TCPMODE_ITN;
protocol = xstrcpy((char *)"telnet");
} else if (strncmp(p, "ibn", 3) == 0) {
tcp_mode = TCPMODE_IBN;
protocol = xstrcpy((char *)"binkp");
} else {
usage();
die(MBERR_COMMANDLINE);
}
}
// if (callist == NULL)
// if (IsSema((char *)"scanout"))
// RemoveSema((char *)"scanout");
free(p);
RegTCP();
break;
case 'a': inetaddr = optarg;
break;
case 'n': forcedphone = optarg;
break;
default: usage();
die(MBERR_COMMANDLINE);
}
}
/*
* Load rest of the configuration
*/
inbound = xstrcpy(CFG.inbound);
uxoutbound = xstrcpy(CFG.uxpath);
name = xstrcpy(CFG.bbs_name);
phone = xstrcpy(CFG.Phone);
flags = xstrcpy(CFG.Flags);
while (argv[optind]) {
for (p = argv[optind]; (*p) && (*p == '*'); p++);
#ifdef IEMSI
if (strncasecmp(p, "EMSI_NAKEEC3", 12) == 0) {
Syslog('+', "Detected IEMSI client, starting BBS");
sprintf(temp, "%s/bin/mbsebbs", getenv("MBSE_ROOT"));
socket_shutdown(mypid);
if (execl(temp, "mbsebbs", (char *)NULL) == -1)
perror("FATAL: Error loading BBS!");
/*
* If this happens, nothing is logged!
*/
printf("\n\nFATAL: Loading of the BBS failed!\n\n");
sleep(3);
free_mem();
if (envptr)
free(envptr);
#ifdef MEMWATCH
mwTerm();
#endif
exit(MBERROR_EXEC_FAILED);
}
#endif
if ((strcasecmp(argv[optind],"tsync") == 0) ||
(strcasecmp(argv[optind],"yoohoo") == 0) ||
(strcasecmp(argv[optind],"ibn") == 0) ||
(strncasecmp(p,"EMSI_",5) == 0)) {
master = 0;
answermode = argv[optind];
Syslog('S', "Inbound \"%s\" mode", MBSE_SS(answermode));
} else {
/* slave */
if (!answermode && tcp_mode == TCPMODE_IBN)
answermode = xstrcpy((char *)"ibn");
maxrc = answer(answermode);
callno = 1;
succno = (maxrc == 0);
if ((addr = parsefaddr(argv[optind]))) {
immediatecall = TRUE;
master = 1;
} else {
WriteError("Unrecognizable address \"%s\"", argv[optind]);
}
}
optind++;
}
/*
The following witchkraft about uid-s is necessary to make
access() work right. Unforunately, access() checks the real
uid, if mbcico is invoked with supervisor real uid (as when
called by uugetty) it returns X_OK for the magic files that
even do not have `x' bit set. Therefore, `reference' magic
file requests are taken for `execute' requests (and the
actual execution natually fails). Here we set real uid equal
to effective. If real uid is not zero, all these fails, but
in this case it is not necessary anyway.
*/
uid=geteuid();
seteuid(0);
setuid(uid);
seteuid(uid);
umask(066); /* packets may contain confidential information */
p = xstrcpy(inbound);
p = xstrcat(p,(char *)"/tmp/fooinb");
mkdirs(p, 0700);
free(p);
maxrc=0;
if (master) {
/*
* Don't do outbound calls if low diskspace
*/
if (!diskfree(CFG.freespace))
die(MBERR_DISK_FULL);
if (addr == NULL) {
WriteError("Calling mbcico without node address not supported anymore");
die(MBERR_COMMANDLINE);
}
if (callno)
Syslog('+', "%d of %d calls, maxrc=%d",succno,callno,maxrc);
rc = call(addr);
Syslog('+', "Call to %s %s (rc=%d)", ascfnode(addr, 0x1f), rc?"failed":"successful", rc);
if (rc > maxrc)
maxrc=rc;
} else {
/* slave */
if (!answermode && tcp_mode == TCPMODE_IBN)
answermode = xstrcpy((char *)"ibn");
rc = maxrc = answer(answermode);
Syslog('+', "Incoming call %s (rc=%d)", rc?"failed":"successful", rc);
}
tidy_falist(&callist);
if (maxrc)
die(maxrc);
else
die(MBERR_OK);
return 0;
tidy_faddr(addr);
if (maxrc)
die(maxrc);
else
die(MBERR_OK);
return 0;
}

View File

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