|
|
1.1 root 1: /* pack_qwk.cpp */
2:
3: /* Synchronet pack QWK packet routine */
4:
1.1.1.2 ! root 5: /* $Id: pack_qwk.cpp,v 1.47 2004/12/29 04:37:28 rswindell Exp $ */
1.1 root 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: * *
1.1.1.2 ! root 11: * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html *
1.1 root 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: {
1.1.1.2 ! root 46: char str[MAX_PATH+1],ch,*p;
! 47: char tmp[MAX_PATH+1],tmp2[MAX_PATH+1];
1.1 root 48: char* fname;
1.1.1.2 ! root 49: char* fmode;
! 50: int mode;
1.1 root 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;
1.1.1.2 ! root 56: ulong subs_scanned=0;
1.1 root 57: float f; /* Sparky is responsible */
58: time_t start;
59: node_t node;
60: mail_t *mail;
61: post_t HUGE16 *post;
62: glob_t g;
63: FILE *stream,*qwk,*personal,*ndx;
64: DIR* dir;
65: DIRENT* dirent;
1.1.1.2 ! root 66: struct tm tm;
1.1 root 67: smbmsg_t msg;
68:
1.1.1.2 ! root 69: ex=EX_OUTL|EX_OUTR; /* Need sh for wildcard expansion */
1.1 root 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);
1.1.1.2 ! root 75: if(fexistcase(str)) {
1.1 root 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;
1.1.1.2 ! root 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: }
1.1 root 88:
89: if(useron.rest&FLAG('Q') && useron.qwk&QWK_RETCTLA)
1.1.1.2 ! root 90: useron.qwk|=(QWK_NOINDEX|QWK_NOCTRL|QWK_VIA|QWK_TZ|QWK_MSGID);
1.1 root 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)
1.1.1.2 ! root 98: mode|=QM_TZ;
1.1 root 99: if(useron.qwk&QWK_VIA)
1.1.1.2 ! root 100: mode|=QM_VIA;
! 101: if(useron.qwk&QWK_MSGID)
! 102: mode|=QM_MSGID;
! 103:
1.1 root 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);
1.1.1.2 ! root 110: if((stream=fopen(str,"wb"))==NULL) {
! 111: errormsg(WHERE,ERR_OPEN,str,0);
! 112: return(false);
! 113: }
1.1 root 114:
115: now=time(NULL);
1.1.1.2 ! root 116: if(localtime_r(&now,&tm)==NULL)
1.1 root 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
1.1.1.2 ! root 126: ,tm.tm_mon+1,tm.tm_mday,tm.tm_year+1900
! 127: ,tm.tm_hour,tm.tm_min,tm.tm_sec);
1.1 root 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 */
1.1.1.2 ! root 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);
1.1 root 143: fprintf(stream,"%u\r\n%s\r\n"
144: ,cfg.sub[usrsub[i][j]]->qwkconf ? cfg.sub[usrsub[i][j]]->qwkconf
1.1.1.2 ! root 145: : ((i+1)*1000)+j+1,confname);
! 146: }
1.1 root 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);
1.1.1.2 ! root 153: if((stream=fopen(str,"wb"))==NULL) {
! 154: errormsg(WHERE,ERR_OPEN,str,0);
! 155: return(false);
! 156: }
1.1 root 157: p="CONTROLTYPE = ";
1.1.1.2 ! root 158: fprintf(stream,"DOOR = %.10s\r\nVERSION = %s%c\r\n"
! 159: "SYSTEM = %s\r\n"
1.1 root 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"
1.1.1.2 ! root 178: ,VERSION_NOTICE
! 179: ,VERSION,REVISION
! 180: ,VERSION_NOTICE
1.1 root 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);
1.1.1.2 ! root 192: if((stream=fopen(str,"wb"))==NULL) {
! 193: errormsg(WHERE,ERR_CREATE,str,0);
! 194: return(false);
! 195: }
1.1 root 196: ch=1; /* Net enabled */
197: if(usrgrps)
198: for(i=0;i<(usrgrps*1000)+usrsubs[usrgrps-1];i++)
199: fputc(ch,stream);
1.1.1.2 ! root 200: fclose(stream);
! 201: }
! 202: }
1.1 root 203:
204: /****************************************************/
205: /* Create MESSAGES.DAT, write header and leave open */
206: /****************************************************/
207: sprintf(str,"%sMESSAGES.DAT",cfg.temp_dir);
1.1.1.2 ! root 208: if(fexistcase(str))
! 209: fmode="r+b";
1.1 root 210: else
1.1.1.2 ! root 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: }
1.1 root 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);
1.1.1.2 ! root 238: if((personal=fopen(str,"ab"))==NULL) {
1.1 root 239: fclose(qwk);
1.1.1.2 ! root 240: errormsg(WHERE,ERR_OPEN,str,0);
! 241: return(false);
! 242: }
! 243: }
1.1 root 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;
1.1.1.2 ! root 250: smb.subnum=INVALID_SUB;
1.1 root 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);
1.1.1.2 ! root 256: return(false);
! 257: }
1.1 root 258:
259: /***********************/
260: /* Pack E-mail, if any */
261: /***********************/
1.1.1.2 ! root 262: qwkmail_last=0;
1.1 root 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);
1.1.1.2 ! root 269: if((ndx=fopen(str,"ab"))==NULL) {
1.1 root 270: fclose(qwk);
271: if(personal)
272: fclose(personal);
273: smb_close(&smb);
1.1.1.2 ! root 274: errormsg(WHERE,ERR_OPEN,str,0);
1.1 root 275: FREE(mail);
1.1.1.2 ! root 276: return(false);
! 277: }
! 278: }
1.1 root 279: else
280: ndx=NULL;
281:
282: if(useron.rest&FLAG('Q'))
1.1.1.2 ! root 283: mode|=QM_TO_QNET;
1.1 root 284: else
1.1.1.2 ! root 285: mode&=~QM_TO_QNET;
1.1 root 286:
287: for(l=0;(ulong)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:
1.1.1.2 ! root 291: memset(&msg,0,sizeof(msg));
! 292: msg.idx=mail[l];
! 293: if(msg.idx.number>qwkmail_last)
! 294: qwkmail_last=msg.idx.number;
1.1 root 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);
1.1.1.2 ! root 302: if(fexistcase(str) && !fexistcase(tmp))
! 303: mv(str,tmp,1);
! 304: }
1.1 root 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);
1.1.1.2 ! root 315: fwrite(&ch,1,1,personal);
! 316: }
1.1 root 317: fwrite(&f,4,1,ndx);
318: fwrite(&ch,1,1,ndx);
1.1.1.2 ! root 319: msgndx+=size/QWK_BLOCK_LEN;
! 320: }
! 321: YIELD(); /* yield */
! 322: }
1.1 root 323: bprintf(text[QWKPackedEmail],mailmsgs);
324: if(ndx)
1.1.1.2 ! root 325: fclose(ndx);
! 326: }
1.1 root 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++) {
1.1.1.2 ! root 336: for(j=0;j<usrsubs[i] && !msgabort();j++) {
! 337: if(subscan[usrsub[i][j]].cfg&SUB_CFG_NSCAN
1.1 root 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:
1.1.1.2 ! root 346: subs_scanned++;
1.1 root 347: msgs=getlastmsg(usrsub[i][j],&lastmsg,0);
1.1.1.2 ! root 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: }
1.1 root 354: bprintf(text[NScanStatusFmt]
355: ,cfg.grp[cfg.sub[usrsub[i][j]]->grp]->sname
356: ,cfg.sub[usrsub[i][j]]->lname,0L,msgs);
1.1.1.2 ! root 357: continue;
! 358: }
1.1 root 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;
1.1.1.2 ! root 363: smb.subnum=usrsub[i][j];
1.1 root 364: if((k=smb_open(&smb))!=0) {
365: errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error);
1.1.1.2 ! root 366: continue;
! 367: }
1.1 root 368:
369: k=0;
370: if(useron.qwk&QWK_BYSELF)
371: k|=LP_BYSELF;
1.1.1.2 ! root 372: if(!(subscan[usrsub[i][j]].cfg&SUB_CFG_YSCAN))
1.1 root 373: k|=LP_OTHERS;
1.1.1.2 ! root 374: post=loadposts(&posts,usrsub[i][j],subscan[usrsub[i][j]].ptr,k);
1.1 root 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);
1.1.1.2 ! root 381: continue;
! 382: }
1.1 root 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);
1.1.1.2 ! root 391: if((ndx=fopen(str,"ab"))==NULL) {
1.1 root 392: fclose(qwk);
393: if(personal)
394: fclose(personal);
395: smb_close(&smb);
1.1.1.2 ! root 396: errormsg(WHERE,ERR_OPEN,str,0);
1.1 root 397: LFREE(post);
1.1.1.2 ! root 398: return(false);
! 399: }
! 400: }
1.1 root 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:
1.1.1.2 ! root 407: subscan[usrsub[i][j]].ptr=post[l].number; /* set ptr */
! 408: subscan[usrsub[i][j]].last=post[l].number; /* set last read */
1.1 root 409:
1.1.1.2 ! root 410: memset(&msg,0,sizeof(msg));
! 411: msg.idx=post[l];
1.1 root 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);
1.1.1.2 ! root 420: continue;
! 421: }
! 422: mode|=(QM_TO_QNET|QM_TAGLINE);
1.1 root 423: if(msg.from_net.type==NET_QWK) {
1.1.1.2 ! root 424: mode&=~QM_TAGLINE;
1.1 root 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);
1.1.1.2 ! root 429: continue;
! 430: }
! 431: }
! 432: }
1.1 root 433: else
1.1.1.2 ! root 434: mode&=~(QM_TAGLINE|QM_TO_QNET);
1.1 root 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);
1.1.1.2 ! root 447: fwrite(&ch,1,1,personal);
! 448: }
1.1 root 449: fwrite(&f,4,1,ndx);
450: fwrite(&ch,1,1,ndx);
1.1.1.2 ! root 451: msgndx+=size/QWK_BLOCK_LEN;
! 452: }
1.1 root 453:
454: smb_freemsgmem(&msg);
455: (*msgcnt)++;
456: submsgs++;
457: if(cfg.max_qwkmsgs
1.1.1.2 ! root 458: && !(useron.exempt&FLAG('O')) && (*msgcnt)>=cfg.max_qwkmsgs) {
1.1 root 459: bputs(text[QWKmsgLimitReached]);
1.1.1.2 ! root 460: break;
! 461: }
! 462: if(!(l%50))
! 463: YIELD(); /* yield */
! 464: }
1.1 root 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))
1.1.1.2 ! root 471: remove(str);
! 472: }
1.1 root 473: smb_close(&smb);
474: LFREE(post);
475: if(l<posts)
1.1.1.2 ! root 476: break;
! 477: YIELD(); /* yield */
! 478: }
! 479: }
1.1 root 480: if(j<usrsubs[i]) /* if sub aborted, abort all */
1.1.1.2 ! root 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);
1.1 root 490:
491: if((*msgcnt)+mailmsgs && time(NULL)-start) {
1.1.1.2 ! root 492: bprintf("\r\n\r\n\1n\1hPacked %lu messages (%lu bytes) in %lu seconds "
1.1 root 493: "(%lu messages/second)."
1.1.1.2 ! root 494: ,(*msgcnt)+mailmsgs
! 495: ,ftell(qwk)
! 496: ,time(NULL)-start
1.1 root 497: ,((*msgcnt)+mailmsgs)/(time(NULL)-start));
1.1.1.2 ! root 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)
1.1 root 502: ,((*msgcnt)+mailmsgs)/(time(NULL)-start));
1.1.1.2 ! root 503: if(online==ON_LOCAL) /* event */
! 504: eprintf(LOG_INFO,"%s",str);
! 505: else
! 506: lprintf(LOG_INFO,"%s",str);
1.1 root 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))
1.1.1.2 ! root 514: remove(str);
! 515: }
1.1 root 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);
1.1.1.2 ! root 524: while(dir!=NULL && (dirent=readdir(dir))!=NULL) { /* Move files into temp dir */
1.1 root 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 */
1.1.1.2 ! root 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);
1.1 root 534: bprintf(text[RetrievingFile],str);
535: if(!mv(str,tmp2,1))
536: netfiles++;
537: }
1.1.1.2 ! root 538: if(dir!=NULL)
! 539: closedir(dir);
1.1 root 540: if(netfiles)
1.1.1.2 ! root 541: CRLF;
! 542: }
1.1 root 543:
544: if(batdn_total) {
545: for(i=0,totalcdt=0;i<batdn_total;i++)
1.1.1.2 ! root 546: if(!is_download_free(&cfg,batdn_dir[i],&useron))
1.1 root 547: totalcdt+=batdn_cdt[i];
1.1.1.2 ! root 548: if(totalcdt>useron.cdt+useron.freecdt) {
1.1 root 549: bprintf(text[YouOnlyHaveNCredits]
1.1.1.2 ! root 550: ,ultoac(useron.cdt+useron.freecdt,tmp));
! 551: }
1.1 root 552: else {
553: for(i=0,totaltime=0;i<batdn_total;i++) {
554: if(!(cfg.dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
1.1.1.2 ! root 555: totaltime+=batdn_size[i]/(ulong)cur_cps;
! 556: }
1.1 root 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);
1.1.1.2 ! root 564: if(!fexistcase(tmp2)) {
1.1 root 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);
1.1.1.2 ! root 576: CRLF;
! 577: }
! 578: }
! 579: }
! 580: }
! 581: }
1.1 root 582:
583: if(!(*msgcnt) && !mailmsgs && !files && !netfiles && !batdn_total
584: && (prepack || !preqwk)) {
585: bputs(text[QWKNoNewMessages]);
1.1.1.2 ! root 586: return(false);
! 587: }
1.1 root 588:
589: if(!prepack && !(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);
1.1.1.2 ! root 594: if(fexistcase(str)) {
1.1 root 595: sprintf(tmp2,"%sHELLO",cfg.temp_dir);
1.1.1.2 ! root 596: mv(str,tmp2,1);
! 597: }
1.1 root 598: sprintf(str,"%sQWK/BBSNEWS",cfg.text_dir);
1.1.1.2 ! root 599: if(fexistcase(str)) {
1.1 root 600: sprintf(tmp2,"%sBBSNEWS",cfg.temp_dir);
1.1.1.2 ! root 601: mv(str,tmp2,1);
! 602: }
1.1 root 603: sprintf(str,"%sQWK/GOODBYE",cfg.text_dir);
1.1.1.2 ! root 604: if(fexistcase(str)) {
1.1 root 605: sprintf(tmp2,"%sGOODBYE",cfg.temp_dir);
1.1.1.2 ! root 606: mv(str,tmp2,1);
! 607: }
1.1 root 608: sprintf(str,"%sQWK/BLT-*",cfg.text_dir);
609: glob(str,0,NULL,&g);
1.1.1.2 ! root 610: for(i=0;i<(uint)g.gl_pathc;i++) { /* Copy BLT-*.* files */
1.1 root 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)
1.1.1.2 ! root 627: break;
! 628: }
1.1 root 629: if(i<=cfg.sys_nodes) /* Don't pre-pack with user online */
1.1.1.2 ! root 630: return(false);
! 631: }
1.1 root 632:
633: /*******************/
634: /* Compress Packet */
635: /*******************/
636: sprintf(tmp2,"%s%s",cfg.temp_dir,ALLFILES);
1.1.1.2 ! root 637: i=external(cmdstr(temp_cmd(),packet,tmp2,NULL)
! 638: ,ex|EX_WILDCARD);
1.1 root 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");
1.1.1.2 ! root 645: return(false);
! 646: }
1.1 root 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);
1.1.1.2 ! root 669: while(dir!=NULL && (dirent=readdir(dir))!=NULL) {
1.1 root 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: }
1.1.1.2 ! root 676: if(dir!=NULL)
! 677: closedir(dir);
1.1 root 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.