mail_t* DLLCALL loadmail(smb_t* smb, long* msgs, uint usernumber ,int which, long mode) { ulong l=0; idxrec_t idx; mail_t* mail=NULL; if(msgs==NULL) return(NULL); *msgs=0; if(smb==NULL) return(NULL); if(smb_locksmbhdr(smb)!=0) /* Be sure noone deletes or */ return(NULL); /* adds while we're reading */ smb_rewind(smb->sid_fp); while(!smb_feof(smb->sid_fp)) { if(smb_fread(smb,&idx,sizeof(idx),smb->sid_fp) != sizeof(idx)) break; if(idx.number==0) /* invalid message number, ignore */ continue; if((which==MAIL_SENT && idx.from!=usernumber) || (which==MAIL_YOUR && idx.to!=usernumber) || (which==MAIL_ANY && idx.from!=usernumber && idx.to!=usernumber)) continue; if(idx.attr&MSG_DELETE && !(mode&LM_INCDEL)) /* Don't included deleted msgs */ continue; if(mode&LM_UNREAD && idx.attr&MSG_READ) continue; if((mail=(mail_t *)realloc(mail,sizeof(mail_t)*(l+1))) ==NULL) { smb_unlocksmbhdr(smb); return(NULL); } mail[l]=idx; l++; } smb_unlocksmbhdr(smb); *msgs=l; return(mail); }
int sbbs_t::delmail(uint usernumber, int which) { ulong i,l; time_t now; idxrec_t *idxbuf; smbmsg_t msg; now=time(NULL); if((i=smb_getstatus(&smb))!=0) { errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); return(2); } if(!smb.status.total_msgs) return(0); if((idxbuf=(idxrec_t *)malloc(smb.status.total_msgs*sizeof(idxrec_t)))==NULL) { errormsg(WHERE,ERR_ALLOC,smb.file,smb.status.total_msgs*sizeof(idxrec_t)); return(-1); } if((i=smb_open_da(&smb))!=0) { errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); free(idxbuf); return(i); } if((i=smb_open_ha(&smb))!=0) { smb_close_da(&smb); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); free(idxbuf); return(i); } smb_rewind(smb.sid_fp); for(l=0;l<smb.status.total_msgs;) { if(smb_fread(&smb,&msg.idx,sizeof(idxrec_t),smb.sid_fp)!=sizeof(idxrec_t)) break; if(!(msg.idx.attr&MSG_PERMANENT) && ((which==MAIL_SENT && usernumber==msg.idx.from) || (which==MAIL_YOUR && usernumber==msg.idx.to) || (which==MAIL_ANY && (usernumber==msg.idx.to || usernumber==msg.idx.from)) || which==MAIL_ALL)) { if(smb.status.max_age && (now<0?0:(uintmax_t)now)>msg.idx.time && (now-msg.idx.time)/(24L*60L*60L)>smb.status.max_age) msg.idx.attr|=MSG_DELETE; else if(msg.idx.attr&MSG_KILLREAD && msg.idx.attr&MSG_READ) msg.idx.attr|=MSG_DELETE; if(msg.idx.attr&MSG_DELETE) { /* Don't need to lock message because base is locked */ if((i=smb_getmsghdr(&smb,&msg))!=0) errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); else { if(msg.hdr.attr!=msg.idx.attr) { msg.hdr.attr=msg.idx.attr; if((i=smb_putmsghdr(&smb,&msg))!=0) errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); } if((i=smb_freemsg(&smb,&msg))!=0) errormsg(WHERE,ERR_REMOVE,smb.file,i,smb.last_error); if(msg.hdr.auxattr&MSG_FILEATTACH) delfattach(&cfg,&msg); smb_freemsgmem(&msg); } continue; } } idxbuf[l]=msg.idx; l++; } smb_rewind(smb.sid_fp); smb_fsetlength(smb.sid_fp,0); for(i=0;i<l;i++) smb_fwrite(&smb,&idxbuf[i],sizeof(idxrec_t),smb.sid_fp); free(idxbuf); smb.status.total_msgs=l; smb_putstatus(&smb); smb_fflush(smb.sid_fp); smb_close_ha(&smb); smb_close_da(&smb); return(0); }