|
|
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.