|
|
1.1 ! root 1: /* getmail.cpp */ ! 2: ! 3: /* Synchronet DLL-exported mail-related routines */ ! 4: ! 5: /* $Id: getmail.c,v 1.3 2004/05/30 06:47:52 deuce Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #include "sbbs.h" ! 39: ! 40: /****************************************************************************/ ! 41: /* Returns the number of pieces of mail waiting for usernumber */ ! 42: /* If sent is non-zero, it returns the number of mail sent by usernumber */ ! 43: /* If usernumber is 0, it returns all mail on the system */ ! 44: /****************************************************************************/ ! 45: int DLLCALL getmail(scfg_t* cfg, int usernumber, BOOL sent) ! 46: { ! 47: char str[128]; ! 48: int i=0; ! 49: long l; ! 50: idxrec_t idx; ! 51: smb_t smb; ! 52: ! 53: sprintf(smb.file,"%smail",cfg->data_dir); ! 54: smb.retry_time=cfg->smb_retry_time; ! 55: sprintf(str,"%s.sid",smb.file); ! 56: l=flength(str); ! 57: if(l<(long)sizeof(idxrec_t)) ! 58: return(0); ! 59: if(!usernumber) ! 60: return(l/sizeof(idxrec_t)); /* Total system e-mail */ ! 61: smb.subnum=INVALID_SUB; ! 62: if(smb_open(&smb)!=0) ! 63: return(0); ! 64: while(!smb_feof(smb.sid_fp)) { ! 65: if(smb_fread(&smb,&idx,sizeof(idx),smb.sid_fp) != sizeof(idx)) ! 66: break; ! 67: if(idx.number==0) /* invalid message number, ignore */ ! 68: continue; ! 69: if(idx.attr&MSG_DELETE) ! 70: continue; ! 71: if((!sent && idx.to==usernumber) ! 72: || (sent && idx.from==usernumber)) ! 73: i++; ! 74: } ! 75: smb_close(&smb); ! 76: return(i); ! 77: } ! 78: ! 79: ! 80: /***************************/ ! 81: /* Delete file attachments */ ! 82: /***************************/ ! 83: void DLLCALL delfattach(scfg_t* cfg, smbmsg_t* msg) ! 84: { ! 85: char str[MAX_PATH+1]; ! 86: char str2[MAX_PATH+1]; ! 87: char *tp,*sp,*p; ! 88: ! 89: if(msg->idx.to==0) { /* netmail */ ! 90: sprintf(str,"%sfile/%04u.out/%s" ! 91: ,cfg->data_dir,msg->idx.from,getfname(msg->subj)); ! 92: remove(str); ! 93: sprintf(str,"%sfile/%04u.out" ! 94: ,cfg->data_dir,msg->idx.from); ! 95: rmdir(str); ! 96: return; ! 97: } ! 98: ! 99: strcpy(str,msg->subj); ! 100: tp=str; ! 101: while(1) { ! 102: p=strchr(tp,' '); ! 103: if(p) *p=0; ! 104: sp=strrchr(tp,'/'); /* sp is slash pointer */ ! 105: if(!sp) sp=strrchr(tp,'\\'); ! 106: if(sp) tp=sp+1; ! 107: sprintf(str2,"%sfile/%04u.in/%s" /* str2 is path/fname */ ! 108: ,cfg->data_dir,msg->idx.to,tp); ! 109: remove(str2); ! 110: if(!p) ! 111: break; ! 112: tp=p+1; } ! 113: sprintf(str,"%sfile/%04u.in",cfg->data_dir,msg->idx.to); ! 114: rmdir(str); /* remove the dir if it's empty */ ! 115: } ! 116: ! 117: /****************************************************************************/ ! 118: /* Loads mail waiting for user number 'usernumber' into the mail array of */ ! 119: /* of pointers to mail_t (message numbers and attributes) */ ! 120: /* smb_open(&smb) must be called prior */ ! 121: /****************************************************************************/ ! 122: mail_t* DLLCALL loadmail(smb_t* smb, ulong* msgs, uint usernumber ! 123: ,int which, long mode) ! 124: { ! 125: ulong l=0; ! 126: idxrec_t idx; ! 127: mail_t* mail=NULL; ! 128: ! 129: if(msgs==NULL) ! 130: return(NULL); ! 131: ! 132: *msgs=0; ! 133: ! 134: if(smb==NULL) ! 135: return(NULL); ! 136: ! 137: if(smb_locksmbhdr(smb)!=0) /* Be sure noone deletes or */ ! 138: return(NULL); /* adds while we're reading */ ! 139: ! 140: smb_rewind(smb->sid_fp); ! 141: while(!smb_feof(smb->sid_fp)) { ! 142: if(smb_fread(smb,&idx,sizeof(idx),smb->sid_fp) != sizeof(idx)) ! 143: break; ! 144: if(idx.number==0) /* invalid message number, ignore */ ! 145: continue; ! 146: if((which==MAIL_SENT && idx.from!=usernumber) ! 147: || (which==MAIL_YOUR && idx.to!=usernumber) ! 148: || (which==MAIL_ANY && idx.from!=usernumber && idx.to!=usernumber)) ! 149: continue; ! 150: if(idx.attr&MSG_DELETE && !(mode&LM_INCDEL)) /* Don't included deleted msgs */ ! 151: continue; ! 152: if(mode&LM_UNREAD && idx.attr&MSG_READ) ! 153: continue; ! 154: if((mail=(mail_t *)REALLOC(mail,sizeof(mail_t)*(l+1))) ! 155: ==NULL) { ! 156: smb_unlocksmbhdr(smb); ! 157: return(NULL); ! 158: } ! 159: mail[l]=idx; ! 160: l++; ! 161: } ! 162: smb_unlocksmbhdr(smb); ! 163: *msgs=l; ! 164: return(mail); ! 165: } ! 166: ! 167: void DLLCALL freemail(mail_t* mail) ! 168: { ! 169: FREE(mail); ! 170: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.