--- sbbs/src/sbbs3/qwk.cpp 2018/04/24 16:41:23 1.1 +++ sbbs/src/sbbs3/qwk.cpp 2018/04/24 16:43:40 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet QWK packet-related functions */ -/* $Id: qwk.cpp,v 1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: qwk.cpp,v 1.1.1.2 2018/04/24 16:43:40 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 * @@ -63,10 +63,12 @@ bool route_circ(char *via, char *id) { char str[256],*p,*sp; - strcpy(str,via); + if(via==NULL || id==NULL) + return(false); + + SAFECOPY(str,via); p=str; - while(*p && *p<=' ') - p++; + SKIP_WHITESPACE(p); while(*p) { sp=strchr(p,'/'); if(sp) *sp=0; @@ -74,7 +76,8 @@ bool route_circ(char *via, char *id) return(true); if(!sp) break; - p=sp+1; } + p=sp+1; + } return(false); } @@ -97,14 +100,18 @@ int sbbs_t::qwk_route(char *inaddr, char break; if(it) fprintf(stream,"%s %s:%s\r\n" ,unixtodstr(&cfg,qwk_time[i],str),qwk_node[i],qwk_path[i]); - fclose(stream); } + fclose(stream); + } else errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); for(i=0;ibicmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) + if(cfg.prot[i]->bicmd[0] && chk_ar(cfg.prot[i]->ar,&useron,&client)) bi++; /* number of bidirectional protocols configured */ if(useron.rest&FLAG('Q')) getusrsubs(); @@ -432,65 +485,58 @@ void sbbs_t::qwk_sec() && !(useron.rest&FLAG('Q'))) continue; menu("qwk"); - continue; } + continue; + } if(ch=='S') { new_scan_cfg(SUB_CFG_NSCAN); delfiles(cfg.temp_dir,ALLFILES); - continue; } + continue; + } if(ch=='P') { new_scan_ptr_cfg(); for(i=0;iext,cfg.fcomp[i]->ar); + uselect(1,i,text[ArchiveTypeHeading],cfg.fcomp[i]->ext,cfg.fcomp[i]->ar); s=uselect(0,0,0,0,0); if(s>=0) { strcpy(useron.tmpext,cfg.fcomp[s]->ext); - putuserrec(&cfg,useron.number,U_TMPEXT,3,useron.tmpext); } + putuserrec(&cfg,useron.number,U_TMPEXT,3,useron.tmpext); + } break; case 'E': if(!(useron.qwk&(QWK_EMAIL|QWK_ALLMAIL))) useron.qwk|=QWK_EMAIL; else if(useron.qwk&QWK_EMAIL) { useron.qwk&=~QWK_EMAIL; - useron.qwk|=QWK_ALLMAIL; } + useron.qwk|=QWK_ALLMAIL; + } else useron.qwk&=~(QWK_EMAIL|QWK_ALLMAIL); break; + case 'H': + useron.qwk^=QWK_HEADERS; + break; case 'I': useron.qwk^=QWK_ATTACH; break; @@ -551,9 +603,11 @@ void sbbs_t::qwk_sec() useron.qwk^=QWK_EXT; break; } - putuserrec(&cfg,useron.number,U_QWK,8,ultoa(useron.qwk,str,16)); } + putuserrec(&cfg,useron.number,U_QWK,8,ultoa(useron.qwk,str,16)); + } delfiles(cfg.temp_dir,ALLFILES); - continue; } + continue; + } if(ch=='B') { /* Bidirectional QWK and REP packet transfer */ @@ -563,24 +617,27 @@ void sbbs_t::qwk_sec() subscan[i].ptr=sav_ptr[i]; remove(str); last_ns_time=ns_time; - continue; } + continue; + } bprintf(text[UploadingREP],cfg.sys_id); xfer_prot_menu(XFER_BIDIR); mnemonics(text[ProtocolOrQuit]); strcpy(tmp2,"Q"); for(i=0;ibicmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { + if(cfg.prot[i]->bicmd[0] && chk_ar(cfg.prot[i]->ar,&useron,&client)) { sprintf(tmp,"%c",cfg.prot[i]->mnemonic); - strcat(tmp2,tmp); } + strcat(tmp2,tmp); + } ch=(char)getkeys(tmp2,0); if(ch=='Q' || sys_status&SS_ABORT || !online) { for(i=0;ibicmd[0] && cfg.prot[i]->mnemonic==ch - && chk_ar(cfg.prot[i]->ar,&useron)) + && chk_ar(cfg.prot[i]->ar,&useron,&client)) break; if(i0L && cur_cps) + i=l/(ulong)cur_cps; + else + i=0; + bprintf(text[FiTransferTime],sectostr(i,tmp)); + CRLF; + if(!(useron.exempt&FLAG('T')) && i>timeleft) { + bputs(text[NotEnoughTimeToDl]); + break; + } /***************/ /* Send Packet */ /***************/ @@ -671,19 +714,21 @@ void sbbs_t::qwk_sec() mnemonics(text[ProtocolOrQuit]); strcpy(tmp2,"Q"); for(i=0;idlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { + if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron,&client)) { sprintf(tmp,"%c",cfg.prot[i]->mnemonic); - strcat(tmp2,tmp); } + strcat(tmp2,tmp); + } ungetkey(useron.prot); ch=(char)getkeys(tmp2,0); if(ch=='Q' || sys_status&SS_ABORT || !online) { for(i=0;idlcmd[0] && cfg.prot[i]->mnemonic==ch - && chk_ar(cfg.prot[i]->ar,&useron)) + && chk_ar(cfg.prot[i]->ar,&useron,&client)) break; if(iext,useron.tmpext) - && chk_ar(cfg.fextr[k]->ar,&useron)) + && chk_ar(cfg.fextr[k]->ar,&useron,&client)) break; if(k>=cfg.total_fextrs) { bputs(text[QWKExtractionFailed]); - errorlog("Couldn't extract REP packet - configuration error"); - continue; } - -#if 0 /* no such thing as local logon */ - if(online==ON_LOCAL) { /* Local upload of rep packet */ - bputs(text[EnterPath]); - if(!getstr(str,60,K_LINE|K_UPPER)) - continue; - backslashcolon(str); - sprintf(tmp,"%s.rep",cfg.sys_id); - strcat(str,tmp); - sprintf(tmp,"%s%s.rep",cfg.temp_dir,cfg.sys_id); - if(!mv(str,tmp,0)) - unpack_rep(); - delfiles(cfg.temp_dir,ALLFILES); - continue; } -#endif + lprintf(LOG_ERR, "Couldn't extract REP packet - configuration error"); + continue; + } /******************/ /* Receive Packet */ @@ -748,15 +780,16 @@ void sbbs_t::qwk_sec() mnemonics(text[ProtocolOrQuit]); strcpy(tmp2,"Q"); for(i=0;iulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { + if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron,&client)) { sprintf(tmp,"%c",cfg.prot[i]->mnemonic); - strcat(tmp2,tmp); } + strcat(tmp2,tmp); + } ch=(char)getkeys(tmp2,0); if(ch=='Q' || sys_status&SS_ABORT || !online) continue; for(i=0;iulcmd[0] && cfg.prot[i]->mnemonic==ch - && chk_ar(cfg.prot[i]->ar,&useron)) + && chk_ar(cfg.prot[i]->ar,&useron,&client)) break; if(i>=cfg.total_prots) /* This shouldn't happen */ continue; @@ -765,7 +798,8 @@ void sbbs_t::qwk_sec() unpack_rep(); delfiles(cfg.temp_dir,ALLFILES); //autohangup(); - } } + } + } delfiles(cfg.temp_dir,ALLFILES); free(sav_ptr); } @@ -773,23 +807,25 @@ void sbbs_t::qwk_sec() void sbbs_t::qwksetptr(uint subnum, char *buf, int reset) { long l; - ulong last; + uint32_t last; if(buf[2]=='/' && buf[5]=='/') { /* date specified */ l=dstrtounix(&cfg,buf); subscan[subnum].ptr=getmsgnum(subnum,l); - return; } + return; + } l=atol(buf); if(l>=0) /* ptr specified */ subscan[subnum].ptr=l; else if(l) { /* relative ptr specified */ - getlastmsg(subnum,&last,0); + getlastmsg(subnum,&last,/* time_t* */NULL); if(-l>(long)last) subscan[subnum].ptr=0; else - subscan[subnum].ptr=last+l; } + subscan[subnum].ptr=last+l; + } else if(reset) - getlastmsg(subnum,&(subscan[subnum].ptr),0); + getlastmsg(subnum,&(subscan[subnum].ptr),/* time_t* */NULL); } @@ -805,7 +841,7 @@ void sbbs_t::qwkcfgline(char *buf,uint s ulong qwk=useron.qwk; file_t f; - sprintf(str,"%.25s",buf); + sprintf(str,"%-25.25s",buf); /* Note: must be space-padded, left justified */ strupr(str); bprintf("\1n\r\n\1b\1hQWK Control [\1c%s\1b]: \1g%s\r\n" ,subnum==INVALID_SUB ? "Mail":cfg.sub[subnum]->qwkname,str); @@ -822,125 +858,151 @@ void sbbs_t::qwkcfgline(char *buf,uint s if(x>=usrgrps || y>=usrsubs[x]) { bprintf(text[QWKInvalidConferenceN],l); sprintf(str,"Invalid conference number %lu",l); - logline("Q!",str); } + logline(LOG_NOTICE,"Q!",str); + } else - subscan[usrsub[x][y]].cfg&=~SUB_CFG_NSCAN; } - return; } + subscan[usrsub[x][y]].cfg&=~SUB_CFG_NSCAN; + } + return; + } if(!strncmp(str,"ADD YOURS ",10)) { /* Add to new-scan */ subscan[subnum].cfg|=(SUB_CFG_NSCAN|SUB_CFG_YSCAN); qwksetptr(subnum,str+10,0); - return; } + return; + } else if(!strncmp(str,"YOURS ",6)) { subscan[subnum].cfg|=(SUB_CFG_NSCAN|SUB_CFG_YSCAN); qwksetptr(subnum,str+6,0); - return; } + return; + } else if(!strncmp(str,"ADD ",4)) { /* Add to new-scan */ subscan[subnum].cfg|=SUB_CFG_NSCAN; subscan[subnum].cfg&=~SUB_CFG_YSCAN; qwksetptr(subnum,str+4,0); - return; } + return; + } if(!strncmp(str,"RESET ",6)) { /* set msgptr */ qwksetptr(subnum,str+6,1); - return; } + return; + } if(!strncmp(str,"SUBPTR ",7)) { qwksetptr(subnum,str+7,1); - return; } + return; + } } if(!strncmp(str,"RESETALL ",9)) { /* set all ptrs */ for(x=y=0;x=usrlibs) { bprintf("\r\n%s",f.name); - bputs(text[FileNotFound]); } + bputs(text[FileNotFound]); + } else { f.dir=usrdir[x][y]; getfileixb(&cfg,&f); @@ -961,7 +1025,10 @@ void sbbs_t::qwkcfgline(char *buf,uint s if(f.size==-1L) bprintf(text[FileIsNotOnline],f.name); else - addtobatdl(&f); } } + addtobatdl(&f); + } + + } else { attr(cfg.color[clr_err]); @@ -978,13 +1045,12 @@ int sbbs_t::set_qwk_flag(ulong flag) int i; char str[32]; + if(useron.qwk&flag) + return 0; if((i=getuserrec(&cfg,useron.number,U_QWK,8,str))!=0) return(i); useron.qwk=ahtoul(str); useron.qwk|=flag; - if((i=putuserrec(&cfg,useron.number,U_QWK,8,ultoa(useron.qwk,str,16)))!=0) - return(i); - - return(0); + return putuserrec(&cfg,useron.number,U_QWK,8,ultoa(useron.qwk,str,16)); }