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

  1. #line 1 "UN_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.  
  8. /****************************************************************************/
  9. /* Unpacks .QWK packet, hubnum is the number of the QWK net hub             */
  10. /****************************************************************************/
  11. void unpack_qwk(char *packet,uint hubnum)
  12. {
  13.     uchar    str[256],fname[128],block[128],ch;
  14.     int     k,file;
  15.     uint    i,j,n,msgs,lastsub=INVALID_SUB;
  16.     long    l,size,misc;
  17.     time_t    t;
  18.     struct  ffblk ff;
  19.     FILE    *qwk;
  20.  
  21. useron.number=1;
  22. getuserdat(&useron);
  23. console=CON_L_ECHO;
  24. i=external(cmdstr(qhub[hubnum]->unpack,packet,"*.*",NULL),EX_OUTL);
  25. if(i) {
  26.     errormsg(WHERE,ERR_EXEC,cmdstr(qhub[hubnum]->unpack,packet,"*.*",NULL),i);
  27.     return; }
  28. sprintf(str,"%sMESSAGES.DAT",temp_dir);
  29. if(!fexist(str)) {
  30.     sprintf(str,"%s.QWK doesn't contain MESSAGES.DAT",qhub[hubnum]->id);
  31.     errorlog(str);
  32.     return; }
  33. if((qwk=fnopen(&file,str,O_RDONLY))==NULL) {
  34.     errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
  35.     return; }
  36. size=filelength(file);
  37. /********************/
  38. /* Process messages */
  39. /********************/
  40. bputs(text[QWKUnpacking]);
  41.  
  42. for(l=128;l<size;l+=i*128) {
  43.     fseek(qwk,l,SEEK_SET);
  44.     fread(block,128,1,qwk);
  45.     sprintf(tmp,"%.6s",block+116);
  46.     i=atoi(tmp);  /* i = number of 128 byte records */
  47.     if(i<2) {
  48.         i=1;
  49.         continue; }
  50.     /*********************************/
  51.     /* public message on a sub-board */
  52.     /*********************************/
  53.     n=(uint)block[123]|(((uint)block[124])<<8);  /* conference number */
  54.  
  55.     if(!n) {        /* NETMAIL */
  56.         sprintf(str,"%25.25s",block+21);
  57.         truncsp(str);
  58.         if(!stricmp(str,"NETMAIL")) {  /* QWK to FidoNet NetMail */
  59.             qwktonetmail(qwk,block,NULL,hubnum+1);
  60.             continue; }
  61.         if(strchr(str,'@')) {
  62.             qwktonetmail(qwk,block,str,hubnum+1);
  63.             continue; }
  64.         j=atoi(str);
  65.         if(j && j>lastuser())
  66.             j=0;
  67.         if(!j && !stricmp(str,"SYSOP"))
  68.             j=1;
  69.         if(!j)
  70.             j=matchuser(str);
  71.         if(!j && !stricmp(str,sys_id))
  72.             j=1;
  73.         if(!j) {
  74.             bputs(text[UnknownUser]);
  75.             continue; }
  76.  
  77.         getuserrec(j,U_MISC,8,str);
  78.         misc=ahtoul(str);
  79.         if(misc&NETMAIL && sys_misc&SM_FWDTONET) {
  80.             getuserrec(j,U_NETMAIL,LEN_NETMAIL,str);
  81.             qwktonetmail(qwk,block,str,hubnum+1);
  82.             continue; }
  83.  
  84.         smb_stack(&smb,SMB_STACK_PUSH);
  85.         sprintf(smb.file,"%sMAIL",data_dir);
  86.         smb.retry_time=smb_retry_time;
  87.         if((k=smb_open(&smb))!=0) {
  88.             errormsg(WHERE,ERR_OPEN,smb.file,k);
  89.             smb_stack(&smb,SMB_STACK_POP);
  90.             continue; }
  91.         if(!filelength(fileno(smb.shd_fp))) {
  92.             smb.status.max_crcs=mail_maxcrcs;
  93.             smb.status.max_msgs=MAX_SYSMAIL;
  94.             smb.status.max_age=mail_maxage;
  95.             smb.status.attr=SMB_EMAIL;
  96.             if((k=smb_create(&smb))!=0) {
  97.                 smb_close(&smb);
  98.                 errormsg(WHERE,ERR_CREATE,smb.file,k);
  99.                 smb_stack(&smb,SMB_STACK_POP);
  100.                 continue; } }
  101.         if((k=smb_locksmbhdr(&smb))!=0) {
  102.             smb_close(&smb);
  103.             errormsg(WHERE,ERR_LOCK,smb.file,k);
  104.             smb_stack(&smb,SMB_STACK_POP);
  105.             continue; }
  106.         if((k=smb_getstatus(&smb))!=0) {
  107.             smb_close(&smb);
  108.             errormsg(WHERE,ERR_READ,smb.file,k);
  109.             smb_stack(&smb,SMB_STACK_POP);
  110.             continue; }
  111.         smb_unlocksmbhdr(&smb);
  112.         qwktomsg(qwk,block,hubnum+1,INVALID_SUB,j);
  113.         smb_close(&smb);
  114.         smb_stack(&smb,SMB_STACK_POP);
  115.         sprintf(tmp,"%-25.25s",block+46);
  116.         truncsp(tmp);
  117.         sprintf(str,text[UserSentYouMail],tmp);
  118.         putsmsg(j,str);
  119.         continue;
  120.         }
  121.  
  122.     for(j=0;j<qhub[hubnum]->subs;j++)
  123.         if(qhub[hubnum]->conf[j]==n)
  124.             break;
  125.     if(j>=qhub[hubnum]->subs)    /* ignore messages for subs not in config */
  126.         continue;
  127.  
  128.     j=qhub[hubnum]->sub[j];
  129.  
  130.     if(j!=lastsub) {
  131.         if(lastsub!=INVALID_SUB)
  132.             smb_close(&smb);
  133.         lastsub=INVALID_SUB;
  134.         sprintf(smb.file,"%s%s",sub[j]->data_dir,sub[j]->code);
  135.         smb.retry_time=smb_retry_time;
  136.         if((k=smb_open(&smb))!=0) {
  137.             errormsg(WHERE,ERR_OPEN,smb.file,k);
  138.             continue; }
  139.         if(!filelength(fileno(smb.shd_fp))) {
  140.             smb.status.max_crcs=sub[j]->maxcrcs;
  141.             smb.status.max_msgs=sub[j]->maxmsgs;
  142.             smb.status.max_age=sub[j]->maxage;
  143.             smb.status.attr=sub[j]->misc&SUB_HYPER ? SMB_HYPERALLOC :0;
  144.             if((k=smb_create(&smb))!=0) {
  145.                 smb_close(&smb);
  146.                 errormsg(WHERE,ERR_CREATE,smb.file,k);
  147.                 continue; } }
  148.         if((k=smb_locksmbhdr(&smb))!=0) {
  149.             smb_close(&smb);
  150.             errormsg(WHERE,ERR_LOCK,smb.file,k);
  151.             continue; }
  152.         if((k=smb_getstatus(&smb))!=0) {
  153.             smb_close(&smb);
  154.             errormsg(WHERE,ERR_READ,smb.file,k);
  155.             continue; }
  156.         smb_unlocksmbhdr(&smb);
  157.         lastsub=j; }
  158.  
  159.     if(!qwktomsg(qwk,block,hubnum+1,j,0))
  160.         continue;
  161.  
  162.     if(sub[j]->misc&SUB_FIDO && sub[j]->echomail_sem[0]) /* update semaphore */
  163.         if((file=nopen(sub[j]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
  164.             close(file);
  165.     bprintf(text[Posted],grp[sub[j]->grp]->sname,sub[j]->lname); }
  166.  
  167. update_qwkroute(NULL);        /* Write ROUTE.DAT */
  168.  
  169. fclose(qwk);
  170. if(lastsub!=INVALID_SUB)
  171.     smb_close(&smb);
  172.  
  173. delfiles(temp_dir,"*.NDX");
  174. sprintf(str,"%sMESSAGES.DAT",temp_dir);
  175. remove(str);
  176. sprintf(str,"%sDOOR.ID",temp_dir);
  177. remove(str);
  178. sprintf(str,"%sCONTROL.DAT",temp_dir);
  179. remove(str);
  180. sprintf(str,"%sNETFLAGS.DAT",temp_dir);
  181. remove(str);
  182.  
  183. sprintf(str,"%s*.*",temp_dir);
  184. i=findfirst(str,&ff,0);
  185. if(!i) {
  186.     sprintf(str,"%sQNET\\%s.IN",data_dir,qhub[hubnum]->id);
  187.     mkdir(str); }
  188. while(!i) {
  189.     sprintf(str,"%s%s",temp_dir,ff.ff_name);
  190.     sprintf(fname,"%sQNET\\%s.IN\\%s",data_dir,qhub[hubnum]->id,ff.ff_name);
  191.     mv(str,fname,1);
  192.     sprintf(str,text[ReceivedFileViaQWK],ff.ff_name,qhub[hubnum]->id);
  193.     putsmsg(1,str);
  194.     i=findnext(&ff); }
  195.  
  196. bputs(text[QWKUnpacked]);
  197. CRLF;
  198. remove(packet);
  199.  
  200. }
  201.