|
|
1.1 ! root 1: /* pack_rep.cpp */ ! 2: ! 3: /* Synchronet QWK reply (REP) packet creation routine */ ! 4: ! 5: /* $Id: pack_rep.cpp,v 1.34 2005/09/25 22:56:57 rswindell 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 2005 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: #include "qwk.h" ! 40: ! 41: /****************************************************************************/ ! 42: /* Creates an REP packet for upload to QWK hub 'hubnum'. */ ! 43: /* Returns 1 if successful, 0 if not. */ ! 44: /****************************************************************************/ ! 45: bool sbbs_t::pack_rep(uint hubnum) ! 46: { ! 47: char str[MAX_PATH+1]; ! 48: char tmp[MAX_PATH+1],tmp2[MAX_PATH+1]; ! 49: int file,mode; ! 50: uint i,j,k; ! 51: long l,msgcnt,submsgs,posts,packedmail,netfiles=0,deleted; ! 52: long mailmsgs; ! 53: ulong last,msgs; ! 54: post_t *post; ! 55: mail_t *mail; ! 56: FILE* rep; ! 57: DIR* dir; ! 58: DIRENT* dirent; ! 59: smbmsg_t msg; ! 60: ! 61: msgcnt=0L; ! 62: delfiles(cfg.temp_dir,ALLFILES); ! 63: sprintf(str,"%s%s.rep",cfg.data_dir,cfg.qhub[hubnum]->id); ! 64: if(fexist(str)) { ! 65: eprintf(LOG_INFO,"Updating %s", str); ! 66: external(cmdstr(cfg.qhub[hubnum]->unpack,str,ALLFILES,NULL),EX_OFFLINE); ! 67: } else ! 68: eprintf(LOG_INFO,"Creating %s", str); ! 69: /*************************************************/ ! 70: /* Create SYSID.MSG, write header and leave open */ ! 71: /*************************************************/ ! 72: sprintf(str,"%s%s.msg",cfg.temp_dir,cfg.qhub[hubnum]->id); ! 73: if((rep=fnopen(&file,str,O_CREAT|O_WRONLY|O_TRUNC))==NULL) { ! 74: errormsg(WHERE,ERR_CREATE,str,O_CREAT|O_WRONLY|O_TRUNC); ! 75: return(false); } ! 76: if(filelength(file)<1) { /* New REP packet */ ! 77: sprintf(str,"%-*s" ! 78: ,QWK_BLOCK_LEN,cfg.qhub[hubnum]->id); /* So write header */ ! 79: fwrite(str,QWK_BLOCK_LEN,1,rep); ! 80: } ! 81: fseek(rep,0L,SEEK_END); ! 82: /*********************/ ! 83: /* Pack new messages */ ! 84: /*********************/ ! 85: sprintf(smb.file,"%smail",cfg.data_dir); ! 86: smb.retry_time=cfg.smb_retry_time; ! 87: smb.subnum=INVALID_SUB; ! 88: if((i=smb_open(&smb))!=0) { ! 89: fclose(rep); ! 90: errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); ! 91: return(false); } ! 92: ! 93: /***********************/ ! 94: /* Pack E-mail, if any */ ! 95: /***********************/ ! 96: qwkmail_last=0; ! 97: mail=loadmail(&smb,&mailmsgs,0,MAIL_YOUR,0); ! 98: packedmail=0; ! 99: if(mailmsgs) { ! 100: eprintf(LOG_INFO,"Packing NetMail for %s", cfg.qhub[hubnum]->id); ! 101: for(l=0;l<mailmsgs;l++) { ! 102: // bprintf("\b\b\b\b\b%-5lu",l+1); ! 103: ! 104: memset(&msg,0,sizeof(msg)); ! 105: msg.idx=mail[l]; ! 106: if(msg.idx.number>qwkmail_last) ! 107: qwkmail_last=msg.idx.number; ! 108: if(!loadmsg(&msg,mail[l].number)) ! 109: continue; ! 110: ! 111: sprintf(str,"%s/",cfg.qhub[hubnum]->id); ! 112: if(msg.to_net.type!=NET_QWK ! 113: || (strcmp((char *)msg.to_net.addr,cfg.qhub[hubnum]->id) ! 114: && strncmp((char *)msg.to_net.addr,str,strlen(str)))) { ! 115: smb_unlockmsghdr(&smb,&msg); ! 116: smb_freemsgmem(&msg); ! 117: continue; } ! 118: ! 119: msgtoqwk(&msg,rep,QM_TO_QNET|QM_REP|A_LEAVE,INVALID_SUB,0); ! 120: packedmail++; ! 121: smb_unlockmsghdr(&smb,&msg); ! 122: smb_freemsgmem(&msg); ! 123: YIELD(); /* yield */ ! 124: } ! 125: eprintf(LOG_INFO,"Packed %d NetMail messages",packedmail); ! 126: } ! 127: smb_close(&smb); /* Close the e-mail */ ! 128: if(mailmsgs) ! 129: free(mail); ! 130: ! 131: for(i=0;i<cfg.qhub[hubnum]->subs;i++) { ! 132: j=cfg.qhub[hubnum]->sub[i]; /* j now equals the real sub num */ ! 133: msgs=getlastmsg(j,&last,0); ! 134: lncntr=0; /* defeat pause */ ! 135: if(!msgs || last<=subscan[j].ptr) { ! 136: if(subscan[j].ptr>last) { ! 137: subscan[j].ptr=last; ! 138: subscan[j].last=last; } ! 139: eprintf(LOG_INFO,remove_ctrl_a(text[NScanStatusFmt],tmp) ! 140: ,cfg.grp[cfg.sub[j]->grp]->sname ! 141: ,cfg.sub[j]->lname,0L,msgs); ! 142: continue; } ! 143: ! 144: sprintf(smb.file,"%s%s" ! 145: ,cfg.sub[j]->data_dir,cfg.sub[j]->code); ! 146: smb.retry_time=cfg.smb_retry_time; ! 147: smb.subnum=j; ! 148: if((k=smb_open(&smb))!=0) { ! 149: errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error); ! 150: continue; } ! 151: ! 152: post=loadposts(&posts,j,subscan[j].ptr,LP_BYSELF|LP_OTHERS|LP_PRIVATE|LP_REP); ! 153: eprintf(LOG_INFO,remove_ctrl_a(text[NScanStatusFmt],tmp) ! 154: ,cfg.grp[cfg.sub[j]->grp]->sname ! 155: ,cfg.sub[j]->lname,posts,msgs); ! 156: if(!posts) { /* no new messages */ ! 157: smb_close(&smb); ! 158: continue; } ! 159: ! 160: subscan[j].ptr=last; /* set pointer */ ! 161: eprintf(LOG_INFO,"%s",remove_ctrl_a(text[QWKPackingSubboard],tmp)); /* ptr to last msg */ ! 162: submsgs=0; ! 163: for(l=0;l<posts;l++) { ! 164: // bprintf("\b\b\b\b\b%-5lu",l+1); ! 165: ! 166: memset(&msg,0,sizeof(msg)); ! 167: msg.idx=post[l]; ! 168: if(!loadmsg(&msg,post[l].number)) ! 169: continue; ! 170: ! 171: if(msg.from_net.type && msg.from_net.type!=NET_QWK && ! 172: !(cfg.sub[j]->misc&SUB_GATE)) { ! 173: smb_freemsgmem(&msg); ! 174: smb_unlockmsghdr(&smb,&msg); ! 175: continue; } ! 176: ! 177: if(!strnicmp(msg.subj,"NE:",3) || (msg.from_net.type==NET_QWK && ! 178: route_circ((char *)msg.from_net.addr,cfg.qhub[hubnum]->id))) { ! 179: smb_freemsgmem(&msg); ! 180: smb_unlockmsghdr(&smb,&msg); ! 181: continue; } ! 182: ! 183: mode=cfg.qhub[hubnum]->mode[i]|QM_TO_QNET|QM_REP; ! 184: if(mode&A_LEAVE) mode|=(QM_VIA|QM_TZ|QM_MSGID); ! 185: if(msg.from_net.type!=NET_QWK) ! 186: mode|=QM_TAGLINE; ! 187: ! 188: msgtoqwk(&msg,rep,mode,j,cfg.qhub[hubnum]->conf[i]); ! 189: ! 190: smb_freemsgmem(&msg); ! 191: smb_unlockmsghdr(&smb,&msg); ! 192: msgcnt++; ! 193: submsgs++; ! 194: if(!(l%50)) ! 195: YIELD(); /* yield */ ! 196: } ! 197: eprintf(LOG_INFO,remove_ctrl_a(text[QWKPackedSubboard],tmp),submsgs,msgcnt); ! 198: free(post); ! 199: smb_close(&smb); ! 200: YIELD(); /* yield */ ! 201: } ! 202: ! 203: fclose(rep); /* close HUB_ID.MSG */ ! 204: CRLF; ! 205: /* Look for extra files to send out */ ! 206: sprintf(str,"%sqnet/%s.out",cfg.data_dir,cfg.qhub[hubnum]->id); ! 207: strlwr(str); ! 208: dir=opendir(str); ! 209: while(dir!=NULL && (dirent=readdir(dir))!=NULL) { ! 210: sprintf(str,"%sqnet/%s.out/%s",cfg.data_dir,cfg.qhub[hubnum]->id,dirent->d_name); ! 211: strlwr(str); ! 212: if(isdir(str)) ! 213: continue; ! 214: sprintf(tmp2,"%s%s",cfg.temp_dir,dirent->d_name); ! 215: eprintf(LOG_INFO,remove_ctrl_a(text[RetrievingFile],tmp),str); ! 216: if(!mv(str,tmp2,1)) ! 217: netfiles++; ! 218: } ! 219: if(dir!=NULL) ! 220: closedir(dir); ! 221: if(netfiles) ! 222: CRLF; ! 223: ! 224: if(!msgcnt && !netfiles && !packedmail) { ! 225: eprintf(LOG_INFO,remove_ctrl_a(text[QWKNoNewMessages],tmp)); ! 226: return(true); // Changed from false Mar-11-2005 (needs to be true to save updated ptrs) ! 227: } ! 228: ! 229: /*******************/ ! 230: /* Compress Packet */ ! 231: /*******************/ ! 232: sprintf(str,"%s%s.rep",cfg.data_dir,cfg.qhub[hubnum]->id); ! 233: sprintf(tmp2,"%s%s",cfg.temp_dir,ALLFILES); ! 234: i=external(cmdstr(cfg.qhub[hubnum]->pack,str,tmp2,NULL) ! 235: ,EX_OFFLINE|EX_WILDCARD); ! 236: if(!fexist(str)) { ! 237: eprintf(LOG_WARNING,"%s",remove_ctrl_a(text[QWKCompressionFailed],tmp)); ! 238: if(i) ! 239: errormsg(WHERE,ERR_EXEC,cmdstr(cfg.qhub[hubnum]->pack,str,tmp2,NULL),i); ! 240: else ! 241: errorlog("Couldn't compress REP packet"); ! 242: return(false); } ! 243: sprintf(str,"%sqnet/%s.out/",cfg.data_dir,cfg.qhub[hubnum]->id); ! 244: strlwr(str); ! 245: delfiles(str,ALLFILES); ! 246: ! 247: if(packedmail) { /* Delete NetMail */ ! 248: sprintf(smb.file,"%smail",cfg.data_dir); ! 249: smb.retry_time=cfg.smb_retry_time; ! 250: smb.subnum=INVALID_SUB; ! 251: if((i=smb_open(&smb))!=0) { ! 252: errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); ! 253: return(true); } ! 254: ! 255: mail=loadmail(&smb,&mailmsgs,0,MAIL_YOUR,0); ! 256: ! 257: if((i=smb_locksmbhdr(&smb))!=0) { /* Lock the base, so nobody */ ! 258: if(mailmsgs) ! 259: free(mail); ! 260: smb_close(&smb); ! 261: errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); /* messes with the index */ ! 262: return(true); } ! 263: ! 264: if((i=smb_getstatus(&smb))!=0) { ! 265: if(mailmsgs) ! 266: free(mail); ! 267: smb_close(&smb); ! 268: errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); ! 269: return(true); } ! 270: ! 271: deleted=0; ! 272: /* Mark as READ and DELETE */ ! 273: for(l=0;l<mailmsgs;l++) { ! 274: if(mail[l].number>qwkmail_last) ! 275: continue; ! 276: memset(&msg,0,sizeof(msg)); ! 277: /* !IMPORTANT: search by number (do not initialize msg.idx.offset) */ ! 278: if(!loadmsg(&msg,mail[l].number)) ! 279: continue; ! 280: ! 281: sprintf(str,"%s/",cfg.qhub[hubnum]->id); ! 282: if(msg.to_net.type!=NET_QWK ! 283: || (strcmp((char *)msg.to_net.addr,cfg.qhub[hubnum]->id) ! 284: && strncmp((char *)msg.to_net.addr,str,strlen(str)))) { ! 285: smb_unlockmsghdr(&smb,&msg); ! 286: smb_freemsgmem(&msg); ! 287: continue; } ! 288: ! 289: msg.hdr.attr|=MSG_DELETE; ! 290: msg.idx.attr=msg.hdr.attr; ! 291: if((i=smb_putmsg(&smb,&msg))!=0) ! 292: errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); ! 293: else ! 294: deleted++; ! 295: smb_unlockmsghdr(&smb,&msg); ! 296: smb_freemsgmem(&msg); ! 297: } ! 298: ! 299: if(deleted && cfg.sys_misc&SM_DELEMAIL) ! 300: delmail(0,MAIL_YOUR); ! 301: smb_close(&smb); ! 302: if(mailmsgs) ! 303: free(mail); ! 304: eprintf(LOG_INFO,"Deleted %d sent NetMail messages",deleted); ! 305: } ! 306: ! 307: return(true); ! 308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.