revised mailer inbound structure

This commit is contained in:
Michiel Broek
2003-08-23 14:57:51 +00:00
parent 78d5697612
commit df8f8ce324
20 changed files with 450 additions and 279 deletions

View File

@@ -5,7 +5,7 @@
include ../Makefile.global
SRCS = zmmisc.c zmrle.c zmrecv.c zmsend.c binkp.c md5b.c \
xmsend.c xmrecv.c m7recv.c m7send.c hydra.c \
xmsend.c xmrecv.c m7recv.c m7send.c hydra.c inbound.c \
answer.c chat.c dial.c dietifna.c emsidat.c filelist.c \
openfile.c openport.c opentcp.c rdoptions.c yoohoo.c \
recvbark.c respfreq.c sendbark.c tcp.c tcpproto.c wazoo.c \
@@ -14,7 +14,7 @@ SRCS = zmmisc.c zmrle.c zmrecv.c zmsend.c binkp.c md5b.c \
callstat.c session.c call.c mbcico.c \
outstat.c nlinfo.c mbout.c
HDRS = zmodem.h binkp.h config.h statetbl.h md5b.h \
xmsend.h xmrecv.h m7recv.h m7send.h hydra.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 \
openfile.h openport.h opentcp.h rdoptions.h yoohoo.h \
recvbark.h respfreq.h sendbark.h tcp.h tcpproto.h wazoo.h \
@@ -23,7 +23,7 @@ HDRS = zmodem.h binkp.h config.h statetbl.h md5b.h \
callstat.h session.h call.h mbcico.h \
outstat.h nlinfo.h
MBCICO_OBJS = zmmisc.o zmrle.o zmrecv.o zmsend.o binkp.o md5b.o \
xmsend.o xmrecv.o m7recv.o m7send.o hydra.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 \
openfile.o openport.o opentcp.o rdoptions.o yoohoo.o \
recvbark.o respfreq.o sendbark.o tcp.o tcpproto.o wazoo.o \
@@ -91,13 +91,14 @@ zmmisc.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/node
zmrle.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/clcomm.h ../lib/common.h ../lib/nodelist.h ttyio.h session.h zmodem.h
zmrecv.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/clcomm.h ../lib/common.h ../lib/nodelist.h lutil.h ttyio.h session.h zmodem.h config.h emsi.h openfile.h filelist.h openport.h
zmsend.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ttyio.h session.h zmodem.h lutil.h emsi.h filelist.h
binkp.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/dbnode.h ../lib/clcomm.h ../lib/mberrors.h ttyio.h session.h statetbl.h config.h emsi.h openfile.h respfreq.h filelist.h opentcp.h rdoptions.h lutil.h binkp.h config.h md5b.h
binkp.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/dbnode.h ../lib/clcomm.h ../lib/mberrors.h ttyio.h session.h statetbl.h config.h emsi.h openfile.h respfreq.h filelist.h opentcp.h rdoptions.h lutil.h binkp.h config.h md5b.h inbound.h
md5b.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h lutil.h md5b.h
xmsend.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h session.h ttyio.h statetbl.h xmsend.h m7send.h filelist.h filetime.h
xmrecv.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h session.h ttyio.h statetbl.h config.h lutil.h openfile.h m7recv.h xmrecv.h filelist.h filetime.h
m7recv.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h statetbl.h ttyio.h m7recv.h
m7send.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h statetbl.h ttyio.h m7send.h
hydra.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/mberrors.h session.h filelist.h filetime.h ttyio.h statetbl.h config.h emsi.h openfile.h lutil.h respfreq.h mbcico.h hydra.h
inbound.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h inbound.h
answer.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbnode.h ../lib/mberrors.h lutil.h session.h config.h answer.h openport.h portsel.h dial.h rdoptions.h mbcico.h
chat.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h config.h chat.h ttyio.h
dial.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbnode.h ../lib/mberrors.h config.h chat.h ttyio.h session.h dial.h
@@ -116,17 +117,17 @@ tcp.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelis
tcpproto.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/mberrors.h ttyio.h session.h config.h emsi.h lutil.h openfile.h filelist.h tcpproto.h
wazoo.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/mberrors.h ttyio.h session.h statetbl.h config.h emsi.h respfreq.h filelist.h wazoo.h zmodem.h
filetime.o: ../config.h ../lib/libs.h filetime.h
ftsc.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/mberrors.h session.h ttyio.h statetbl.h config.h ftsc.h rdoptions.h recvbark.h filelist.h sendbark.h respfreq.h xmrecv.h xmsend.h
ftsc.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/mberrors.h session.h ttyio.h statetbl.h config.h ftsc.h rdoptions.h recvbark.h filelist.h sendbark.h respfreq.h xmrecv.h xmsend.h inbound.h
atoul.o: ../config.h ../lib/libs.h atoul.h
portsel.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h portsel.h
ttyio.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ttyio.h lutil.h
lutil.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h lutil.h
scanout.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbftn.h config.h scanout.h lutil.h
emsi.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/dbnode.h ../lib/clcomm.h ../lib/mberrors.h ttyio.h session.h statetbl.h config.h emsi.h emsidat.h hydra.h rdoptions.h tcp.h wazoo.h
emsi.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/dbnode.h ../lib/clcomm.h ../lib/mberrors.h ttyio.h session.h statetbl.h config.h emsi.h emsidat.h hydra.h rdoptions.h tcp.h wazoo.h inbound.h
ulock.o: ../config.h ../lib/libs.h ../lib/clcomm.h
callstat.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h callstat.h
session.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/mberrors.h ttyio.h statetbl.h emsi.h ftsc.h session.h yoohoo.h mbcico.h binkp.h callstat.h
call.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbnode.h ../lib/mberrors.h session.h callstat.h call.h config.h dial.h lutil.h portsel.h openport.h opentcp.h rdoptions.h
session.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/nodelist.h ../lib/mberrors.h ttyio.h statetbl.h emsi.h ftsc.h session.h yoohoo.h mbcico.h binkp.h callstat.h inbound.h
call.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbnode.h ../lib/mberrors.h session.h callstat.h call.h config.h dial.h lutil.h portsel.h openport.h opentcp.h rdoptions.h inbound.h
mbcico.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbftn.h ../lib/mberrors.h config.h answer.h call.h lutil.h mbcico.h session.h
outstat.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbftn.h ../lib/mberrors.h scanout.h callstat.h outstat.h
nlinfo.o: ../config.h ../lib/libs.h ../lib/structs.h ../lib/common.h ../lib/nodelist.h ../lib/clcomm.h nlinfo.h

View File

@@ -4,7 +4,7 @@
* Purpose ...............: Fidonet mailer - awnser a call
*
*****************************************************************************
* Copyright (C) 1997-2002
* Copyright (C) 1997-2003
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@@ -96,10 +96,6 @@ int answer(char *stype)
c_start = time(NULL);
rdoptions(FALSE);
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.inbound); /* slave session is unsecure by default */
if (stype == NULL) {
st=SESSION_UNKNOWN;
} else if (strcmp(stype,"tsync") == 0) {

View File

@@ -53,6 +53,7 @@
#include "binkp.h"
#include "config.h"
#include "md5b.h"
#include "inbound.h"
/*
@@ -246,7 +247,7 @@ char *unix2binkp(char *fn)
*q++ = *p;
*q = '\0';
} else {
sprintf(q, "\\%2x", p[0]);
sprintf(q, "\\x%2x", p[0]);
}
while (*q)
q++;
@@ -283,7 +284,8 @@ char *binkp2unix(char *fn)
*q = '\0';
} else {
/*
* If remote sends \x0a method instead of \0a, eat the x character
* If remote sends \x0a method instead of \0a, eat the x character.
* Remotes should send the x character, But some (Argus) don't.
*/
if ((*p == 'x') || (*p == 'X'))
p++;
@@ -847,9 +849,6 @@ SM_STATE(waitaddr)
for (tmpa = remote; tmpa; tmpa = tmpa->next) {
if (((nlent = getnlent(tmpa->addr))) && (nlent->pflag != NL_DUMMY)) {
Syslog('+', "Binkp: remote is a listed system");
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.inbound);
UserCity(mypid, nlent->sysop, nlent->location);
break;
}
@@ -913,6 +912,7 @@ SM_STATE(waitpwd)
SM_STATE(pwdack)
tmpa = remote;
if ((strncmp(&rbuf[1], "CRAM-", 5) == 0) && CRAMflag && Loaded) {
char *sp, *pw;
pw = xstrcpy(nodes.Spasswd);
@@ -929,9 +929,7 @@ SM_STATE(pwdack)
free(sp);
sp = NULL;
Syslog('+', "Binkp: MD5 password OK, protected session");
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.pinbound);
inbound_open(tmpa->addr, TRUE);
binkp_send_control(MM_OK, "secure");
SM_SUCCESS;
}
@@ -942,17 +940,17 @@ SM_STATE(pwdack)
}
} else if ((strcmp(&rbuf[1], "-") == 0) && !Loaded) {
Syslog('+', "Binkp: node not in setup, unprotected session");
inbound_open(tmpa->addr, FALSE);
binkp_send_control(MM_OK, "");
SM_SUCCESS;
} else if ((strcmp(&rbuf[1], "-") == 0) && Loaded && !strlen(nodes.Spasswd)) {
Syslog('+', "Binkp: node in setup but no session password, unprotected session");
inbound_open(tmpa->addr, FALSE);
binkp_send_control(MM_OK, "");
SM_SUCCESS;
} else if ((strcmp(&rbuf[1], nodes.Spasswd) == 0) && Loaded) {
Syslog('+', "Binkp: password OK, protected session");
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.pinbound);
inbound_open(tmpa->addr, TRUE);
binkp_send_control(MM_OK, "secure");
SM_SUCCESS;
} else {
@@ -1364,7 +1362,7 @@ int binkp_batch(file_list *to_send, int role)
rxcrc = rxcrc ^ 0xffffffff;
if (rcrc == rxcrc) {
binkp_send_control(MM_GOT, "%s %ld %ld %lx", rname, rsize, rtime, rcrc);
closefile(TRUE);
closefile();
} else {
rxerror = TRUE;
crc_errors++;
@@ -1376,14 +1374,14 @@ int binkp_batch(file_list *to_send, int role)
RxState = RxDone;
rc = MBERR_FTRANSFER;
}
closefile(FALSE);
closefile();
}
} else {
/*
* ACK without CRC check
*/
binkp_send_control(MM_GOT, "%s %ld %ld", rname, rsize, rtime);
closefile(TRUE);
closefile();
}
rxpos = rxpos - rxbytes;
gettimeofday(&rxtvend, &tz);
@@ -1504,6 +1502,15 @@ int binkp_batch(file_list *to_send, int role)
free(rname);
free(lname);
free(gname);
/*
* If there was an error, try to close a possible incomplete file in
* the temp inbound so we can resume the next time we have a session
* with this node.
*/
if (rc)
closefile();
Syslog('+', "Binkp: batch %d completed rc=%d", batchnr, rc);
return rc;
}

View File

@@ -48,6 +48,8 @@
#include "openport.h"
#include "opentcp.h"
#include "rdoptions.h"
#include "inbound.h"
extern int tcp_mode;
@@ -205,16 +207,13 @@ int call(faddr *addr)
Syslog('?', "Warning: calling non-CM system outside ZMH");
}
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.pinbound); /* master sessions are secure */
inbound_open(addr, TRUE); /* master sessions are secure */
/*
* Call when:
* there is a phone number and node is not down, hold or pvt
* or
* there is a fqdn/ip-address and node is not down or hold
*
* and
* nocall is false
*/

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
@@ -48,6 +48,7 @@
#include "rdoptions.h"
#include "tcp.h"
#include "wazoo.h"
#include "inbound.h"
#define LOCAL_PROTOS (PROT_ZMO | PROT_ZAP | PROT_HYD | PROT_TCP)
@@ -74,7 +75,7 @@ char emsi_remote_comm[4]="8N1";
int rx_emsi(char *data)
{
int rc;
int rc, protect = FALSE;
fa_list *tmr;
int denypw=0;
@@ -135,9 +136,6 @@ int rx_emsi(char *data)
for (tmr = remote; tmr; tmr = tmr->next)
if (((nlent = getnlent(tmr->addr))) && (nlent->pflag != NL_DUMMY)) {
Syslog('+', "Remote is a listed system");
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.inbound);
UserCity(mypid, nlent->sysop, nlent->location);
break;
}
@@ -162,9 +160,7 @@ int rx_emsi(char *data)
if ((strncasecmp(emsi_remote_password, nodes.Spasswd, strlen(nodes.Spasswd)) == 0) &&
(strlen(emsi_remote_password) == strlen(nodes.Spasswd))) {
emsi_local_password = xstrcpy(nodes.Spasswd);
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.pinbound);
protect = TRUE;
Syslog('+', "Password correct, protected EMSI session");
} else {
denypw = 1;
@@ -177,6 +173,7 @@ int rx_emsi(char *data)
Syslog('?', "Unexpected remote password \"%s\"", MBSE_SS(emsi_local_password));
}
inbound_open(remote->addr, protect);
Syslog('i', "local lcodes 0x%04x, protos 0x%04x, opts 0x%04x", emsi_local_lcodes,emsi_local_protos,emsi_local_opts);
if ((rc=txemsi()))

View File

@@ -4,7 +4,7 @@
* Purpose ...............: Fidonet mailer
*
*****************************************************************************
* Copyright (C) 1997-2001
* Copyright (C) 1997-2003
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@@ -49,7 +49,7 @@
#include "respfreq.h"
#include "xmrecv.h"
#include "xmsend.h"
#include "inbound.h"
extern int master;
@@ -375,7 +375,7 @@ SM_NAMES
(char *)"scan_packet",
(char *)"recv_file"
SM_EDECL
int rc=0;
int rc = 0, protect = FALSE;
char recvpktname[16];
char *fpath;
FILE *fp;
@@ -402,9 +402,15 @@ SM_STATE(recv_packet)
SM_STATE(scan_packet)
/*
* We cannot use the temp inbound per node yet, FTS-0001 does it's
* handshake by sending us a .pkt file, we store this in the old
* style ../tmp/ dir in the unprotected inbound.
*/
fpath = xstrcpy(inbound);
fpath = xstrcat(fpath,(char *)"/");
fpath = xstrcat(fpath,recvpktname);
mkdirs(fpath, 0700);
fp = fopen(fpath,"r");
free(fpath);
if (fp == NULL) {
@@ -444,9 +450,6 @@ SM_STATE(scan_packet)
if (((nlent=getnlent(remote->addr))) && (nlent->pflag != NL_DUMMY)) {
Syslog('+', "remote is a listed system");
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.inbound);
strncpy(history.system_name, nlent->name, 35);
strncpy(history.location, nlent->location, 35);
strncpy(history.sysop, nlent->sysop, 35);
@@ -467,11 +470,10 @@ SM_STATE(scan_packet)
*/
if (f.name) {
Syslog('+', "Password correct, protected FTS-0001 session");
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.pinbound);
protect = TRUE;
}
inbound_open(remote->addr, protect);
tosend = create_filelist(remote,(char *)ALL_MAIL,1);
if (rc == 0) {
SM_PROCEED(recv_file);

View File

@@ -5,7 +5,7 @@
* Remark ................: See below for more copyright details and credits.
*
*****************************************************************************
* Copyright (C) 1997-2001
* Copyright (C) 1997-2003
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@@ -1417,7 +1417,7 @@ int hydra_batch(int role, file_list *to_send)
if (rxpos >= 0) {
rxfp = NULL;
if (!closefile(1)) {
if (!closefile()) {
srxpos = rxpos - srxpos;
Syslog('+', "Hydra: OK %s",
@@ -1439,7 +1439,7 @@ int hydra_batch(int role, file_list *to_send)
rxendtime.tv_sec - rxstarttime.tv_sec);
if (rxfp) {
closefile(0);
closefile();
rxfp = NULL;
}
@@ -1447,7 +1447,7 @@ int hydra_batch(int role, file_list *to_send)
}
} else if (longnum == -2) {
if (rxfp) {
closefile(0);
closefile();
rxfp = NULL;
}
@@ -1577,7 +1577,7 @@ int hydra_batch(int role, file_list *to_send)
/* check if file is still open */
if (rxfp) {
rxfp = NULL;
closefile(0);
closefile();
}
Syslog('+', "Hydra: signal CAN to remote");

170
mbcico/inbound.c Normal file
View File

@@ -0,0 +1,170 @@
/*****************************************************************************
*
* $Id$
* File ..................: mbcico/inbound.c
* Purpose ...............: Fidonet mailer, inbound functions
*
*****************************************************************************
* 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 "inbound.h"
extern char *inbound;
extern char *tempinbound;
extern int gotfiles;
/*
* Open the inbound directory, set the temp inbound for the node
* so that this is true multiline safe. All files received from
* the node during the session are stored here.
*/
int inbound_open(faddr *addr, int protected)
{
char *temp;
if (inbound)
free(inbound);
inbound = NULL;
if (protected)
inbound = xstrcpy(CFG.pinbound);
else
inbound = xstrcpy(CFG.inbound);
temp = calloc(PATH_MAX, sizeof(char));
sprintf(temp, "%s/tmp.%d.%d.%d.%d", inbound, addr->zone, addr->net, addr->node, addr->point);
tempinbound = xstrcpy(temp);
sprintf(temp, "%s/foobar", tempinbound);
mkdirs(temp, 0700);
free(temp);
Syslog('+', "Inbound set to \"%s\"", tempinbound);
return 0;
}
/*
* Close the temp inbound, if the session is successfull, move all
* received files to the real inbound, else leave them there for
* the next attempt. Set a semafore if we did receive anything.
* Clean and remove the temp inbound if it is empty.
*/
int inbound_close(int success)
{
DIR *dp;
struct dirent *de;
char *source, *dest;
struct stat stb;
int rc;
Syslog('+', "Closing temp inbound after a %s session", success?"good":"failed");
if (! success) {
if (tempinbound)
free(tempinbound);
return 0;
}
if (tempinbound == NULL) {
Syslog('!', "Temp inbound was not open");
return 0;
}
if ((dp = opendir(tempinbound)) == NULL) {
WriteError("$Can't open %s", tempinbound);
return 1;
}
source = calloc(PATH_MAX, sizeof(char));
dest = calloc(PATH_MAX, sizeof(char));
while ((de = readdir(dp))) {
Syslog('s', "inbound_close() checking \"%s\"", MBSE_SS(de->d_name));
sprintf(source, "%s/%s", tempinbound, de->d_name);
sprintf(dest, "%s/%s", inbound, de->d_name);
if ((lstat(source, &stb) == 0) && (S_ISREG(stb.st_mode))) {
Syslog('s', "Regular file");
if (file_exist(dest, F_OK) == 0) {
Syslog('!', "Cannot move %s to %s, file exists", de->d_name, inbound);
} else {
if ((rc = file_mv(source, dest))) {
WriteError("Can't move %s to %s: %s", source, dest, strerror(rc));
} else {
Syslog('s', "Moved %s to %s", de->d_name, inbound);
gotfiles = TRUE;
}
}
} else {
Syslog('s', "Not a regular file");
}
}
closedir(dp);
free(source);
free(dest);
/*
* Try to clean the temp inbound, if it fails log this, maybe the
* next time it will work.
*/
if ((rc = rmdir(tempinbound))) {
WriteError("Can't remove %s: %s", tempinbound, strerror(rc));
}
free(tempinbound);
tempinbound = NULL;
return 0;
}
/*
* Get the free space size in the temp inbound directory.
*/
long inbound_space(void)
{
struct statfs sfs;
if (statfs(tempinbound, &sfs) != 0) {
Syslog('!', "Cannot statfs \"%s\", assume enough space", tempinbound);
return -1L;
} else
return (sfs.f_bsize * sfs.f_bfree);
}

40
mbcico/inbound.h Normal file
View File

@@ -0,0 +1,40 @@
/*****************************************************************************
*
* $Id$
* File ..................: mbcico/inbound.h
* Purpose ...............: Fidonet mailer, inbound functions
*
*****************************************************************************
* 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.
*****************************************************************************/
#ifndef _INBOUND_H
#define _INBOUND_H
int inbound_open(faddr *, int); /* Open temp inbound */
int inbound_close(int); /* Close temp inbound */
long inbound_space(void); /* Get free inbound space */
#endif

View File

@@ -69,6 +69,7 @@ int Loaded = FALSE;
extern char *myname;
char *inbound;
char *tempinbound = NULL;
char *uxoutbound;
char *name;
char *phone;
@@ -336,11 +337,6 @@ int main(int argc, char *argv[])
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) {
/*

View File

@@ -44,6 +44,7 @@ static time_t intime;
static int isfreq;
char *freqname=NULL;
int gotfiles = FALSE;
extern char *tempinbound;
/*
@@ -57,227 +58,166 @@ int gotfiles = FALSE;
*/
FILE *openfile(char *fname, time_t remtime, off_t remsize, off_t *resofs, int(*resync)(off_t))
{
char *opentype;
char *p, x;
char ctt[32];
int rc, ncount;
struct stat st;
struct flock fl;
char tmpfname[16];
char *opentype, *p, x, ctt[32], tmpfname[16];
int rc, ncount;
struct stat st;
fl.l_type = F_WRLCK;
fl.l_whence = 0;
fl.l_start = 0L;
fl.l_len = 0L;
strcpy(ctt,date(remtime));
strcpy(ctt,date(remtime));
Syslog('S', "openfile(\"%s\",%s,%lu,...)", MBSE_SS(fname), MBSE_SS(ctt),(unsigned long)remsize);
Syslog('s', "openfile(\"%s\",%s,%lu,...)", MBSE_SS(fname), MBSE_SS(ctt),(unsigned long)remsize);
if ((fname == NULL) || (fname[0] == '\0')) {
sprintf(tmpfname,"%08lx.pkt",(unsigned long)sequencer());
fname=tmpfname;
if ((fname == NULL) || (fname[0] == '\0')) {
sprintf(tmpfname,"%08lx.pkt",(unsigned long)sequencer());
fname=tmpfname;
}
if ((strlen(fname) == 12) && (strspn(fname,"0123456789abcdefABCDEF") == 8) && (strcasecmp(fname+8,".req") == 0)) {
Syslog('s', "Received wazoo freq file");
isfreq = TRUE;
} else
isfreq = FALSE;
/*
* First check if the file is already in the inbound directory.
* If it's there, resoffs will be set equal to remsize to signal the
* receiving protocol to skip the file.
*/
infpath = xstrcpy(tempinbound);
infpath = xstrcat(infpath, (char *)"/");
infpath = xstrcat(infpath, fname);
if (stat(infpath, &st) == 0) {
/* FIXME: temp normal logging now! */
Syslog('-', "remtine=%ld, st_time=%ld, remsize=%ld, st_size=%ld", remtime, st.st_mtime, remsize, st.st_size);
if ((remtime == st.st_mtime) && (remsize == st.st_size)) {
Syslog('+', "File %s is already here", fname);
*resofs = st.st_size;
free(infpath);
infpath = NULL;
return NULL;
}
}
/*
* If the file is in the inbound with a zero length, erase the
* file as if it wasn't there at all.
*/
if (((rc = stat(infpath, &st)) == 0) && (st.st_size == 0)) {
Syslog('+', "Zero bytes file in the inbound, unlinking");
unlink(infpath);
}
/*
* If the file is not already in the inbound, but there is a file
* with the same name, the new file will be renamed if the file
* has another timestamp as the file we expect.
*
* Renaming algorythm is as follows: start with the present name,
* increase the last character of the file name, jumping from
* '9' to 'a', from 'z' to 'A', from 'Z' to '0'. If _all_ these
* names are occupied, create random name.
*/
p = infpath + strlen(infpath) -1;
x = *p;
ncount = 0;
while (((rc = stat(infpath, &st)) == 0) && (remtime != st.st_mtime) && (ncount++ < 62)) {
if (x == '9')
x = 'a';
else if (x == 'z')
x = 'A';
else if (x == 'Z')
x = '0';
else
x++;
*p = x;
}
if (ncount >= 62) { /* names exhausted */
rc = 1;
p = strrchr(infpath,'/');
*p = '\0';
sprintf(ctt,"%08lx.doe",(unsigned long)sequencer());
free(infpath);
infpath = xstrcpy(p);
infpath = xstrcat(infpath, ctt);
}
if (ncount)
Syslog('s', "File renamed to %s", infpath);
*resofs = 0L;
opentype = (char *)"w";
if ((rc == 0) && (remsize != 0)) {
Syslog('+', "Resyncing at offset %lu of \"%s\"", (unsigned long)st.st_size, infpath);
if (resync(st.st_size) == 0) {
opentype = (char *)"a";
*resofs = st.st_size;
Syslog('s', "resync == 0");
} else {
Syslog('s', "resync != 0");
}
}
Syslog('s', "try fopen(\"%s\",\"%s\")", infpath, opentype);
if ((strlen(fname) == 12) && (strspn(fname,"0123456789abcdefABCDEF") == 8) && (strcasecmp(fname+8,".req") == 0)) {
Syslog('s', "Received wazoo freq file");
isfreq = TRUE;
} else
isfreq = FALSE;
if ((infp = fopen(infpath, opentype)) == NULL) {
WriteError("$Cannot open local file \"%s\" for \"%s\"", infpath,opentype);
free(infpath);
infpath=NULL;
return NULL;
}
intime = remtime;
/*
* First check if the file is already in the real inbound directory.
* If it's there, resoffs will be set equal to remsize to signal the
* receiving protocol to skip the file.
*/
if (infpath)
free(infpath);
infpath = xstrcpy(inbound);
infpath = xstrcat(infpath, (char *)"/");
infpath = xstrcat(infpath, fname);
if (stat(infpath, &st) == 0) {
/* FIXME: temp normal logging now! */
Syslog('-', "remtine=%ld, st_time=%ld, remsize=%ld, st_size=%ld", remtime, st.st_mtime, remsize, st.st_size);
if (isfreq) {
if (freqname)
free(freqname);
freqname = xstrcpy(infpath);
}
if ((remtime == st.st_mtime) && (remsize == st.st_size)) {
Syslog('+', "File %s is already here", fname);
*resofs = st.st_size;
free(infpath);
infpath = NULL;
return NULL;
}
}
/*
* If the file is not already in the inbound, but there is a file
* with the same name, the new file will be renamed.
*
* If the file is 0 bytes, erase it so it can be received again.
*
* Renaming algorythm is as follows: start with the present name,
* increase the last character of the file name, jumping from
* '9' to 'a', from 'z' to 'A', from 'Z' to '0'. If _all_ these
* names are occupied, create random name.
*/
if (infpath)
free(infpath);
infpath = xstrcpy(inbound);
infpath = xstrcat(infpath, (char *)"/tmp/");
infpath = xstrcat(infpath, fname);
if (((rc = stat(infpath, &st)) == 0) && (st.st_size == 0)) {
Syslog('+', "Zero bytes file in the inbound, unlinking");
unlink(infpath);
}
p = infpath + strlen(infpath) -1;
x = *p;
ncount = 0;
while (((rc = stat(infpath, &st)) == 0) && (remtime != st.st_mtime) && (ncount++ < 62)) {
if (x == '9')
x = 'a';
else if (x == 'z')
x = 'A';
else if (x == 'Z')
x = '0';
else
x++;
*p = x;
}
if (ncount >= 62) { /* names exhausted */
rc = 1;
p = strrchr(infpath,'/');
*p = '\0';
sprintf(ctt,"%08lx.doe",(unsigned long)sequencer());
free(infpath);
infpath = xstrcpy(p);
infpath = xstrcat(infpath, ctt);
}
*resofs = 0L;
opentype = (char *)"w";
if ((rc == 0) && (remsize != 0)) {
Syslog('+', "Resyncing at offset %lu of \"%s\"", (unsigned long)st.st_size, infpath);
if (resync(st.st_size) == 0) {
opentype = (char *)"a";
*resofs = st.st_size;
}
}
Syslog('S', "try fopen(\"%s\",\"%s\")",infpath,opentype);
/*
* If first attempt doesn't succeed, create tmp directory
* and try again.
*/
if ((infp = fopen(infpath,opentype)) == NULL) {
mkdirs(infpath, 0770);
if ((infp = fopen(infpath, opentype)) == NULL) {
WriteError("$Cannot open local file \"%s\" for \"%s\"", infpath,opentype);
free(infpath);
infpath=NULL;
return NULL;
}
}
fl.l_pid = getpid();
if (fcntl(fileno(infp),F_SETLK,&fl) != 0) {
Syslog('+', "$cannot lock local file \"%s\"",infpath);
fclose(infp);
infp = NULL;
free(infpath);
infpath = NULL;
return NULL;
}
intime=remtime;
if (isfreq) {
if (freqname)
free(freqname);
freqname = xstrcpy(infpath);
}
Syslog('S', "opened file \"%s\" for \"%s\", restart at %lu", infpath,opentype,(unsigned long)*resofs);
return infp;
Syslog('s', "opened file \"%s\" for \"%s\", restart at %lu", infpath,opentype,(unsigned long)*resofs);
return infp;
}
/*
* close file and if (success) { move it to the final location }
* close file, even if the file is partial received, we set the date on the
* file so that in a next session we know we must append to that file instead of
* trying to get the file again.
*/
int closefile(int success)
int closefile(void)
{
char *newpath, *p, ctt[32];
int rc=0,ncount;
char x;
struct stat st;
struct utimbuf ut;
int rc = 0;
struct utimbuf ut;
Syslog('S', "closefile(%d), for file \"%s\"",success, MBSE_SS(infpath));
Syslog('s', "closefile(), for file \"%s\"", MBSE_SS(infpath));
if ((infp == NULL) || (infpath == NULL)) {
WriteError("Internal error: try close unopened file!");
return 1;
if ((infp == NULL) || (infpath == NULL)) {
Syslog('+', "closefile(), nothing to close");
return 1;
}
rc = fclose(infp);
infp = NULL;
if (rc == 0) {
ut.actime = intime;
ut.modtime = intime;
if ((rc = utime(infpath,&ut)))
WriteError("$utime failed");
}
if (isfreq) {
if (rc != 0) {
Syslog('+', "Removing unsuccessfuly received wazoo freq");
unlink(freqname);
free(freqname);
freqname=NULL;
}
rc = fclose(infp);
infp = NULL;
if (rc == 0) {
ut.actime = intime;
ut.modtime = intime;
if ((rc = utime(infpath,&ut)))
WriteError("$utime failed");
}
if (isfreq) {
if ((rc != 0) || (!success)) {
Syslog('+', "Removing unsuccessfuly received wazoo freq");
unlink(freqname);
free(freqname);
freqname=NULL;
}
isfreq = FALSE;
} else if ((rc == 0) && success) {
newpath = xstrcpy(inbound);
newpath = xstrcat(newpath, strrchr(infpath,'/'));
p = newpath + strlen(newpath) - 1;
x = *p;
ncount = 0;
while (((rc = stat(newpath, &st)) == 0) && (ncount++ < 62)) {
if (x == '9')
x = 'a';
else if (x == 'z')
x = 'A';
else if (x == 'Z')
x = '0';
else
x++;
*p = x;
}
if (ncount >= 62) { /* names exhausted */
rc = 1;
p = strrchr(newpath,'/');
*p = '\0';
sprintf(ctt,"%08lx.doe",(unsigned long)sequencer());
free(newpath);
newpath = xstrcpy(p);
newpath = xstrcat(newpath, ctt);
}
Syslog('S', "moving \"%s\" -> \"%s\"", MBSE_SS(infpath), MBSE_SS(newpath));
rc = rename(infpath, newpath);
if (rc)
WriteError("$error renaming \"%s\" -> \"%s\"", MBSE_SS(infpath),MBSE_SS(newpath));
else
gotfiles = TRUE;
free(newpath);
}
free(infpath);
infpath = NULL;
return rc;
isfreq = FALSE;
}
free(infpath);
infpath = NULL;
return rc;
}

View File

@@ -1,9 +1,9 @@
/* $Id$ */
#ifndef _OPENFILE_H
#define _OPENFILE_H
FILE *openfile(char *, time_t, off_t, off_t *, int(*)(off_t));
int closefile(int);
int closefile(void);
#endif

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
@@ -46,6 +46,7 @@
#include "mbcico.h"
#include "binkp.h"
#include "callstat.h"
#include "inbound.h"
extern int tcp_mode;
@@ -192,6 +193,7 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
if (nlent->addr.domain)
free(nlent->addr.domain);
inbound_close(rc == 0);
return rc;
}

View File

@@ -284,7 +284,7 @@ static int closeit(int success)
{
int rc;
rc = closefile(success);
rc = closefile();
fout = NULL;
sbytes = rxbytes - sbytes;
gettimeofday(&endtime, &tz);

View File

@@ -4,7 +4,7 @@
* Purpose ...............: Fidonet mailer
*
*****************************************************************************
* Copyright (C) 1997-2001
* Copyright (C) 1997-2003
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@@ -99,7 +99,7 @@ int closeit(int success)
Syslog('+', "Xmodem: dropped after %ld bytes", endofs-startofs);
rcvdbytes += (unsigned long)(endofs-startofs);
fp = NULL;
return closefile(success);
return closefile();
}

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
@@ -123,7 +123,7 @@ Hello gethello2(unsigned char[]);
int rx_yoohoo(void)
{
int rc;
int rc, protect = FALSE;
unsigned short capabilities,localcaps;
char *pwd = NULL;
@@ -163,9 +163,6 @@ int rx_yoohoo(void)
if (((nlent=getnlent(remote->addr))) && (nlent->pflag != NL_DUMMY)) {
Syslog('+', "Remote is a listed system");
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.inbound);
strncpy(history.location, nlent->location, 35);
UserCity(mypid, nlent->sysop, nlent->location);
}
@@ -176,9 +173,7 @@ int rx_yoohoo(void)
if ((strncasecmp((char*)hello2.my_password, nodes.Spasswd, strlen(nodes.Spasswd)) == 0) &&
(strlen((char*)hello2.my_password) == strlen(nodes.Spasswd))) {
Syslog('+', "Password correct, protected mail session");
if (inbound)
free(inbound);
inbound = xstrcpy(CFG.pinbound);
protect = TRUE;
pwd = xstrcpy(nodes.Spasswd);
} else {
if (pwd)
@@ -190,6 +185,8 @@ int rx_yoohoo(void)
} else
Syslog('s', "No YooHoo password check");
inbound_open(remote->addr, protect);
fillhello(localcaps,pwd);
rc = txyoohoo();

View File

@@ -438,7 +438,7 @@ int closeit(int success)
{
int rc;
rc = closefile(success);
rc = closefile();
fout = NULL;
sbytes = rxbytes - sbytes;
gettimeofday(&endtime, &tz);