--- sbbs/src/sbbs3/mail.cpp 2018/04/24 16:41:24 1.1.1.1 +++ sbbs/src/sbbs3/mail.cpp 2018/04/24 16:43:54 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet mail-related routines */ -/* $Id: mail.cpp,v 1.1.1.1 2018/04/24 16:41:24 root Exp $ */ +/* $Id: mail.cpp,v 1.1.1.2 2018/04/24 16:43:54 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 2003 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2010 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 * @@ -50,53 +50,61 @@ int sbbs_t::delmail(uint usernumber, int now=time(NULL); if((i=smb_getstatus(&smb))!=0) { errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); - return(2); } + 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); } + return(-1); + } if((i=smb_open_da(&smb))!=0) { errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); free(idxbuf); - return(i); } + 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); } + return(i); + } smb_rewind(smb.sid_fp); for(l=0;lmsg.idx.time - && (now-msg.idx.time)/(24L*60L*60L)>smb.status.max_age) - msg.idx.attr|=MSG_DELETE; - if(msg.idx.attr&MSG_DELETE && !(msg.idx.attr&MSG_PERMANENT) + 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)) { - /* Don't need to lock message because base is locked */ - // if(which==MAIL_ALL && !online) - // lprintf(" #%lu",msg.idx.number); - 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; } + || (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>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++; } + l++; + } smb_rewind(smb.sid_fp); smb_fsetlength(smb.sid_fp,0); for(i=0;ifrom,TRUE /*sysop_alias*/); if(!usernumber) - return; } + return; + } for(n=1;n<=cfg.sys_nodes;n++) { /* Tell user */ getnodedat(n,&node,0); if(node.useron==usernumber @@ -137,48 +146,58 @@ void sbbs_t::telluser(smbmsg_t* msg) ,text[UserReadYourMailNodeMsg] ,cfg.node_num,useron.alias); putnmsg(&cfg,n,str); - break; } } + break; + } + } if(n>cfg.sys_nodes) { now=time(NULL); sprintf(str,text[UserReadYourMail] - ,useron.alias,timestr(&now)); - putsmsg(&cfg,usernumber,str); } + ,useron.alias,timestr(now)); + putsmsg(&cfg,usernumber,str); + } } /************************************************************************/ /* Deletes all mail waiting for user number 'usernumber' */ /************************************************************************/ -void sbbs_t::delallmail(uint usernumber) +void sbbs_t::delallmail(uint usernumber, int which, bool permanent) { int i; - long l,msgs,deleted=0; + long l,deleted=0; + int32_t msgs; mail_t *mail; smbmsg_t msg; 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) { errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); smb_stack(&smb,SMB_STACK_POP); - return; } + return; + } - mail=loadmail(&smb,&msgs,usernumber,MAIL_ANY,0); + mail=loadmail(&smb,&msgs,usernumber,which,0); if(!msgs) { smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); - return; } + return; + } if((i=smb_locksmbhdr(&smb))!=0) { /* Lock the base, so nobody */ smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); free(mail); errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); /* messes with the index */ - return; } + return; + } for(l=0;l