home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / PACK_QWK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  15.1 KB  |  528 lines

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