--- sbbs/src/sbbs3/pack_rep.cpp 2018/04/24 16:41:23 1.1 +++ sbbs/src/sbbs3/pack_rep.cpp 2018/04/24 16:43:16 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet QWK reply (REP) packet creation routine */ -/* $Id: pack_rep.cpp,v 1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: pack_rep.cpp,v 1.1.1.2 2018/04/24 16:43:16 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -44,24 +44,35 @@ /****************************************************************************/ bool sbbs_t::pack_rep(uint hubnum) { - char str[MAX_PATH+1]; - char tmp[MAX_PATH+1],tmp2[MAX_PATH+1]; - int file,mode; - uint i,j,k; - long l,msgcnt,submsgs,posts,packedmail,netfiles=0,deleted; - long mailmsgs; - ulong last,msgs; - post_t *post; - mail_t *mail; - FILE* rep; - DIR* dir; - DIRENT* dirent; - smbmsg_t msg; + char str[MAX_PATH+1]; + char tmp[MAX_PATH+1],tmp2[MAX_PATH+1]; + char hubid_upper[LEN_QWKID+1]; + char hubid_lower[LEN_QWKID+1]; + int file,mode; + uint i,j,k; + long l,msgcnt,submsgs,packedmail,netfiles=0,deleted; + int32_t posts; + int32_t mailmsgs; + ulong msgs; + uint32_t last; + post_t* post; + mail_t* mail; + FILE* rep; + FILE* hdrs=NULL; + DIR* dir; + DIRENT* dirent; + smbmsg_t msg; msgcnt=0L; delfiles(cfg.temp_dir,ALLFILES); - sprintf(str,"%s%s.rep",cfg.data_dir,cfg.qhub[hubnum]->id); - if(fexist(str)) { + + SAFECOPY(hubid_upper,cfg.qhub[hubnum]->id); + strupr(hubid_upper); + SAFECOPY(hubid_lower,cfg.qhub[hubnum]->id); + strlwr(hubid_lower); + + SAFEPRINTF2(str,"%s%s.REP",cfg.data_dir,hubid_upper); + if(fexistcase(str)) { eprintf(LOG_INFO,"Updating %s", str); external(cmdstr(cfg.qhub[hubnum]->unpack,str,ALLFILES,NULL),EX_OFFLINE); } else @@ -69,26 +80,39 @@ bool sbbs_t::pack_rep(uint hubnum) /*************************************************/ /* Create SYSID.MSG, write header and leave open */ /*************************************************/ - sprintf(str,"%s%s.msg",cfg.temp_dir,cfg.qhub[hubnum]->id); + SAFEPRINTF2(str,"%s%s.MSG",cfg.temp_dir,hubid_upper); + fexistcase(str); if((rep=fnopen(&file,str,O_CREAT|O_WRONLY|O_TRUNC))==NULL) { errormsg(WHERE,ERR_CREATE,str,O_CREAT|O_WRONLY|O_TRUNC); - return(false); } + return(false); + } if(filelength(file)<1) { /* New REP packet */ - sprintf(str,"%-*s" - ,QWK_BLOCK_LEN,cfg.qhub[hubnum]->id); /* So write header */ + SAFEPRINTF2(str,"%-*s" + ,QWK_BLOCK_LEN,hubid_upper); /* So write header */ fwrite(str,QWK_BLOCK_LEN,1,rep); } fseek(rep,0L,SEEK_END); + + /* Always includes HEADERS.DAT in .REP packets which are only for QWKnet hubs */ + /* And *usually* a Synchronet system */ + SAFEPRINTF(str,"%sHEADERS.DAT",cfg.temp_dir); + fexistcase(str); + if((hdrs=fopen(str,"a"))==NULL) + errormsg(WHERE,ERR_CREATE,str,0); + /*********************/ /* Pack new messages */ /*********************/ - sprintf(smb.file,"%smail",cfg.data_dir); + SAFEPRINTF(smb.file,"%smail",cfg.data_dir); smb.retry_time=cfg.smb_retry_time; smb.subnum=INVALID_SUB; if((i=smb_open(&smb))!=0) { fclose(rep); + if(hdrs!=NULL) + fclose(hdrs); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(false); } + return(false); + } /***********************/ /* Pack E-mail, if any */ @@ -108,15 +132,16 @@ bool sbbs_t::pack_rep(uint hubnum) if(!loadmsg(&msg,mail[l].number)) continue; - sprintf(str,"%s/",cfg.qhub[hubnum]->id); + SAFEPRINTF(str,"%s/",cfg.qhub[hubnum]->id); if(msg.to_net.type!=NET_QWK || (strcmp((char *)msg.to_net.addr,cfg.qhub[hubnum]->id) && strncmp((char *)msg.to_net.addr,str,strlen(str)))) { smb_unlockmsghdr(&smb,&msg); smb_freemsgmem(&msg); - continue; } + continue; + } - msgtoqwk(&msg,rep,QM_TO_QNET|QM_REP|A_LEAVE,INVALID_SUB,0); + msgtoqwk(&msg,rep,QM_TO_QNET|QM_REP|A_LEAVE,INVALID_SUB,0,hdrs); packedmail++; smb_unlockmsghdr(&smb,&msg); smb_freemsgmem(&msg); @@ -135,19 +160,22 @@ bool sbbs_t::pack_rep(uint hubnum) if(!msgs || last<=subscan[j].ptr) { if(subscan[j].ptr>last) { subscan[j].ptr=last; - subscan[j].last=last; } + subscan[j].last=last; + } eprintf(LOG_INFO,remove_ctrl_a(text[NScanStatusFmt],tmp) ,cfg.grp[cfg.sub[j]->grp]->sname ,cfg.sub[j]->lname,0L,msgs); - continue; } + continue; + } - sprintf(smb.file,"%s%s" + SAFEPRINTF2(smb.file,"%s%s" ,cfg.sub[j]->data_dir,cfg.sub[j]->code); smb.retry_time=cfg.smb_retry_time; smb.subnum=j; if((k=smb_open(&smb))!=0) { errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error); - continue; } + continue; + } post=loadposts(&posts,j,subscan[j].ptr,LP_BYSELF|LP_OTHERS|LP_PRIVATE|LP_REP); eprintf(LOG_INFO,remove_ctrl_a(text[NScanStatusFmt],tmp) @@ -155,7 +183,8 @@ bool sbbs_t::pack_rep(uint hubnum) ,cfg.sub[j]->lname,posts,msgs); if(!posts) { /* no new messages */ smb_close(&smb); - continue; } + continue; + } subscan[j].ptr=last; /* set pointer */ eprintf(LOG_INFO,"%s",remove_ctrl_a(text[QWKPackingSubboard],tmp)); /* ptr to last msg */ @@ -172,20 +201,22 @@ bool sbbs_t::pack_rep(uint hubnum) !(cfg.sub[j]->misc&SUB_GATE)) { smb_freemsgmem(&msg); smb_unlockmsghdr(&smb,&msg); - continue; } + continue; + } if(!strnicmp(msg.subj,"NE:",3) || (msg.from_net.type==NET_QWK && route_circ((char *)msg.from_net.addr,cfg.qhub[hubnum]->id))) { smb_freemsgmem(&msg); smb_unlockmsghdr(&smb,&msg); - continue; } + continue; + } mode=cfg.qhub[hubnum]->mode[i]|QM_TO_QNET|QM_REP; if(mode&A_LEAVE) mode|=(QM_VIA|QM_TZ|QM_MSGID); if(msg.from_net.type!=NET_QWK) mode|=QM_TAGLINE; - msgtoqwk(&msg,rep,mode,j,cfg.qhub[hubnum]->conf[i]); + msgtoqwk(&msg,rep,mode,j,cfg.qhub[hubnum]->conf[i],hdrs); smb_freemsgmem(&msg); smb_unlockmsghdr(&smb,&msg); @@ -200,20 +231,20 @@ bool sbbs_t::pack_rep(uint hubnum) YIELD(); /* yield */ } + if(hdrs!=NULL) + fclose(hdrs); fclose(rep); /* close HUB_ID.MSG */ CRLF; /* Look for extra files to send out */ - sprintf(str,"%sqnet/%s.out",cfg.data_dir,cfg.qhub[hubnum]->id); - strlwr(str); + SAFEPRINTF2(str,"%sqnet/%s.out",cfg.data_dir,hubid_lower); dir=opendir(str); while(dir!=NULL && (dirent=readdir(dir))!=NULL) { - sprintf(str,"%sqnet/%s.out/%s",cfg.data_dir,cfg.qhub[hubnum]->id,dirent->d_name); - strlwr(str); + SAFEPRINTF3(str,"%sqnet/%s.out/%s",cfg.data_dir,hubid_lower,dirent->d_name); if(isdir(str)) continue; - sprintf(tmp2,"%s%s",cfg.temp_dir,dirent->d_name); + SAFEPRINTF2(tmp2,"%s%s",cfg.temp_dir,dirent->d_name); eprintf(LOG_INFO,remove_ctrl_a(text[RetrievingFile],tmp),str); - if(!mv(str,tmp2,1)) + if(!mv(str,tmp2,/* copy: */TRUE)) netfiles++; } if(dir!=NULL) @@ -229,28 +260,29 @@ bool sbbs_t::pack_rep(uint hubnum) /*******************/ /* Compress Packet */ /*******************/ - sprintf(str,"%s%s.rep",cfg.data_dir,cfg.qhub[hubnum]->id); - sprintf(tmp2,"%s%s",cfg.temp_dir,ALLFILES); + SAFEPRINTF2(str,"%s%s.REP",cfg.data_dir,hubid_upper); + SAFEPRINTF2(tmp2,"%s%s",cfg.temp_dir,ALLFILES); i=external(cmdstr(cfg.qhub[hubnum]->pack,str,tmp2,NULL) ,EX_OFFLINE|EX_WILDCARD); - if(!fexist(str)) { + if(!fexistcase(str)) { eprintf(LOG_WARNING,"%s",remove_ctrl_a(text[QWKCompressionFailed],tmp)); if(i) errormsg(WHERE,ERR_EXEC,cmdstr(cfg.qhub[hubnum]->pack,str,tmp2,NULL),i); else - errorlog("Couldn't compress REP packet"); - return(false); } - sprintf(str,"%sqnet/%s.out/",cfg.data_dir,cfg.qhub[hubnum]->id); - strlwr(str); + lprintf(LOG_ERR, "Couldn't compress REP packet"); + return(false); + } + SAFEPRINTF2(str,"%sqnet/%s.out/",cfg.data_dir,hubid_lower); delfiles(str,ALLFILES); if(packedmail) { /* Delete NetMail */ - sprintf(smb.file,"%smail",cfg.data_dir); + SAFEPRINTF(smb.file,"%smail",cfg.data_dir); smb.retry_time=cfg.smb_retry_time; smb.subnum=INVALID_SUB; if((i=smb_open(&smb))!=0) { errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(true); } + return(true); + } mail=loadmail(&smb,&mailmsgs,0,MAIL_YOUR,0); @@ -259,14 +291,16 @@ bool sbbs_t::pack_rep(uint hubnum) free(mail); smb_close(&smb); errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); /* messes with the index */ - return(true); } + return(true); + } if((i=smb_getstatus(&smb))!=0) { if(mailmsgs) free(mail); smb_close(&smb); errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); - return(true); } + return(true); + } deleted=0; /* Mark as READ and DELETE */ @@ -278,13 +312,14 @@ bool sbbs_t::pack_rep(uint hubnum) if(!loadmsg(&msg,mail[l].number)) continue; - sprintf(str,"%s/",cfg.qhub[hubnum]->id); + SAFEPRINTF(str,"%s/",cfg.qhub[hubnum]->id); if(msg.to_net.type!=NET_QWK || (strcmp((char *)msg.to_net.addr,cfg.qhub[hubnum]->id) && strncmp((char *)msg.to_net.addr,str,strlen(str)))) { smb_unlockmsghdr(&smb,&msg); smb_freemsgmem(&msg); - continue; } + continue; + } msg.hdr.attr|=MSG_DELETE; msg.idx.attr=msg.hdr.attr;