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