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

  1. #line 1 "PACK_REP.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6. #include "post.h"
  7. #include "qwk.h"
  8.  
  9. /****************************************************************************/
  10. /* Creates an REP packet for upload to QWK hub 'hubnum'.                    */
  11. /* Returns 1 if successful, 0 if not.                                        */
  12. /****************************************************************************/
  13. char pack_rep(uint hubnum)
  14. {
  15.     uchar    str[256],tmp2[256],ch,*p;
  16.     uchar    HUGE16 *qwkbuf;
  17.     int     file,mode;
  18.     uint    i,j,k,n;
  19.     long    l,size,msgcnt,submsgs,mailmsgs,packedmail,netfiles=0,deleted;
  20.     ulong    last,ptr,posts,msgs;
  21.     post_t    HUGE16 *post;
  22.     mail_t    *mail;
  23.     struct    ffblk ff;
  24.     FILE    *rep;
  25.     smbmsg_t msg;
  26.  
  27. msgcnt=0L;
  28. delfiles(temp_dir,"*.*");
  29. sprintf(str,"%s%s.REP",data_dir,qhub[hubnum]->id);
  30. if(fexist(str))
  31.     external(cmdstr(qhub[hubnum]->unpack,str,"*.*",NULL),EX_OUTL);
  32. /*************************************************/
  33. /* Create SYSID.MSG, write header and leave open */
  34. /*************************************************/
  35. sprintf(str,"%s%s.MSG",temp_dir,qhub[hubnum]->id);
  36. if((rep=fnopen(&file,str,O_CREAT|O_WRONLY))==NULL) {
  37.     errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY);
  38.     return(0); }
  39. if(!filelength(file)) {                         /* New REP packet */
  40.     sprintf(str,"%-128s",qhub[hubnum]->id);     /* So write header */
  41.     fwrite(str,128,1,rep); }
  42. fseek(rep,0L,SEEK_END);
  43. /*********************/
  44. /* Pack new messages */
  45. /*********************/
  46. console|=CON_L_ECHO;
  47.  
  48. sprintf(smb.file,"%sMAIL",data_dir);
  49. smb.retry_time=smb_retry_time;
  50. if((i=smb_open(&smb))!=0) {
  51.     fclose(rep);
  52.     errormsg(WHERE,ERR_OPEN,smb.file,i);
  53.     return(0); }
  54.  
  55. /***********************/
  56. /* Pack E-mail, if any */
  57. /***********************/
  58. qwkmail_time=time(NULL);
  59. mailmsgs=loadmail(&mail,0,MAIL_YOUR,LM_QWK);
  60. packedmail=0;
  61. if(mailmsgs) {
  62.     bputs(text[QWKPackingEmail]);
  63.     for(l=0;l<mailmsgs;l++) {
  64.         bprintf("\b\b\b\b\b%-5lu",l+1);
  65.  
  66.         msg.idx.offset=mail[l].offset;
  67.         if(!loadmsg(&msg,mail[l].number))
  68.             continue;
  69.  
  70.         sprintf(str,"%s/",qhub[hubnum]->id);
  71.         if(msg.to_net.type!=NET_QWK
  72.             || (strcmp(msg.to_net.addr,qhub[hubnum]->id)
  73.             && strncmp(msg.to_net.addr,str,strlen(str)))) {
  74.             smb_unlockmsghdr(&smb,&msg);
  75.             smb_freemsgmem(&msg);
  76.             continue; }
  77.  
  78.         msgtoqwk(msg,rep,TO_QNET|REP|A_LEAVE,INVALID_SUB,0);
  79.         packedmail++;
  80.         smb_unlockmsghdr(&smb,&msg);
  81.         smb_freemsgmem(&msg); }
  82.     bprintf(text[QWKPackedEmail],packedmail); }
  83. smb_close(&smb);                    /* Close the e-mail */
  84. if(mailmsgs)
  85.     FREE(mail);
  86.  
  87. useron.number=1;
  88. getuserdat(&useron);
  89. for(i=0;i<qhub[hubnum]->subs;i++) {
  90.     j=qhub[hubnum]->sub[i];             /* j now equals the real sub num */
  91.     msgs=getlastmsg(j,&last,0);
  92.     lncntr=0;                        /* defeat pause */
  93.     if(!msgs || last<=sub[j]->ptr) {
  94.         if(sub[j]->ptr>last) {
  95.             sub[j]->ptr=last;
  96.             sub[j]->last=last; }
  97.         bprintf(text[NScanStatusFmt]
  98.             ,grp[sub[j]->grp]->sname
  99.             ,sub[j]->lname,0L,msgs);
  100.         continue; }
  101.  
  102.     sprintf(smb.file,"%s%s"
  103.         ,sub[j]->data_dir,sub[j]->code);
  104.     smb.retry_time=smb_retry_time;
  105.     if((k=smb_open(&smb))!=0) {
  106.         errormsg(WHERE,ERR_OPEN,smb.file,k);
  107.         continue; }
  108.  
  109.     post=loadposts(&posts,j,sub[j]->ptr,LP_BYSELF|LP_OTHERS|LP_PRIVATE|LP_REP);
  110.     bprintf(text[NScanStatusFmt]
  111.         ,grp[sub[j]->grp]->sname
  112.         ,sub[j]->lname,posts,msgs);
  113.     if(!posts)    { /* no new messages */
  114.         smb_close(&smb);
  115.         continue; }
  116.  
  117.     sub[j]->ptr=last;                   /* set pointer */
  118.     bputs(text[QWKPackingSubboard]);    /* ptr to last msg    */
  119.     submsgs=0;
  120.     for(l=0;l<posts;l++) {
  121.         bprintf("\b\b\b\b\b%-5lu",l+1);
  122.  
  123.         msg.idx.offset=post[l].offset;
  124.         if(!loadmsg(&msg,post[l].number))
  125.             continue;
  126.  
  127.         if(msg.from_net.type && msg.from_net.type!=NET_QWK &&
  128.             !(sub[j]->misc&SUB_GATE)) {
  129.             smb_freemsgmem(&msg);
  130.             smb_unlockmsghdr(&smb,&msg);
  131.             continue; }
  132.  
  133.         if(!strncmpi(msg.subj,"NE:",3) || (msg.from_net.type==NET_QWK &&
  134.             route_circ(msg.from_net.addr,qhub[hubnum]->id))) {
  135.             smb_freemsgmem(&msg);
  136.             smb_unlockmsghdr(&smb,&msg);
  137.             continue; }
  138.  
  139.         mode=qhub[hubnum]->mode[i]|TO_QNET|REP;
  140.         if(mode&A_LEAVE) mode|=(VIA|TZ);
  141.         if(msg.from_net.type!=NET_QWK)
  142.             mode|=TAGLINE;
  143.  
  144.         msgtoqwk(msg,rep,mode,j,qhub[hubnum]->conf[i]);
  145.  
  146.         smb_freemsgmem(&msg);
  147.         smb_unlockmsghdr(&smb,&msg);
  148.         msgcnt++;
  149.         submsgs++; }
  150.     bprintf(text[QWKPackedSubboard],submsgs,msgcnt);
  151.     LFREE(post);
  152.     smb_close(&smb); }
  153.  
  154. fclose(rep);            /* close MESSAGE.DAT */
  155. CRLF;
  156.                         /* Look for extra files to send out */
  157. sprintf(str,"%sQNET\\%s.OUT\\*.*",data_dir,qhub[hubnum]->id);
  158. i=findfirst(str,&ff,0);
  159. while(!i) {
  160.     sprintf(str,"%sQNET\\%s.OUT\\%s",data_dir,qhub[hubnum]->id,ff.ff_name);
  161.     sprintf(tmp2,"%s%s",temp_dir,ff.ff_name);
  162.     bprintf(text[RetrievingFile],str);
  163.     if(!mv(str,tmp2,1))
  164.         netfiles++;
  165.     i=findnext(&ff); }
  166. if(netfiles)
  167.     CRLF;
  168.  
  169. if(!msgcnt && !netfiles && !packedmail) {
  170.     bputs(text[QWKNoNewMessages]);
  171.     return(0); }
  172.  
  173. /*******************/
  174. /* Compress Packet */
  175. /*******************/
  176. sprintf(str,"%s%s.REP",data_dir,qhub[hubnum]->id);
  177. sprintf(tmp2,"%s*.*",temp_dir);
  178. i=external(cmdstr(qhub[hubnum]->pack,str,tmp2,NULL),EX_OUTL);
  179. if(!fexist(str)) {
  180.     bputs(text[QWKCompressionFailed]);
  181.     if(i)
  182.         errormsg(WHERE,ERR_EXEC,cmdstr(qhub[hubnum]->pack,str,tmp2,NULL),i);
  183.     else
  184.         errorlog("Couldn't compress REP packet");
  185.     return(0); }
  186. sprintf(str,"%sQNET\\%s.OUT\\",data_dir,qhub[hubnum]->id);
  187. delfiles(str,"*.*");
  188.  
  189. if(packedmail) {                        /* Delete NetMail */
  190.     sprintf(smb.file,"%sMAIL",data_dir);
  191.     smb.retry_time=smb_retry_time;
  192.     if((i=smb_open(&smb))!=0) {
  193.         errormsg(WHERE,ERR_OPEN,smb.file,i);
  194.         return(1); }
  195.  
  196.     mailmsgs=loadmail(&mail,0,MAIL_YOUR,LM_QWK);
  197.  
  198.     if((i=smb_locksmbhdr(&smb))!=0) {              /* Lock the base, so nobody */
  199.         if(mailmsgs)
  200.             FREE(mail);
  201.         smb_close(&smb);
  202.         errormsg(WHERE,ERR_LOCK,smb.file,i);    /* messes with the index */
  203.         return(1); }
  204.  
  205.     if((i=smb_getstatus(&smb))!=0) {
  206.         if(mailmsgs)
  207.             FREE(mail);
  208.         smb_close(&smb);
  209.         errormsg(WHERE,ERR_READ,smb.file,i);
  210.         return(1); }
  211.  
  212.     deleted=0;
  213.     /* Mark as READ and DELETE */
  214.     for(l=0;l<mailmsgs;l++) {
  215.         if(mail[l].time>qwkmail_time)
  216.             continue;
  217.         msg.idx.offset=0;
  218.         if(!loadmsg(&msg,mail[l].number))
  219.             continue;
  220.  
  221.         sprintf(str,"%s/",qhub[hubnum]->id);
  222.         if(msg.to_net.type!=NET_QWK
  223.             || (strcmp(msg.to_net.addr,qhub[hubnum]->id)
  224.             && strncmp(msg.to_net.addr,str,strlen(str)))) {
  225.             smb_unlockmsghdr(&smb,&msg);
  226.             smb_freemsgmem(&msg);
  227.             continue; }
  228.  
  229.         msg.hdr.attr|=MSG_DELETE;
  230.         msg.idx.attr=msg.hdr.attr;
  231.         if((i=smb_putmsg(&smb,&msg))!=0)
  232.             errormsg(WHERE,ERR_WRITE,smb.file,i);
  233.         else
  234.             deleted++;
  235.         smb_unlockmsghdr(&smb,&msg);
  236.         smb_freemsgmem(&msg); }
  237.  
  238.     if(deleted && sys_misc&SM_DELEMAIL)
  239.         delmail(0,MAIL_YOUR);
  240.     smb_close(&smb);
  241.     if(mailmsgs)
  242.         FREE(mail); }
  243.  
  244. return(1);
  245. }
  246.