|
|
1.1 ! root 1: /* pack_qwk.cpp */ ! 2: ! 3: /* Synchronet pack QWK packet routine */ ! 4: ! 5: /* $Id: pack_qwk.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 "qwk.h" ! 40: #include "post.h" ! 41: ! 42: /****************************************************************************/ ! 43: /* Creates QWK packet, returning 1 if successful, 0 if not. */ ! 44: /****************************************************************************/ ! 45: bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) ! 46: { ! 47: char str[256],tmp2[256],ch,*p; ! 48: char tmp[512]; ! 49: char* fname; ! 50: int file,mode; ! 51: uint i,j,k,conf; ! 52: long l,size,msgndx,posts,ex; ! 53: ulong mailmsgs=0; ! 54: ulong totalcdt,totaltime,lastmsg ! 55: ,files,submsgs,msgs,netfiles=0,preqwk=0; ! 56: float f; /* Sparky is responsible */ ! 57: time_t start; ! 58: node_t node; ! 59: mail_t *mail; ! 60: post_t HUGE16 *post; ! 61: glob_t g; ! 62: FILE *stream,*qwk,*personal,*ndx; ! 63: DIR* dir; ! 64: DIRENT* dirent; ! 65: struct tm* tm; ! 66: smbmsg_t msg; ! 67: ! 68: ! 69: ex=EX_OUTL|EX_OUTR; ! 70: if(prepack) ! 71: ex|=EX_OFFLINE; ! 72: ! 73: delfiles(cfg.temp_dir,ALLFILES); ! 74: sprintf(str,"%sfile/%04u.qwk",cfg.data_dir,useron.number); ! 75: if(fexist(str)) { ! 76: for(k=0;k<cfg.total_fextrs;k++) ! 77: if(!stricmp(cfg.fextr[k]->ext,useron.tmpext) ! 78: && chk_ar(cfg.fextr[k]->ar,&useron)) ! 79: break; ! 80: if(k>=cfg.total_fextrs) ! 81: k=0; ! 82: i=external(cmdstr(cfg.fextr[k]->cmd,str,ALLFILES,NULL),ex); ! 83: if(!i) ! 84: preqwk=1; } ! 85: ! 86: if(useron.rest&FLAG('Q') && useron.qwk&QWK_RETCTLA) ! 87: useron.qwk|=(QWK_NOINDEX|QWK_NOCTRL|QWK_VIA|QWK_TZ); ! 88: ! 89: if(useron.qwk&QWK_EXPCTLA) ! 90: mode=A_EXPAND; ! 91: else if(useron.qwk&QWK_RETCTLA) ! 92: mode=A_LEAVE; ! 93: else mode=0; ! 94: if(useron.qwk&QWK_TZ) ! 95: mode|=TZ; ! 96: if(useron.qwk&QWK_VIA) ! 97: mode|=VIA; ! 98: (*msgcnt)=0L; ! 99: if(/* !prepack && */ !(useron.qwk&QWK_NOCTRL)) { ! 100: /***************************/ ! 101: /* Create CONTROL.DAT file */ ! 102: /***************************/ ! 103: sprintf(str,"%sCONTROL.DAT",cfg.temp_dir); ! 104: if((stream=fnopen(&file,str,O_WRONLY|O_CREAT|O_TRUNC))==NULL) { ! 105: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); ! 106: return(false); } ! 107: ! 108: now=time(NULL); ! 109: tm=gmtime(&now); ! 110: if(tm==NULL) ! 111: return(false); ! 112: ! 113: fprintf(stream,"%s\r\n%s\r\n%s\r\n%s, Sysop\r\n0000,%s\r\n" ! 114: "%02u-%02u-%u,%02u:%02u:%02u\r\n" ! 115: ,cfg.sys_name ! 116: ,cfg.sys_location ! 117: ,cfg.node_phone ! 118: ,cfg.sys_op ! 119: ,cfg.sys_id ! 120: ,tm->tm_mon+1,tm->tm_mday,tm->tm_year+1900 ! 121: ,tm->tm_hour,tm->tm_min,tm->tm_sec); ! 122: k=0; ! 123: for(i=0;i<usrgrps;i++) ! 124: for(j=0;j<usrsubs[i];j++) ! 125: k++; /* k is how many subs */ ! 126: fprintf(stream,"%s\r\n\r\n0\r\n0\r\n%u\r\n",useron.alias,k); ! 127: fprintf(stream,"0\r\nE-mail\r\n"); /* first conference is e-mail */ ! 128: for(i=0;i<usrgrps;i++) ! 129: for(j=0;j<usrsubs[i];j++) ! 130: fprintf(stream,"%u\r\n%s\r\n" ! 131: ,cfg.sub[usrsub[i][j]]->qwkconf ? cfg.sub[usrsub[i][j]]->qwkconf ! 132: : ((i+1)*1000)+j+1,cfg.sub[usrsub[i][j]]->qwkname); ! 133: fprintf(stream,"HELLO\r\nBBSNEWS\r\nGOODBYE\r\n"); ! 134: fclose(stream); ! 135: /***********************/ ! 136: /* Create DOOR.ID File */ ! 137: /***********************/ ! 138: sprintf(str,"%sDOOR.ID",cfg.temp_dir); ! 139: if((stream=fnopen(&file,str,O_WRONLY|O_CREAT|O_TRUNC))==NULL) { ! 140: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); ! 141: return(false); } ! 142: p="CONTROLTYPE = "; ! 143: fprintf(stream,"DOOR = %s\r\nVERSION = %s\r\n" ! 144: "SYSTEM = %s v%s\r\n" ! 145: "CONTROLNAME = SBBS\r\n" ! 146: "%sADD\r\n" ! 147: "%sDROP\r\n" ! 148: "%sYOURS\r\n" ! 149: "%sRESET\r\n" ! 150: "%sRESETALL\r\n" ! 151: "%sFILES\r\n" ! 152: "%sATTACH\r\n" ! 153: "%sOWN\r\n" ! 154: "%smail\r\n" ! 155: "%sDELMAIL\r\n" ! 156: "%sCTRL-A\r\n" ! 157: "%sFREQ\r\n" ! 158: "%sNDX\r\n" ! 159: "%sTZ\r\n" ! 160: "%sVIA\r\n" ! 161: "%sCONTROL\r\n" ! 162: "MIXEDCASE = YES\r\n" ! 163: ,"Synchronet" ! 164: ,VERSION ! 165: ,"Synchronet" ! 166: ,VERSION ! 167: ,p,p,p,p ! 168: ,p,p,p,p ! 169: ,p,p,p,p ! 170: ,p,p,p,p ! 171: ); ! 172: fclose(stream); ! 173: if(useron.rest&FLAG('Q')) { ! 174: /***********************/ ! 175: /* Create NETFLAGS.DAT */ ! 176: /***********************/ ! 177: sprintf(str,"%sNETFLAGS.DAT",cfg.temp_dir); ! 178: if((stream=fnopen(&file,str,O_WRONLY|O_CREAT))==NULL) { ! 179: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); ! 180: return(false); } ! 181: ch=1; /* Net enabled */ ! 182: if(usrgrps) ! 183: for(i=0;i<(usrgrps*1000)+usrsubs[usrgrps-1];i++) ! 184: fputc(ch,stream); ! 185: fclose(stream); } ! 186: } /* !prepack */ ! 187: ! 188: /****************************************************/ ! 189: /* Create MESSAGES.DAT, write header and leave open */ ! 190: /****************************************************/ ! 191: sprintf(str,"%sMESSAGES.DAT",cfg.temp_dir); ! 192: if((qwk=fnopen(&file,str,O_CREAT|O_WRONLY|O_TRUNC))==NULL) { ! 193: errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_TRUNC); ! 194: return(false); } ! 195: l=filelength(file); ! 196: if(l<1) { ! 197: fprintf(qwk,"%-128s",QWK_HEADER); ! 198: msgndx=1; } ! 199: else ! 200: msgndx=l/128L; ! 201: fseek(qwk,0,SEEK_END); ! 202: sprintf(str,"%sNEWFILES.DAT",cfg.temp_dir); ! 203: remove(str); ! 204: if(!(useron.rest&FLAG('T')) && useron.qwk&QWK_FILES) ! 205: files=create_filelist("NEWFILES.DAT",FL_ULTIME); ! 206: else ! 207: files=0; ! 208: ! 209: start=time(NULL); ! 210: ! 211: if(useron.rest&FLAG('Q')) ! 212: useron.qwk|=(QWK_EMAIL|QWK_ALLMAIL|QWK_DELMAIL); ! 213: ! 214: if(!(useron.qwk&QWK_NOINDEX)) { ! 215: sprintf(str,"%sPERSONAL.NDX",cfg.temp_dir); ! 216: if((personal=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) { ! 217: fclose(qwk); ! 218: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); ! 219: return(false); } ! 220: fseek(personal,0L,SEEK_END); } ! 221: else ! 222: personal=NULL; ! 223: ! 224: if(useron.qwk&(QWK_EMAIL|QWK_ALLMAIL) /* && !prepack */) { ! 225: sprintf(smb.file,"%smail",cfg.data_dir); ! 226: smb.retry_time=cfg.smb_retry_time; ! 227: if((i=smb_open(&smb))!=0) { ! 228: fclose(qwk); ! 229: if(personal) ! 230: fclose(personal); ! 231: errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); ! 232: return(false); } ! 233: ! 234: /***********************/ ! 235: /* Pack E-mail, if any */ ! 236: /***********************/ ! 237: qwkmail_time=time(NULL); ! 238: mail=loadmail(&smb,&mailmsgs,useron.number,0,useron.qwk&QWK_ALLMAIL ? 0 ! 239: : LM_UNREAD); ! 240: if(mailmsgs && !(sys_status&SS_ABORT)) { ! 241: bputs(text[QWKPackingEmail]); ! 242: if(!(useron.qwk&QWK_NOINDEX)) { ! 243: sprintf(str,"%s000.NDX",cfg.temp_dir); ! 244: if((ndx=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) { ! 245: fclose(qwk); ! 246: if(personal) ! 247: fclose(personal); ! 248: smb_close(&smb); ! 249: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); ! 250: FREE(mail); ! 251: return(false); } ! 252: fseek(ndx,0L,SEEK_END); } ! 253: else ! 254: ndx=NULL; ! 255: ! 256: if(useron.rest&FLAG('Q')) ! 257: mode|=TO_QNET; ! 258: else ! 259: mode&=~TO_QNET; ! 260: ! 261: for(l=0;(ulong)l<mailmsgs;l++) { ! 262: bprintf("\b\b\b\b\b\b\b\b\b\b\b\b%4lu of %-4lu" ! 263: ,l+1,mailmsgs); ! 264: ! 265: msg.idx.offset=mail[l].offset; ! 266: if(!loadmsg(&msg,mail[l].number)) ! 267: continue; ! 268: ! 269: if(msg.hdr.auxattr&MSG_FILEATTACH && useron.qwk&QWK_ATTACH) { ! 270: sprintf(str,"%sfile/%04u.in/%s" ! 271: ,cfg.data_dir,useron.number,msg.subj); ! 272: sprintf(tmp,"%s%s",cfg.temp_dir,msg.subj); ! 273: if(fexist(str) && !fexist(tmp)) ! 274: mv(str,tmp,1); } ! 275: ! 276: size=msgtoqwk(&msg,qwk,mode,INVALID_SUB,0); ! 277: smb_unlockmsghdr(&smb,&msg); ! 278: smb_freemsgmem(&msg); ! 279: if(ndx) { ! 280: msgndx++; ! 281: f=ltomsbin(msgndx); /* Record number */ ! 282: ch=0; /* Sub number, not used */ ! 283: if(personal) { ! 284: fwrite(&f,4,1,personal); ! 285: fwrite(&ch,1,1,personal); } ! 286: fwrite(&f,4,1,ndx); ! 287: fwrite(&ch,1,1,ndx); ! 288: msgndx+=size/128L; } } ! 289: bprintf(text[QWKPackedEmail],mailmsgs); ! 290: if(ndx) ! 291: fclose(ndx); } ! 292: smb_close(&smb); /* Close the e-mail */ ! 293: if(mailmsgs) ! 294: FREE(mail); ! 295: } ! 296: ! 297: /*********************/ ! 298: /* Pack new messages */ ! 299: /*********************/ ! 300: for(i=0;i<usrgrps;i++) { ! 301: for(j=0;j<usrsubs[i] && !msgabort();j++) ! 302: if(sub_cfg[usrsub[i][j]]&SUB_CFG_NSCAN ! 303: || (!(useron.rest&FLAG('Q')) ! 304: && cfg.sub[usrsub[i][j]]->misc&SUB_FORCED)) { ! 305: if(!chk_ar(cfg.sub[usrsub[i][j]]->read_ar,&useron)) ! 306: continue; ! 307: lncntr=0; /* defeat pause */ ! 308: if(useron.rest&FLAG('Q') && !(cfg.sub[usrsub[i][j]]->misc&SUB_QNET)) ! 309: continue; /* QWK Net Node and not QWK networked, so skip */ ! 310: ! 311: msgs=getlastmsg(usrsub[i][j],&lastmsg,0); ! 312: if(!msgs || lastmsg<=sub_ptr[usrsub[i][j]]) { /* no msgs */ ! 313: if(sub_ptr[usrsub[i][j]]>lastmsg) { /* corrupted ptr */ ! 314: sub_ptr[usrsub[i][j]]=lastmsg; /* so fix automatically */ ! 315: sub_last[usrsub[i][j]]=lastmsg; } ! 316: bprintf(text[NScanStatusFmt] ! 317: ,cfg.grp[cfg.sub[usrsub[i][j]]->grp]->sname ! 318: ,cfg.sub[usrsub[i][j]]->lname,0L,msgs); ! 319: continue; } ! 320: ! 321: sprintf(smb.file,"%s%s" ! 322: ,cfg.sub[usrsub[i][j]]->data_dir,cfg.sub[usrsub[i][j]]->code); ! 323: smb.retry_time=cfg.smb_retry_time; ! 324: if((k=smb_open(&smb))!=0) { ! 325: errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error); ! 326: continue; } ! 327: ! 328: k=0; ! 329: if(useron.qwk&QWK_BYSELF) ! 330: k|=LP_BYSELF; ! 331: if(!(sub_cfg[usrsub[i][j]]&SUB_CFG_YSCAN)) ! 332: k|=LP_OTHERS; ! 333: post=loadposts(&posts,usrsub[i][j],sub_ptr[usrsub[i][j]],k); ! 334: ! 335: bprintf(text[NScanStatusFmt] ! 336: ,cfg.grp[cfg.sub[usrsub[i][j]]->grp]->sname ! 337: ,cfg.sub[usrsub[i][j]]->lname,posts,msgs); ! 338: if(!posts) { /* no new messages */ ! 339: smb_close(&smb); ! 340: continue; } ! 341: bputs(text[QWKPackingSubboard]); ! 342: submsgs=0; ! 343: conf=cfg.sub[usrsub[i][j]]->qwkconf; ! 344: if(!conf) ! 345: conf=((i+1)*1000)+j+1; ! 346: ! 347: if(!(useron.qwk&QWK_NOINDEX)) { ! 348: sprintf(str,"%s%u.NDX",cfg.temp_dir,conf); ! 349: if((ndx=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) { ! 350: fclose(qwk); ! 351: if(personal) ! 352: fclose(personal); ! 353: smb_close(&smb); ! 354: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); ! 355: LFREE(post); ! 356: return(false); } ! 357: fseek(ndx,0L,SEEK_END); } ! 358: else ! 359: ndx=NULL; ! 360: ! 361: for(l=0;l<posts && !msgabort();l++) { ! 362: bprintf("\b\b\b\b\b%-5lu",l+1); ! 363: ! 364: sub_ptr[usrsub[i][j]]=post[l].number; /* set ptr */ ! 365: sub_last[usrsub[i][j]]=post[l].number; /* set last read */ ! 366: ! 367: msg.idx.offset=post[l].offset; ! 368: if(!loadmsg(&msg,post[l].number)) ! 369: continue; ! 370: ! 371: if(useron.rest&FLAG('Q')) { ! 372: if(msg.from_net.type && msg.from_net.type!=NET_QWK && ! 373: !(cfg.sub[usrsub[i][j]]->misc&SUB_GATE)) { /* From other */ ! 374: smb_freemsgmem(&msg); /* net, don't gate */ ! 375: smb_unlockmsghdr(&smb,&msg); ! 376: continue; } ! 377: mode|=(TO_QNET|TAGLINE); ! 378: if(msg.from_net.type==NET_QWK) { ! 379: mode&=~TAGLINE; ! 380: if(route_circ((char *)msg.from_net.addr,useron.alias) ! 381: || !strnicmp(msg.subj,"NE:",3)) { ! 382: smb_freemsgmem(&msg); ! 383: smb_unlockmsghdr(&smb,&msg); ! 384: continue; } } } ! 385: else ! 386: mode&=~(TAGLINE|TO_QNET); ! 387: ! 388: size=msgtoqwk(&msg,qwk,mode,usrsub[i][j],conf); ! 389: smb_unlockmsghdr(&smb,&msg); ! 390: ! 391: if(ndx) { ! 392: msgndx++; ! 393: f=ltomsbin(msgndx); /* Record number */ ! 394: ch=0; /* Sub number, not used */ ! 395: if(personal ! 396: && (!stricmp(msg.to,useron.alias) ! 397: || !stricmp(msg.to,useron.name))) { ! 398: fwrite(&f,4,1,personal); ! 399: fwrite(&ch,1,1,personal); } ! 400: fwrite(&f,4,1,ndx); ! 401: fwrite(&ch,1,1,ndx); ! 402: msgndx+=size/128L; } ! 403: ! 404: smb_freemsgmem(&msg); ! 405: (*msgcnt)++; ! 406: submsgs++; ! 407: if(cfg.max_qwkmsgs ! 408: && !(useron.rest&FLAG('Q')) && (*msgcnt)>=cfg.max_qwkmsgs) { ! 409: bputs(text[QWKmsgLimitReached]); ! 410: break; } } ! 411: if(!(sys_status&SS_ABORT)) ! 412: bprintf(text[QWKPackedSubboard],submsgs,(*msgcnt)); ! 413: if(ndx) { ! 414: fclose(ndx); ! 415: sprintf(str,"%s%u.NDX",cfg.temp_dir,conf); ! 416: if(!flength(str)) ! 417: remove(str); } ! 418: smb_close(&smb); ! 419: LFREE(post); ! 420: if(l<posts) ! 421: break; } ! 422: if(j<usrsubs[i]) /* if sub aborted, abort all */ ! 423: break; } ! 424: ! 425: if((*msgcnt)+mailmsgs && time(NULL)-start) { ! 426: bprintf("\r\n\r\n\1n\1hPacked %lu messages in %lu seconds " ! 427: "(%lu messages/second)." ! 428: ,(*msgcnt)+mailmsgs,time(NULL)-start ! 429: ,((*msgcnt)+mailmsgs)/(time(NULL)-start)); ! 430: lprintf("Packed %lu messages in %lu seconds (%lu msgs/sec)" ! 431: ,(*msgcnt)+mailmsgs,time(NULL)-start ! 432: ,((*msgcnt)+mailmsgs)/(time(NULL)-start)); ! 433: } ! 434: ! 435: fclose(qwk); /* close MESSAGE.DAT */ ! 436: if(personal) { ! 437: fclose(personal); /* close PERSONAL.NDX */ ! 438: sprintf(str,"%sPERSONAL.NDX",cfg.temp_dir); ! 439: if(!flength(str)) ! 440: remove(str); } ! 441: CRLF; ! 442: ! 443: if(!prepack && (sys_status&SS_ABORT || !online)) ! 444: return(false); ! 445: ! 446: if(/*!prepack && */ useron.rest&FLAG('Q')) { /* If QWK Net node, check for files */ ! 447: sprintf(str,"%sqnet/%s.out/",cfg.data_dir,useron.alias); ! 448: dir=opendir(str); ! 449: while((dirent=readdir(dir))!=NULL) { /* Move files into temp dir */ ! 450: sprintf(str,"%sqnet/%s.out/%s",cfg.data_dir,useron.alias,dirent->d_name); ! 451: if(isdir(str)) ! 452: continue; ! 453: sprintf(tmp2,"%s%s",cfg.temp_dir,dirent->d_name); ! 454: lncntr=0; /* Default pause */ ! 455: lprintf("Including %s in packet",str); ! 456: bprintf(text[RetrievingFile],str); ! 457: if(!mv(str,tmp2,1)) ! 458: netfiles++; ! 459: } ! 460: closedir(dir); ! 461: if(netfiles) ! 462: CRLF; } ! 463: ! 464: if(batdn_total) { ! 465: for(i=0,totalcdt=0;i<batdn_total;i++) ! 466: totalcdt+=batdn_cdt[i]; ! 467: if(!(useron.exempt&FLAG('D')) ! 468: && totalcdt>useron.cdt+useron.freecdt) { ! 469: bprintf(text[YouOnlyHaveNCredits] ! 470: ,ultoac(useron.cdt+useron.freecdt,tmp)); } ! 471: else { ! 472: for(i=0,totaltime=0;i<batdn_total;i++) { ! 473: if(!(cfg.dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps) ! 474: totaltime+=batdn_size[i]/(ulong)cur_cps; } ! 475: if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft) ! 476: bputs(text[NotEnoughTimeToDl]); ! 477: else { ! 478: for(i=0;i<batdn_total;i++) { ! 479: lncntr=0; ! 480: unpadfname(batdn_name[i],tmp); ! 481: sprintf(tmp2,"%s%s",cfg.temp_dir,tmp); ! 482: if(!fexist(tmp2)) { ! 483: seqwait(cfg.dir[batdn_dir[i]]->seqdev); ! 484: bprintf(text[RetrievingFile],tmp); ! 485: sprintf(str,"%s%s" ! 486: ,batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths ! 487: ? cfg.altpath[batdn_alt[i]-1] ! 488: : cfg.dir[batdn_dir[i]]->path ! 489: ,tmp); ! 490: mv(str,tmp2,1); /* copy the file to temp dir */ ! 491: getnodedat(cfg.node_num,&thisnode,1); ! 492: thisnode.aux=0xfe; ! 493: putnodedat(cfg.node_num,&thisnode); ! 494: CRLF; } } } } } ! 495: ! 496: if(!(*msgcnt) && !mailmsgs && !files && !netfiles && !batdn_total ! 497: && (prepack || !preqwk)) { ! 498: bputs(text[QWKNoNewMessages]); ! 499: return(false); } ! 500: ! 501: if(!prepack && !(useron.rest&FLAG('Q'))) { /* Don't include in network */ ! 502: /***********************/ /* packets */ ! 503: /* Copy QWK Text files */ ! 504: /***********************/ ! 505: sprintf(str,"%sQWK/HELLO",cfg.text_dir); ! 506: if(fexist(str)) { ! 507: sprintf(tmp2,"%sHELLO",cfg.temp_dir); ! 508: mv(str,tmp2,1); } ! 509: sprintf(str,"%sQWK/BBSNEWS",cfg.text_dir); ! 510: if(fexist(str)) { ! 511: sprintf(tmp2,"%sBBSNEWS",cfg.temp_dir); ! 512: mv(str,tmp2,1); } ! 513: sprintf(str,"%sQWK/GOODBYE",cfg.text_dir); ! 514: if(fexist(str)) { ! 515: sprintf(tmp2,"%sGOODBYE",cfg.temp_dir); ! 516: mv(str,tmp2,1); } ! 517: sprintf(str,"%sQWK/BLT-*",cfg.text_dir); ! 518: glob(str,0,NULL,&g); ! 519: for(i=0;i<g.gl_pathc;i++) { /* Copy BLT-*.* files */ ! 520: fname=getfname(g.gl_pathv[i]); ! 521: padfname(fname,str); ! 522: if(isdigit(str[4]) && isdigit(str[9])) { ! 523: sprintf(str,"%sQWK/%s",cfg.text_dir,fname); ! 524: sprintf(tmp2,"%s%s",cfg.temp_dir,fname); ! 525: mv(str,tmp2,1); ! 526: } ! 527: } ! 528: globfree(&g); ! 529: } ! 530: ! 531: if(prepack) { ! 532: for(i=1;i<=cfg.sys_nodes;i++) { ! 533: getnodedat(i,&node,0); ! 534: if((node.status==NODE_INUSE || node.status==NODE_QUIET ! 535: || node.status==NODE_LOGON) && node.useron==useron.number) ! 536: break; } ! 537: if(i<=cfg.sys_nodes) /* Don't pre-pack with user online */ ! 538: return(false); } ! 539: ! 540: /*******************/ ! 541: /* Compress Packet */ ! 542: /*******************/ ! 543: sprintf(tmp2,"%s%s",cfg.temp_dir,ALLFILES); ! 544: i=external(cmdstr(temp_cmd(),packet,tmp2,NULL),ex); ! 545: if(!fexist(packet)) { ! 546: bputs(text[QWKCompressionFailed]); ! 547: if(i) ! 548: errormsg(WHERE,ERR_EXEC,cmdstr(temp_cmd(),packet,tmp2,NULL),i); ! 549: else ! 550: errorlog("Couldn't compress QWK packet"); ! 551: return(false); } ! 552: ! 553: if(prepack) /* Early return if pre-packing */ ! 554: return(true); ! 555: ! 556: l=flength(packet); ! 557: sprintf(str,"%s.qwk",cfg.sys_id); ! 558: bprintf(text[FiFilename],str); ! 559: bprintf(text[FiFileSize],ultoac(l,tmp)); ! 560: if(l>0L && cur_cps) ! 561: i=l/(ulong)cur_cps; ! 562: else ! 563: i=0; ! 564: bprintf(text[FiTransferTime],sectostr(i,tmp)); ! 565: CRLF; ! 566: if(!(useron.exempt&FLAG('T')) && i>timeleft) { ! 567: bputs(text[NotEnoughTimeToDl]); ! 568: return(false); ! 569: } ! 570: ! 571: if(useron.rest&FLAG('Q')) { ! 572: sprintf(str,"%s.qwk",cfg.sys_id); ! 573: dir=opendir(cfg.temp_dir); ! 574: while((dirent=readdir(dir))!=NULL) { ! 575: if(!stricmp(str,dirent->d_name)) /* QWK packet */ ! 576: continue; ! 577: sprintf(tmp,"%s%s",cfg.temp_dir,dirent->d_name); ! 578: if(!isdir(tmp)) ! 579: remove(tmp); ! 580: } ! 581: closedir(dir); ! 582: } ! 583: ! 584: return(true); ! 585: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.