--- sbbs/src/sbbs3/readmail.cpp 2018/04/24 16:41:23 1.1 +++ sbbs/src/sbbs3/readmail.cpp 2018/04/24 16:43:22 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet private mail reading function */ -/* $Id: readmail.cpp,v 1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: readmail.cpp,v 1.1.1.2 2018/04/24 16:43:22 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 * @@ -48,6 +48,7 @@ void sbbs_t::readmail(uint usernumber, i int i,j; int error; int mismatches=0,act; + uint unum; long length,l,lm_mode; ulong last; bool replied; @@ -66,14 +67,16 @@ void sbbs_t::readmail(uint usernumber, i if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { errormsg(WHERE,ERR_OPEN,"MAIL",i); - return; } + return; + } sprintf(smb.file,"%smail",cfg.data_dir); smb.retry_time=cfg.smb_retry_time; smb.subnum=INVALID_SUB; if((i=smb_open(&smb))!=0) { smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return; } + return; + } if(cfg.sys_misc&SM_SYSVDELM && (SYSOP || cfg.sys_misc&SM_USRVDELM)) lm_mode=LM_INCDEL; @@ -89,7 +92,8 @@ void sbbs_t::readmail(uint usernumber, i bputs(text[NoMailWaiting]); smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); - return; } + return; + } last=smb.status.last_msg; @@ -123,7 +127,8 @@ void sbbs_t::readmail(uint usernumber, i : msg.from_net.type || msg.to_net.type ? 'N':'*' ,msg.subj); smb_freemsgmem(&msg); - msg.total_hfields=0; } + msg.total_hfields=0; + } ASYNC; if(!(sys_status&SS_ABORT)) { @@ -134,12 +139,17 @@ void sbbs_t::readmail(uint usernumber, i free(mail); smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); - return; } } - sys_status&=~SS_ABORT; } + return; + } + + } + sys_status&=~SS_ABORT; + } else { smb.curmsg=0; if(which==MAIL_ALL) - domsg=0; } + domsg=0; + } if(which==MAIL_SENT) { sprintf(str,"%s read sent mail",useron.alias); logline("E",str); @@ -153,7 +163,8 @@ void sbbs_t::readmail(uint usernumber, i if(useron.misc&RIP) { strcpy(str,which==MAIL_YOUR ? "mailread" : which==MAIL_ALL ? "allmail" : "sentmail"); - menu(str); } + menu(str); + } while(online && !done) { action=act; @@ -168,13 +179,15 @@ void sbbs_t::readmail(uint usernumber, i msg.idx.subj=mail[smb.curmsg].subj; if((i=smb_locksmbhdr(&smb))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - break; } + errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); + break; + } if((i=smb_getstatus(&smb))!=0) { smb_unlocksmbhdr(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); - break; } + errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); + break; + } smb_unlocksmbhdr(&smb); if(smb.status.last_msg!=last) { /* New messages */ @@ -188,12 +201,14 @@ void sbbs_t::readmail(uint usernumber, i break; if(smb.curmsg>=smb.msgs) smb.curmsg=(smb.msgs-1); - continue; } + continue; + } if(!loadmsg(&msg,mail[smb.curmsg].number)) { /* Message header gone */ if(mismatches>5) { /* We can't do this too many times in a row */ errormsg(WHERE,ERR_CHK,"message number",mail[smb.curmsg].number); - break; } + break; + } free(mail); mail=loadmail(&smb,&smb.msgs,usernumber,which,lm_mode); if(!smb.msgs) @@ -201,7 +216,8 @@ void sbbs_t::readmail(uint usernumber, i if(smb.curmsg>(smb.msgs-1)) smb.curmsg=(smb.msgs-1); mismatches++; - continue; } + continue; + } smb_unlockmsghdr(&smb,&msg); msg.idx.attr=msg.hdr.attr; @@ -227,7 +243,7 @@ void sbbs_t::readmail(uint usernumber, i padfname(tp,fd.name); sprintf(str2,"%sfile/%04u.in/%s" /* str2 is path/fname */ ,cfg.data_dir,msg.idx.to,tp); - length=flength(str2); + length=(long)flength(str2); if(length<1) bputs(text[FileNotFound]); else if(!(useron.exempt&FLAG('T')) && cur_cps && !SYSOP @@ -236,38 +252,21 @@ void sbbs_t::readmail(uint usernumber, i else { sprintf(str3,text[DownloadAttachedFileQ] ,tp,ultoac(length,tmp)); - if(length>0L && yesno(str3)) { -#if 0 /* no such thing as local logon */ - if(online==ON_LOCAL) { - bputs(text[EnterPath]); - if(getstr(str3,60,K_LINE)) { - backslashcolon(str3); - sprintf(tmp,"%s%s",str3,tp); - if(!mv(str2,tmp,which!=MAIL_YOUR)) { - logon_dlb+=length; - logon_dls++; - useron.dls=(ushort)adjustuserrec(&cfg,useron.number - ,U_DLS,5,1); - useron.dlb=adjustuserrec(&cfg,useron.number - ,U_DLB,10,length); - bprintf(text[FileNBytesSent] - ,fd.name,ultoac(length,tmp)); } } } - - else -#endif + if(length>0L && text[DownloadAttachedFileQ][0] && yesno(str3)) { { /* Remote User */ xfer_prot_menu(XFER_DOWNLOAD); mnemonics(text[ProtocolOrQuit]); strcpy(str3,"Q"); for(i=0;idlcmd[0] - && chk_ar(cfg.prot[i]->ar,&useron)) { + && chk_ar(cfg.prot[i]->ar,&useron,&client)) { sprintf(tmp,"%c",cfg.prot[i]->mnemonic); - strcat(str3,tmp); } + strcat(str3,tmp); + } ch=(char)getkeys(str3,0); for(i=0;idlcmd[0] && ch==cfg.prot[i]->mnemonic - && chk_ar(cfg.prot[i]->ar,&useron)) + && chk_ar(cfg.prot[i]->ar,&useron,&client)) break; if(i[]{}-+"); + sprintf(str,"ADKFLNQRT?<>[]{}-+"); if(SYSOP) strcat(str,"CUSPH"); if(which!=MAIL_YOUR) @@ -344,7 +351,8 @@ void sbbs_t::readmail(uint usernumber, i if(l==-1) /* ctrl-c */ break; smb.curmsg=(l&~0x80000000L)-1; - continue; } + continue; + } switch(l) { case 'A': /* Auto-reply to last piece */ case 'R': @@ -353,18 +361,19 @@ void sbbs_t::readmail(uint usernumber, i if(which==MAIL_SENT) break; - if((msg.hdr.attr&MSG_ANONYMOUS) && !SYSOP) { - bputs(text[CantReplyToAnonMsg]); - break; } + if((msg.hdr.attr&(MSG_NOREPLY|MSG_ANONYMOUS)) && !SYSOP) { + bputs(text[CantReplyToMsg]); + break; + } - quotemsg(&msg,1); + quotemsg(&msg,/* include tails: */TRUE); if(msg.from_net.addr==NULL) SAFECOPY(str,msg.from); else if(msg.from_net.type==NET_FIDO) /* FidoNet type */ SAFEPRINTF2(str,"%s@%s",msg.from ,smb_faddrtoa((faddr_t *)msg.from_net.addr,tmp)); - else if(msg.from_net.type==NET_INTERNET) { + else if(msg.from_net.type==NET_INTERNET || strchr((char*)msg.from_net.addr,'@')!=NULL) { if(msg.replyto_net.type==NET_INTERNET) SAFECOPY(str,(char *)msg.replyto_net.addr); else @@ -384,12 +393,13 @@ void sbbs_t::readmail(uint usernumber, i sprintf(str2,text[Regarding],msg.subj); else /* Reply to other */ sprintf(str2,text[RegardingByOn],msg.subj,msg.from - ,timestr((time_t *)&msg.hdr.when_written.time)); + ,timestr(msg.hdr.when_written.time)); p=strrchr(str,'@'); if(p) { /* name @addr */ replied=netmail(str,msg.subj,WM_QUOTE); - sprintf(str2,text[DeleteMailQ],msg.from); } + sprintf(str2,text[DeleteMailQ],msg.from); + } else { if(!msg.from_net.type && !stricmp(str,msg.from)) replied=email(msg.idx.from,str2,msg.subj,WM_EMAIL|WM_QUOTE); @@ -399,7 +409,8 @@ void sbbs_t::readmail(uint usernumber, i replied=email(i,str2,msg.subj,WM_EMAIL|WM_QUOTE); else replied=false; - sprintf(str2,text[DeleteMailQ],msg.from); } + sprintf(str2,text[DeleteMailQ],msg.from); + } if(replied==true && !(msg.hdr.attr&MSG_REPLIED)) { if(msg.total_hfields) @@ -411,23 +422,24 @@ void sbbs_t::readmail(uint usernumber, i msg.hdr.attr|=MSG_REPLIED; msg.idx.attr=msg.hdr.attr; if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); + errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); smb_unlockmsghdr(&smb,&msg); } smb_unlocksmbhdr(&smb); } } - if(msg.hdr.attr&MSG_DELETE || !yesno(str2)) { + if(msg.hdr.attr&MSG_DELETE || noyes(str2)) { if(smb.curmsg lastuser(&cfg)) { + bputs(text[UnknownUser]); + domsg=false; + } else + useredit(unum); break; case 'P': /* Purge author and all mail to/from */ - if(noyes(text[AreYouSureQ])) + if(noyes(text[UeditDeleteQ])) break; msg.hdr.number=msg.idx.number; smb_getmsgidx(&smb,&msg); - purgeuser(msg.idx.from); - if(smb.curmsg