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