From de6555f1ad0bce2fb497d71b1ca2171193cc185e Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Wed, 3 Dec 2003 11:56:49 +0000 Subject: [PATCH] Fixed the message base corruption bug in movemsg() - finally: was modifying the offset of the original message, which if later deleted (due to the yes/no ques) would corrupt the source message base. Updated brace style. --- src/sbbs3/writemsg.cpp | 453 ++++++++++++++++++++++++++--------------- 1 file changed, 287 insertions(+), 166 deletions(-) diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp index fabd351101..0cd21ee7e4 100644 --- a/src/sbbs3/writemsg.cpp +++ b/src/sbbs3/writemsg.cpp @@ -66,7 +66,8 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum ==NULL) { errormsg(WHERE,ERR_ALLOC,fname ,cfg.level_linespermsg[useron_level]*MAX_LINE_LEN); - return(false); } + return(false); + } if(mode&WM_NETMAIL || (!(mode&(WM_EMAIL|WM_NETMAIL)) && cfg.sub[subnum]->misc&SUB_PNET)) @@ -127,13 +128,15 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum if((stream=fnopen(&file,str,O_RDONLY))==NULL) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); LFREE(buf); - return(false); } + return(false); + } if((file=nopen(msgtmp,O_WRONLY|O_CREAT|O_TRUNC))==-1) { errormsg(WHERE,ERR_OPEN,msgtmp,O_WRONLY|O_CREAT|O_TRUNC); LFREE(buf); fclose(stream); - return(false); } + return(false); + } l=ftell(stream); /* l now points to start of message */ @@ -145,7 +148,8 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum fclose(stream); close(file); LFREE(buf); - return(false); } + return(false); + } if(!i && linesquoted) break; if(!i || quote[0]=='A') { /* Quote all */ @@ -156,8 +160,10 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum quotestr(str); sprintf(tmp,qstr,str); write(file,tmp,strlen(tmp)); - linesquoted++; } - break; } + linesquoted++; + } + break; + } if(quote[0]=='L') { fseek(stream,l,SEEK_SET); i=1; @@ -168,8 +174,10 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum break; quotestr(str); bprintf("%3d: %.74s\r\n",i,str); - i++; } - continue; } + i++; + } + continue; + } if(!isdigit(quote[0])) break; @@ -185,7 +193,8 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum while(!feof(stream) && !ferror(stream) && j<i) { if(!fgets(tmp,255,stream)) break; - j++; } /* skip beginning */ + j++; /* skip beginning */ + } tp=strchr(p,'-'); /* tp for temp pointer */ if(tp) { /* range */ i=atoi(tp+1); @@ -196,38 +205,49 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum sprintf(tmp,qstr,str); write(file,tmp,strlen(tmp)); linesquoted++; - j++; } } + j++; + } + } else { /* one line */ if(fgets(str,255,stream)) { quotestr(str); sprintf(tmp,qstr,str); write(file,tmp,strlen(tmp)); - linesquoted++; } } + linesquoted++; + } + } p=strchr(p,','); // if(!p) p=strchr(p,SP); 02/05/96 huh? - } } + } + } fclose(stream); - close(file); } } + close(file); + } + } else { strcpy(tmp,"QUOTES.TXT"); if(useron.xedit && cfg.xedit[useron.xedit-1]->misc&XTRN_LWRCASE) strlwr(tmp); sprintf(str,"%s%s",cfg.node_dir,tmp); - remove(str); } + remove(str); + } if(!online || sys_status&SS_ABORT) { LFREE(buf); - return(false); } + return(false); + } if(!(mode&WM_EXTDESC)) { if(mode&WM_FILE) { c=12; CRLF; - bputs(text[Filename]); } + bputs(text[Filename]); + } else { c=LEN_TITLE; - bputs(text[SubjectPrompt]); } + bputs(text[SubjectPrompt]); + } if(!(mode&(WM_EMAIL|WM_NETMAIL)) && !(mode&WM_FILE) && cfg.sub[subnum]->misc&(SUB_QNET /* |SUB_PNET */ )) c=25; @@ -236,17 +256,21 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum if(!getstr(title,c,mode&WM_FILE ? K_LINE|K_UPPER : K_LINE|K_EDIT|K_AUTODEL) && useron_level && useron.logons) { LFREE(buf); - return(false); } + return(false); + } if(!(mode&(WM_EMAIL|WM_NETMAIL)) && cfg.sub[subnum]->misc&SUB_QNET && !SYSOP && (!stricmp(title,"DROP") || !stricmp(title,"ADD") || !strnicmp(dest,"SBBS",4))) { LFREE(buf); /* Users can't post DROP or ADD in QWK netted subs */ - return(false); } } /* or messages to "SBBS" */ + return(false); /* or messages to "SBBS" */ + } + } if(!online || sys_status&SS_ABORT) { LFREE(buf); - return(false); } + return(false); + } /* Create WWIV compatible EDITOR.INF file */ @@ -265,14 +289,16 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum if(top[0] && !(mode&WM_NOTOP)) { strcpy((char *)buf,top); strcat((char *)buf,crlf); - l=strlen((char *)buf); } + l=strlen((char *)buf); + } else l=0; while(l<(ulong)(cfg.level_linespermsg[useron_level]*MAX_LINE_LEN)) { c=getkey(0); if(sys_status&SS_ABORT) { /* Ctrl-C */ LFREE(buf); - return(false); } + return(false); + } if((c==ESC || c==CTRL_A) && useron.rest&FLAG('A')) /* ANSI restriction */ continue; if(c==BEL && useron.rest&FLAG('B')) /* Beep restriction */ @@ -280,10 +306,12 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum if(!(console&CON_RAW_IN)) /* Ctrl-Z was hit */ break; outchar(c); - buf[l++]=c; } + buf[l++]=c; + } buf[l]=0; if(l==(ulong)cfg.level_linespermsg[useron_level]*MAX_LINE_LEN) - bputs(text[OutOfBytes]); } + bputs(text[OutOfBytes]); + } else if((online==ON_LOCAL && cfg.node_misc&NM_LCL_EDIT && cfg.node_editor[0]) @@ -293,7 +321,8 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum if(online==ON_REMOTE) ex_mode|=(EX_OUTR|EX_INR); if(cfg.xedit[useron.xedit-1]->misc&WWIVCOLOR) - ex_mode|=EX_WWIV; } + ex_mode|=EX_WWIV; + } if(useron.xedit && cfg.xedit[useron.xedit-1]->misc&XTRN_NATIVE) ex_mode|=EX_NATIVE; if(useron.xedit && cfg.xedit[useron.xedit-1]->misc&XTRN_SH) @@ -303,14 +332,16 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum remove(msgtmp); if(linesquoted) { qlen=flength(msgtmp); - qtime=fdate(msgtmp); } + qtime=fdate(msgtmp); + } if(online==ON_LOCAL) { if(cfg.node_misc&NM_LCL_EDIT && cfg.node_editor[0]) external(cmdstr(cfg.node_editor,msgtmp,nulstr,NULL) ,0,cfg.node_dir); else external(cmdstr(cfg.xedit[useron.xedit-1]->lcmd,msgtmp,nulstr,NULL) - ,ex_mode,cfg.node_dir); } + ,ex_mode,cfg.node_dir); + } else { CLS; @@ -322,24 +353,28 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum if(!fexist(msgtmp) || !online || (linesquoted && qlen==flength(msgtmp) && qtime==fdate(msgtmp))) { LFREE(buf); - return(false); } + return(false); + } buf[0]=0; if(!(mode&WM_NOTOP)) strcpy((char *)buf,top); if((file=nopen(msgtmp,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,msgtmp,O_RDONLY); LFREE(buf); - return(false); } + return(false); + } length=filelength(file); l=strlen((char *)buf); /* reserve space for top and terminating null */ /* truncate if too big */ if(length>(long)((cfg.level_linespermsg[useron_level]*MAX_LINE_LEN)-(l+1))) { length=(cfg.level_linespermsg[useron_level]*MAX_LINE_LEN)-(l+1); - bputs(text[OutOfBytes]); } + bputs(text[OutOfBytes]); + } lread(file,buf+l,length); close(file); // remove(msgtmp); /* no need to save the temp input file */ - buf[l+length]=0; } + buf[l+length]=0; + } else { buf[0]=0; if(linesquoted) { @@ -364,7 +399,8 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum if((stream=fnopen(&file,fname,O_WRONLY|O_CREAT|O_TRUNC))==NULL) { errormsg(WHERE,ERR_OPEN,fname,O_WRONLY|O_CREAT|O_TRUNC); LFREE(buf); - return(false); } + return(false); + } for(l=i=0;buf[l] && i<cfg.level_linespermsg[useron_level];l++) { if((uchar)buf[l]==141 && useron.xedit && cfg.xedit[useron.xedit-1]->misc&QUICKBBS) { @@ -395,7 +431,8 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum buf[l+1]='+'; if(buf[l]==LF) i++; - fputc(buf[l],stream); } + fputc(buf[l],stream); + } if(buf[l]) bputs(text[NoMoreLines]); @@ -448,7 +485,8 @@ void sbbs_t::editor_inf(int xeditnum,char *dest, char *title, long mode sprintf(str,"%sMSGINF",cfg.node_dir); if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } + return; + } sprintf(str,"%s\r\n%s\r\n%s\r\n%u\r\n%s\r\n%s\r\n" ,(subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_NAME) ? useron.name : useron.alias @@ -459,7 +497,8 @@ void sbbs_t::editor_inf(int xeditnum,char *dest, char *title, long mode :cfg.sub[subnum]->sname ,mode&WM_PRIVATE ? "YES":"NO"); write(file,str,strlen(str)); - close(file); } + close(file); + } else { strcpy(tmp,"EDITOR.INF"); if(useron.xedit && cfg.xedit[useron.xedit-1]->misc&XTRN_LWRCASE) @@ -467,14 +506,16 @@ void sbbs_t::editor_inf(int xeditnum,char *dest, char *title, long mode sprintf(str,"%s%s",cfg.node_dir,tmp); if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } + return; + } sprintf(str,"%s\r\n%s\r\n%u\r\n%s\r\n%s\r\n%u\r\n" ,title,dest,useron.number ,(subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_NAME) ? useron.name : useron.alias ,useron.name,useron.level); write(file,str,strlen(str)); - close(file); } + close(file); + } } @@ -493,37 +534,47 @@ void sbbs_t::removeline(char *str, char *str2, char num, char skip) if((file=nopen(str,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } + return; + } flen=filelength(file); slen=strlen(str2); if((buf=(char *)MALLOC(flen))==NULL) { close(file); errormsg(WHERE,ERR_ALLOC,str,flen); - return; } + return; + } if(lread(file,buf,flen)!=flen) { close(file); errormsg(WHERE,ERR_READ,str,flen); FREE(buf); - return; } + return; + } close(file); if((stream=fnopen(&file,str,O_WRONLY|O_TRUNC))==NULL) { close(file); errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC); FREE(buf); - return; } + return; + } for(i=0;l<flen && i<skip;l++) { fputc(buf[l],stream); if(buf[l]==LF) - i++; } + i++; + } while(l<flen) { if(!strncmp((char *)buf+l,str2,slen)) { for(i=0;i<num && l<flen;i++) { while(l<flen && buf[l]!=LF) l++; - l++; } } + l++; + } + } else { for(i=0;i<num && l<flen;i++) { while(l<flen && buf[l]!=LF) fputc(buf[l++],stream); - fputc(buf[l++],stream); } } } + fputc(buf[l++],stream); + } + } + } fclose(stream); FREE((char *)buf); } @@ -542,13 +593,15 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) if(online==ON_REMOTE) { rioctl(IOCM|ABORT); - rioctl(IOCS|ABORT); } + rioctl(IOCS|ABORT); + } maxlines=cfg.level_linespermsg[useron.level]; if((str=(char **)MALLOC(sizeof(char *)*(maxlines+1)))==NULL) { errormsg(WHERE,ERR_ALLOC,"msgeditor",sizeof(char *)*(maxlines+1)); - return(0); } + return(0); + } m=strlen(buf); l=0; while(l<m && lines<maxlines) { @@ -560,11 +613,13 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) FREE(str); if(online==ON_REMOTE) rioctl(IOSM|ABORT); - return(0); } + return(0); + } for(i=0;i<79 && l<m;i++,l++) { if(buf[l]==CR) { l+=2; - break; } + break; + } if(buf[l]==TAB) { if(!(i%8)) /* hard-coded tabstop of 8 */ str[lines][i++]=SP; /* for expansion */ @@ -618,13 +673,16 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) for(i=0;i<lines;i++) FREE(str[i]); FREE(str); - return(0); } - str[line][0]=0; } + return(0); + } + str[line][0]=0; + } if(line>(maxlines-10)) { if(line==maxlines) bputs(text[NoMoreLines]); else - bprintf(text[OnlyNLinesLeft],maxlines-line); } + bprintf(text[OnlyNLinesLeft],maxlines-line); + } strcpy(strin,str[line]); do { if(!line) @@ -635,20 +693,23 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) if(sys_status&SS_ABORT) { if(line==lines) FREE(str[line]); - continue; } + continue; + } if(strin[0]=='/' && strlen(strin)<8) { if(!stricmp(strin,"/DEBUG") && SYSOP) { if(line==lines) FREE(str[line]); bprintf("\r\nline=%d lines=%d rows=%d\r\n",line,lines,rows); - continue; } + continue; + } else if(!stricmp(strin,"/ABT")) { if(line==lines) /* delete a line */ FREE(str[line]); for(i=0;i<lines;i++) FREE(str[i]); FREE(str); - return(0); } + return(0); + } else if(toupper(strin[1])=='D') { if(line==lines) /* delete a line */ FREE(str[line]); @@ -664,10 +725,13 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) lines--; while(i<lines) { str[i]=str[i+1]; - i++; } + i++; + } if(line>lines) - line=lines; } - continue; } + line=lines; + } + continue; + } else if(toupper(strin[1])=='I') { if(line==lines) /* insert a line before number x */ FREE(str[line]); @@ -686,10 +750,13 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) for(i=0;i<lines;i++) FREE(str[i]); FREE(str); - return(0); } + return(0); + } str[i][0]=0; - line=++lines; } - continue; } + line=++lines; + } + continue; + } else if(toupper(strin[1])=='E') { if(line==lines) /* edit a line */ FREE(str[line]); @@ -699,12 +766,14 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) j=K_MSG|K_EDIT; /* use j for the getstr mode */ if(i==-1) { /* /E means edit last line */ i=lines-1; - j|=K_WRAP; } /* wrap when editing last line */ + j|=K_WRAP; /* wrap when editing last line */ + } if(i>=lines || i<0) bputs(text[InvalidLineNumber]); else getstr(str[i],79,j); - continue; } + continue; + } else if(!stricmp(strin,"/CLR")) { bputs(text[MsgCleared]); if(line!=lines) @@ -714,7 +783,8 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) line=0; lines=0; putmsg(top,P_SAVEATR|P_NOATCODES); - continue; } + continue; + } else if(toupper(strin[1])=='L') { /* list message */ if(line==lines) FREE(str[line]); @@ -726,20 +796,24 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) attr(LIGHTGRAY); putmsg(top,P_SAVEATR|P_NOATCODES); if(!lines) { - continue; } + continue; + } j=atoi(strin+2); if(j) j--; /* start from line j */ while(j<lines && !msgabort()) { if(i) { /* line numbers */ sprintf(tmp,"%3d: %-.74s",j+1,str[j]); - putmsg(tmp,P_SAVEATR|P_NOATCODES); } + putmsg(tmp,P_SAVEATR|P_NOATCODES); + } else putmsg(str[j],P_SAVEATR|P_NOATCODES); cleartoeol(); /* delete to end of line */ CRLF; - j++; } + j++; + } SYNC; - continue; } + continue; + } else if(!stricmp(strin,"/S")) { /* Save */ if(line==lines) FREE(str[line]); @@ -752,20 +826,25 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) bputs(text[SubjectPrompt]); getstr(title,LEN_TITLE,K_LINE|K_EDIT|K_AUTODEL); SYNC; - CRLF; } - continue; } + CRLF; + } + continue; + } else if(!stricmp(strin,"/?")) { if(line==lines) FREE(str[line]); menu("editor"); /* User Editor Commands */ SYNC; - continue; } + continue; + } else if(!stricmp(strin,"/ATTR")) { if(line==lines) FREE(str[line]); menu("attr"); /* User ANSI Commands */ SYNC; - continue; } } + continue; + } + } strcpy(str[line],strin); if(line<maxlines) line++; @@ -777,7 +856,8 @@ ulong sbbs_t::msgeditor(char *buf, char *top, char *title) outchar(CR); cursor_up(); cleartoeol(); - line-=2; } + line-=2; + } } if(!online) { for(i=0;i<lines;i++) @@ -810,7 +890,8 @@ void sbbs_t::editfile(char *str) remove(str2); if(cfg.node_editor[0] && online==ON_LOCAL) { external(cmdstr(cfg.node_editor,str,nulstr,NULL),0,cfg.node_dir); - return; } + return; + } if(useron.xedit) { editor_inf(useron.xedit,nulstr,nulstr,0,INVALID_SUB); if(cfg.xedit[useron.xedit-1]->misc&XTRN_NATIVE) @@ -821,7 +902,8 @@ void sbbs_t::editfile(char *str) if(online==ON_REMOTE) mode|=(EX_OUTR|EX_INR); if(cfg.xedit[useron.xedit-1]->misc&WWIVCOLOR) - mode|=EX_WWIV; } + mode|=EX_WWIV; + } if(online==ON_LOCAL) external(cmdstr(cfg.xedit[useron.xedit-1]->lcmd,str,nulstr,NULL),mode,cfg.node_dir); else { @@ -830,10 +912,12 @@ void sbbs_t::editfile(char *str) external(cmdstr(cfg.xedit[useron.xedit-1]->rcmd,str,nulstr,NULL),mode,cfg.node_dir); rioctl(IOSM|PAUSE|ABORT); } - return; } + return; + } if((buf=(char *)MALLOC(maxlines*MAX_LINE_LEN))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,maxlines*MAX_LINE_LEN); - return; } + return; + } if((file=nopen(str,O_RDONLY))!=-1) { length=filelength(file); if(length>(long)maxlines*MAX_LINE_LEN) { @@ -841,30 +925,37 @@ void sbbs_t::editfile(char *str) bprintf("\7\r\nFile size (%lu bytes) is larger than (%lu).\r\n" ,length,(ulong)maxlines*MAX_LINE_LEN); close(file); - FREE(buf); } + FREE(buf); + } if(read(file,buf,length)!=length) { close(file); FREE(buf); errormsg(WHERE,ERR_READ,str,length); - return; } + return; + } buf[length]=0; - close(file); } + close(file); + } else { buf[0]=0; - bputs(text[NewFile]); } + bputs(text[NewFile]); + } if(!msgeditor(buf,nulstr,nulstr)) { FREE(buf); - return; } + return; + } bputs(text[Saving]); if((file=nopen(str,O_CREAT|O_WRONLY|O_TRUNC))==-1) { errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_TRUNC); FREE(buf); - return; } + return; + } if((size_t)write(file,buf,strlen(buf))!=strlen(buf)) { close(file); errormsg(WHERE,ERR_WRITE,str,strlen(buf)); FREE(buf); - return; } + return; + } for(l=lines=0;buf[l];l++) if(buf[l]==LF) lines++; @@ -897,7 +988,8 @@ void sbbs_t::copyfattach(uint to, uint from, char *title) mv(str3,str2,1); if(!p) break; - tp=p+1; } + tp=p+1; + } } @@ -916,16 +1008,20 @@ void sbbs_t::forwardmail(smbmsg_t *msg, int usernumber) if(useron.etoday>=cfg.level_emailperday[useron.level] && !SYSOP) { bputs(text[TooManyEmailsToday]); - return; } + return; + } if(useron.rest&FLAG('F')) { bputs(text[R_Forward]); - return; } + return; + } if(usernumber==1 && useron.rest&FLAG('S')) { bprintf(text[R_Feedback],cfg.sys_op); - return; } + return; + } if(usernumber!=1 && useron.rest&FLAG('E')) { bputs(text[R_Email]); - return; } + return; + } msg->idx.attr&=~(MSG_READ|MSG_DELETE); msg->hdr.attr=msg->idx.attr; @@ -947,16 +1043,19 @@ void sbbs_t::forwardmail(smbmsg_t *msg, int usernumber) if((i=smb_open_da(&smb))!=0) { errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return; } + return; + } if((i=smb_incmsg_dfields(&smb,msg,1))!=0) { errormsg(WHERE,ERR_WRITE,smb.file,i); - return; } + return; + } smb_close_da(&smb); if((i=smb_addmsghdr(&smb,msg,SMB_SELFPACK))!=0) { errormsg(WHERE,ERR_WRITE,smb.file,i); - return; } + return; + } if(msg->hdr.auxattr&MSG_FILEATTACH) copyfattach(usernumber,useron.number,msg->subj); @@ -974,11 +1073,13 @@ void sbbs_t::forwardmail(smbmsg_t *msg, int usernumber) if(usernumber==1) { useron.fbacks++; logon_fbacks++; - putuserrec(&cfg,useron.number,U_FBACKS,5,ultoa(useron.fbacks,tmp,10)); } + putuserrec(&cfg,useron.number,U_FBACKS,5,ultoa(useron.fbacks,tmp,10)); + } else { useron.emails++; logon_emails++; - putuserrec(&cfg,useron.number,U_EMAILS,5,ultoa(useron.emails,tmp,10)); } + putuserrec(&cfg,useron.number,U_EMAILS,5,ultoa(useron.emails,tmp,10)); + } useron.etoday++; putuserrec(&cfg,useron.number,U_ETODAY,5,ultoa(useron.etoday,tmp,10)); @@ -988,10 +1089,13 @@ void sbbs_t::forwardmail(smbmsg_t *msg, int usernumber) && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { sprintf(str,text[EmailNodeMsg],cfg.node_num,useron.alias); putnmsg(&cfg,i,str); - break; } } + break; + } + } if(i>cfg.sys_nodes) { /* User wasn't online, so leave short msg */ sprintf(str,text[UserSentYouMail],useron.alias); - putsmsg(&cfg,usernumber,str); } + putsmsg(&cfg,usernumber,str); + } } /****************************************************************************/ @@ -1016,7 +1120,8 @@ void sbbs_t::automsg() case 'W': if(useron.rest&FLAG('W')) { bputs(text[R_AutoMsg]); - break; } + break; + } action=NODE_AMSG; SYNC; bputs("\r\n3 lines:\r\n"); @@ -1033,10 +1138,12 @@ void sbbs_t::automsg() if(yesno(text[OK])) { if(useron.exempt&FLAG('A')) { if(!noyes(text[AnonymousQ])) - anon=1; } + anon=1; + } if((file=nopen(automsg,O_WRONLY|O_CREAT|O_TRUNC))==-1) { errormsg(WHERE,ERR_OPEN,automsg,O_WRONLY|O_CREAT|O_TRUNC); - return; } + return; + } if(anon) sprintf(tmp,"%.80s",text[Anonymous]); else @@ -1045,10 +1152,13 @@ void sbbs_t::automsg() strcat(str," "); write(file,str,strlen(str)); write(file,buf,strlen(buf)); - close(file); } + close(file); + } break; case 'Q': - return; } } + return; + } + } } /****************************************************************************/ @@ -1081,11 +1191,13 @@ void sbbs_t::editmsg(smbmsg_t *msg, uint subnum) if((i=smb_locksmbhdr(&smb))!=0) { errormsg(WHERE,ERR_LOCK,smb.file,i); - return; } + return; + } if((i=smb_getstatus(&smb))!=0) { errormsg(WHERE,ERR_READ,smb.file,i); - return; } + return; + } if(!(smb.status.attr&SMB_HYPERALLOC)) { if((i=smb_open_da(&smb))!=0) { @@ -1102,18 +1214,20 @@ void sbbs_t::editmsg(smbmsg_t *msg, uint subnum) for(x=1;x<msg->hdr.total_dfields;x++) { /* Clear the other data fields */ msg->dfield[x].type=UNUSED; /* so we leave the header length */ msg->dfield[x].length=0; /* unchanged */ - msg->dfield[x].offset=0; } + msg->dfield[x].offset=0; + } - if(smb.status.attr&SMB_HYPERALLOC) { - offset=smb_hallocdat(&smb); } + if(smb.status.attr&SMB_HYPERALLOC) + offset=smb_hallocdat(&smb); else { if((subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_FAST) || (subnum==INVALID_SUB && cfg.sys_misc&SM_FASTMAIL)) offset=smb_fallocdat(&smb,length,1); else offset=smb_allocdat(&smb,length,1); - smb_close_da(&smb); } + smb_close_da(&smb); + } msg->hdr.offset=offset; if((file=open(msgtmp,O_RDONLY|O_BINARY))==-1 @@ -1121,7 +1235,8 @@ void sbbs_t::editmsg(smbmsg_t *msg, uint subnum) smb_unlocksmbhdr(&smb); smb_freemsgdat(&smb,offset,length,1); errormsg(WHERE,ERR_OPEN,msgtmp,O_RDONLY|O_BINARY); - return; } + return; + } setvbuf(instream,NULL,_IOFBF,2*1024); fseek(smb.sdt_fp,offset,SEEK_SET); @@ -1136,7 +1251,8 @@ void sbbs_t::editmsg(smbmsg_t *msg, uint subnum) if(j>1 && (j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) buf[j-1]=buf[j-2]=0; /* Convert to NULL */ fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } + x=SDT_BLOCK_LEN; + } fflush(smb.sdt_fp); fclose(instream); @@ -1155,6 +1271,8 @@ bool sbbs_t::movemsg(smbmsg_t* msg, uint subnum) uint i; int newgrp,newsub,storage; ulong offset,length; + smbmsg_t newmsg=*msg; + smb_t newsmb; for(i=0;i<usrgrps;i++) /* Select New Group */ uselect(1,i,"Message Group",cfg.grp[usrgrp[i]]->lname,0); @@ -1170,85 +1288,86 @@ bool sbbs_t::movemsg(smbmsg_t* msg, uint subnum) length=smb_getmsgdatlen(msg); if((buf=(char *)MALLOC(length))==NULL) { errormsg(WHERE,ERR_ALLOC,smb.file,length); - return(false); } + return(false); + } fseek(smb.sdt_fp,msg->hdr.offset,SEEK_SET); fread(buf,length,1,smb.sdt_fp); - if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { + sprintf(newsmb.file,"%s%s",cfg.sub[newsub]->data_dir,cfg.sub[newsub]->code); + newsmb.retry_time=cfg.smb_retry_time; + newsmb.subnum=newsub; + if((i=smb_open(&newsmb))!=0) { FREE(buf); - errormsg(WHERE,ERR_OPEN,cfg.sub[newsub]->code,i); - return(false); } + errormsg(WHERE,ERR_OPEN,newsmb.file,i,newsmb.last_error); + return(false); + } - sprintf(smb.file,"%s%s",cfg.sub[newsub]->data_dir,cfg.sub[newsub]->code); - smb.retry_time=cfg.smb_retry_time; - smb.subnum=newsub; - if((i=smb_open(&smb))!=0) { - FREE(buf); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(false); } - - if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ - smb.status.max_crcs=cfg.sub[newsub]->maxcrcs; - smb.status.max_msgs=cfg.sub[newsub]->maxmsgs; - smb.status.max_age=cfg.sub[newsub]->maxage; - smb.status.attr=cfg.sub[newsub]->misc&SUB_HYPER ? SMB_HYPERALLOC :0; - if((i=smb_create(&smb))!=0) { + if(filelength(fileno(newsmb.shd_fp))<1) { /* Create it if it doesn't exist */ + newsmb.status.max_crcs=cfg.sub[newsub]->maxcrcs; + newsmb.status.max_msgs=cfg.sub[newsub]->maxmsgs; + newsmb.status.max_age=cfg.sub[newsub]->maxage; + newsmb.status.attr=cfg.sub[newsub]->misc&SUB_HYPER ? SMB_HYPERALLOC :0; + if((i=smb_create(&newsmb))!=0) { FREE(buf); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - return(false); } } + smb_close(&newsmb); + errormsg(WHERE,ERR_CREATE,newsmb.file,i,newsmb.last_error); + return(false); + } + } - if((i=smb_locksmbhdr(&smb))!=0) { + if((i=smb_locksmbhdr(&newsmb))!=0) { FREE(buf); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(false); } + smb_close(&newsmb); + errormsg(WHERE,ERR_LOCK,newsmb.file,i,newsmb.last_error); + return(false); + } - if((i=smb_getstatus(&smb))!=0) { + if((i=smb_getstatus(&newsmb))!=0) { FREE(buf); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_READ,smb.file,i); - return(false); } + smb_close(&newsmb); + errormsg(WHERE,ERR_READ,newsmb.file,i,newsmb.last_error); + return(false); + } - if(smb.status.attr&SMB_HYPERALLOC) { - offset=smb_hallocdat(&smb); - storage=SMB_HYPERALLOC; } + if(newsmb.status.attr&SMB_HYPERALLOC) { + offset=smb_hallocdat(&newsmb); + storage=SMB_HYPERALLOC; + } else { - if((i=smb_open_da(&smb))!=0) { + if((i=smb_open_da(&newsmb))!=0) { FREE(buf); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(false); } + smb_close(&newsmb); + errormsg(WHERE,ERR_OPEN,newsmb.file,i,newsmb.last_error); + return(false); + } if(cfg.sub[newsub]->misc&SUB_FAST) { - offset=smb_fallocdat(&smb,length,1); - storage=SMB_FASTALLOC; } + offset=smb_fallocdat(&newsmb,length,1); + storage=SMB_FASTALLOC; + } else { - offset=smb_allocdat(&smb,length,1); - storage=SMB_SELFPACK; } - smb_close_da(&smb); } + offset=smb_allocdat(&newsmb,length,1); + storage=SMB_SELFPACK; + } + smb_close_da(&newsmb); + } - msg->hdr.offset=offset; - msg->hdr.version=smb_ver(); + newmsg.hdr.offset=offset; + newmsg.hdr.version=smb_ver(); - fseek(smb.sdt_fp,offset,SEEK_SET); - fwrite(buf,length,1,smb.sdt_fp); - fflush(smb.sdt_fp); + fseek(newsmb.sdt_fp,offset,SEEK_SET); + fwrite(buf,length,1,newsmb.sdt_fp); + fflush(newsmb.sdt_fp); FREE(buf); - i=smb_addmsghdr(&smb,msg,storage); // calls smb_unlocksmbhdr() - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); + i=smb_addmsghdr(&newsmb,&newmsg,storage); // calls smb_unlocksmbhdr() + smb_close(&newsmb); if(i) { - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_WRITE,smb.file,i); - return(false); } + smb_freemsgdat(&newsmb,offset,length,1); + errormsg(WHERE,ERR_WRITE,newsmb.file,i,newsmb.last_error); + return(false); + } bprintf("\r\nMoved to %s %s\r\n\r\n" ,cfg.grp[usrgrp[newgrp]]->sname,cfg.sub[newsub]->lname); @@ -1302,6 +1421,8 @@ ushort sbbs_t::chmsgattr(ushort attr) attr^=MSG_LOCKED; break; default: - return(attr); } } + return(attr); + } + } return(attr); } -- GitLab