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

  1. #line 1 "UN_REP.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 .REP packet, 'repname' is the path and filename of the packet    */
  10. /****************************************************************************/
  11. void unpack_rep()
  12. {
  13.     uchar    ch,str[256],fname[128],block[128]
  14.             ,*AttemptedToUploadREPpacket="Attempted to upload REP packet";
  15.     int     file;
  16.     uint    h,i,j,k,msgs,lastsub=INVALID_SUB;
  17.     ulong    n;
  18.     long    l,size,misc,crc;
  19.     node_t    node;
  20.     time_t    t;
  21.     file_t    f;
  22.     struct  ffblk ff;
  23.     FILE    *rep;
  24.  
  25. sprintf(str,"%s%s.REP",temp_dir,sys_id);
  26. if(!fexist(str)) {
  27.     bputs(text[QWKReplyNotReceived]);
  28.     logline("U!",AttemptedToUploadREPpacket);
  29.     logline(nulstr,"REP file not received");
  30.     return; }
  31. for(k=0;k<total_fextrs;k++)
  32.     if(!stricmp(fextr[k]->ext,useron.tmpext) && chk_ar(fextr[k]->ar,useron))
  33.         break;
  34. if(k>=total_fextrs)
  35.     k=0;
  36. i=external(cmdstr(fextr[k]->cmd,str,"*.*",NULL),EX_OUTL|EX_OUTR);
  37. if(i) {
  38.     bputs(text[QWKExtractionFailed]);
  39.     logline("U!",AttemptedToUploadREPpacket);
  40.     logline(nulstr,"Extraction failed");
  41.     return; }
  42. sprintf(str,"%s%s.MSG",temp_dir,sys_id);
  43. if(!fexist(str)) {
  44.     bputs(text[QWKReplyNotReceived]);
  45.     logline("U!",AttemptedToUploadREPpacket);
  46.     logline(nulstr,"MSG file not received");
  47.     return; }
  48. if((rep=fnopen(&file,str,O_RDONLY))==NULL) {
  49.     errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
  50.     return; }
  51. size=filelength(file);
  52. fread(block,128,1,rep);
  53. if(strncmpi(block,sys_id,strlen(sys_id))) {
  54.     fclose(rep);
  55.     bputs(text[QWKReplyNotReceived]);
  56.     logline("U!",AttemptedToUploadREPpacket);
  57.     logline(nulstr,"Incorrect BBSID");
  58.     return; }
  59. logline("U+","Uploaded REP packet");
  60. /********************/
  61. /* Process messages */
  62. /********************/
  63. bputs(text[QWKUnpacking]);
  64.  
  65. for(l=128;l<size;l+=i*128) {
  66.     lncntr=0;                    /* defeat pause */
  67.     fseek(rep,l,SEEK_SET);
  68.     fread(block,128,1,rep);
  69.     sprintf(tmp,"%.6s",block+116);
  70.     i=atoi(tmp);  /* i = number of 128 byte records */
  71.     if(i<2) {
  72.         sprintf(tmp,"%s blocks",str);
  73.         errormsg(WHERE,ERR_CHK,tmp,i);
  74.         i=1;
  75.         continue; }
  76.     if(atoi(block+1)==0) {                    /**********/
  77.         if(useron.rest&FLAG('E')) {         /* E-mail */
  78.             bputs(text[R_Email]);            /**********/
  79.             continue; }
  80.  
  81.         sprintf(str,"%25.25s",block+21);
  82.         truncsp(str);
  83.         if(!stricmp(str,"NETMAIL")) {  /* QWK to FidoNet NetMail */
  84.             qwktonetmail(rep,block,NULL,0);
  85.             continue; }
  86.         if(strchr(str,'@')) {
  87.             qwktonetmail(rep,block,str,0);
  88.             continue; }
  89.         if(!stricmp(str,"SBBS")) {    /* to SBBS, config stuff */
  90.             qwkcfgline(block+71,INVALID_SUB);
  91.             continue; }
  92.  
  93.         if(useron.etoday>=level_emailperday[useron.level]
  94.             && !(useron.rest&FLAG('Q'))) {
  95.             bputs(text[TooManyEmailsToday]);
  96.             continue; }
  97.         j=atoi(str);
  98.         if(j && j>lastuser())
  99.             j=0;
  100.         if(!j &&
  101.             (!stricmp(str,"SYSOP")
  102.             || !stricmp(str,sys_id)
  103.             || !stricmp(str,sys_op)))
  104.             j=1;
  105.         if(!j)
  106.             j=matchuser(str);
  107.         if(!j) {
  108.             bputs(text[UnknownUser]);
  109.             continue; }
  110.         if(j==1 && useron.rest&FLAG('S')) {
  111.             bprintf(text[R_Feedback],sys_op);
  112.             continue; }
  113.  
  114.         getuserrec(j,U_MISC,8,str);
  115.         misc=ahtoul(str);
  116.         if(misc&NETMAIL && sys_misc&SM_FWDTONET) {
  117.             getuserrec(j,U_NETMAIL,LEN_NETMAIL,str);
  118.             qwktonetmail(rep,block,str,0);
  119.             continue; }
  120.  
  121.         sprintf(smb.file,"%sMAIL",data_dir);
  122.         smb.retry_time=smb_retry_time;
  123.  
  124.         if(lastsub!=INVALID_SUB) {
  125.             smb_close(&smb);
  126.             lastsub=INVALID_SUB; }
  127.  
  128.         if((k=smb_open(&smb))!=0) {
  129.             errormsg(WHERE,ERR_OPEN,smb.file,k);
  130.             continue; }
  131.  
  132.         if(!filelength(fileno(smb.shd_fp))) {
  133.             smb.status.max_crcs=mail_maxcrcs;
  134.             smb.status.max_msgs=MAX_SYSMAIL;
  135.             smb.status.max_age=mail_maxage;
  136.             smb.status.attr=SMB_EMAIL;
  137.             if((k=smb_create(&smb))!=0) {
  138.                 smb_close(&smb);
  139.                 errormsg(WHERE,ERR_CREATE,smb.file,k);
  140.                 continue; } }
  141.  
  142.         if((k=smb_locksmbhdr(&smb))!=0) {
  143.             smb_close(&smb);
  144.             errormsg(WHERE,ERR_LOCK,smb.file,k);
  145.             continue; }
  146.  
  147.         if((k=smb_getstatus(&smb))!=0) {
  148.             smb_close(&smb);
  149.             errormsg(WHERE,ERR_READ,smb.file,k);
  150.             continue; }
  151.  
  152.         smb_unlocksmbhdr(&smb);
  153.  
  154.         if(!qwktomsg(rep,block,0,INVALID_SUB,j)) {
  155.             smb_close(&smb);
  156.             continue; }
  157.         smb_close(&smb);
  158.  
  159.         if(j==1) {
  160.             useron.fbacks++;
  161.             logon_fbacks++;
  162.             putuserrec(useron.number,U_FBACKS,5
  163.                 ,itoa(useron.fbacks,tmp,10)); }
  164.         else {
  165.             useron.emails++;
  166.             logon_emails++;
  167.             putuserrec(useron.number,U_EMAILS,5
  168.                 ,itoa(useron.emails,tmp,10)); }
  169.         useron.etoday++;
  170.         putuserrec(useron.number,U_ETODAY,5
  171.             ,itoa(useron.etoday,tmp,10));
  172.         bprintf(text[Emailed],username(j,tmp),j);
  173.         sprintf(str,"E-mailed %s #%d",username(j,tmp),j);
  174.         logline("E+",str);
  175.         if(useron.rest&FLAG('Q')) {
  176.             sprintf(tmp,"%-25.25s",block+46);
  177.             truncsp(tmp); }
  178.         else
  179.             strcpy(tmp,useron.alias);
  180.         for(k=1;k<=sys_nodes;k++) { /* Tell user, if online */
  181.             getnodedat(k,&node,0);
  182.             if(node.useron==j && !(node.misc&NODE_POFF)
  183.                 && (node.status==NODE_INUSE
  184.                 || node.status==NODE_QUIET)) {
  185.                 sprintf(str,text[EmailNodeMsg]
  186.                     ,node_num,tmp);
  187.                 putnmsg(k,str);
  188.                 break; } }
  189.         if(k>sys_nodes) {
  190.             sprintf(str,text[UserSentYouMail],tmp);
  191.             putsmsg(j,str); } }    /* end of email */
  192.  
  193.             /**************************/
  194.     else {    /* message on a sub-board */
  195.             /**************************/
  196.         n=atol((char *)block+1); /* conference number */
  197.         for(j=0;j<usrgrps;j++) {
  198.             for(k=0;k<usrsubs[j];k++)
  199.                 if(sub[usrsub[j][k]]->qwkconf==n)
  200.                     break;
  201.             if(k<usrsubs[j])
  202.                 break; }
  203.  
  204.         if(j>=usrgrps) {
  205.             if(n<1000) {             /* version 1 method, start at 101 */
  206.                 j=n/100;
  207.                 k=n-(j*100); }
  208.             else {                     /* version 2 method, start at 1001 */
  209.                 j=n/1000;
  210.                 k=n-(j*1000); }
  211.             j--;    /* j is group */
  212.             k--;    /* k is sub */
  213.             if(j>=usrgrps || k>=usrsubs[j]) {
  214.                 bprintf(text[QWKInvalidConferenceN],n);
  215.                 sprintf(str,"Invalid conference number %d",n);
  216.                 logline("P!",str);
  217.                 continue; } }
  218.  
  219.         n=usrsub[j][k];
  220.  
  221.         /* if posting, add to new-scan config for QWKnet nodes automatically */
  222.         if(useron.rest&FLAG('Q'))
  223.             sub[n]->misc|=SUB_NSCAN;
  224.  
  225.         sprintf(str,"%-25.25s","SBBS");
  226.         if(!strnicmp((char *)block+21,str,25)) {    /* to SBBS, config stuff */
  227.             qwkcfgline((char *)block+71,n);
  228.             continue; }
  229.  
  230.         if(!SYSOP && sub[n]->misc&SUB_QNET) {    /* QWK Netted */
  231.             sprintf(str,"%-25.25s","DROP");         /* Drop from new-scan? */
  232.             if(!strnicmp((char *)block+71,str,25))    /* don't allow post */
  233.                 continue;
  234.             sprintf(str,"%-25.25s","ADD");          /* Add to new-scan? */
  235.             if(!strnicmp((char *)block+71,str,25))    /* don't allow post */
  236.                 continue; }
  237.  
  238.         if(useron.rest&FLAG('Q') && !(sub[n]->misc&SUB_QNET)) {
  239.             bputs(text[CantPostOnSub]);
  240.             logline("P!","Attempted to post on non-QWKnet sub");
  241.             continue; }
  242.  
  243.         if(useron.rest&FLAG('P')) {
  244.             bputs(text[R_Post]);
  245.             logline("P!","Post attempted");
  246.             continue; }
  247.  
  248.         if(useron.ptoday>=level_postsperday[useron.level]
  249.             && !(useron.rest&FLAG('Q'))) {
  250.             bputs(text[TooManyPostsToday]);
  251.             continue; }
  252.  
  253.         if(useron.rest&FLAG('N')
  254.             && sub[n]->misc&(SUB_FIDO|SUB_PNET|SUB_QNET|SUB_INET)) {
  255.             bputs(text[CantPostOnSub]);
  256.             logline("P!","Networked post attempted");
  257.             continue; }
  258.  
  259.         if(!chk_ar(sub[n]->post_ar,useron)) {
  260.             bputs(text[CantPostOnSub]);
  261.             logline("P!","Post attempted");
  262.             continue; }
  263.  
  264.         if((block[0]=='*' || block[0]=='+')
  265.             && !(sub[n]->misc&SUB_PRIV)) {
  266.             bputs(text[PrivatePostsNotAllowed]);
  267.             logline("P!","Private post attempt");
  268.             continue; }
  269.  
  270.         if(block[0]=='*' || block[0]=='+'           /* Private post */
  271.             || sub[n]->misc&SUB_PONLY) {
  272.             sprintf(str,"%-25.25s",nulstr);
  273.             sprintf(tmp,"%-25.25s","ALL");
  274.             if(!strnicmp((char *)block+21,str,25)
  275.                 || !strnicmp((char *)block+21,tmp,25)) {    /* to blank */
  276.                 bputs(text[NoToUser]);                        /* or all */
  277.                 continue; } }
  278.  
  279.         if(!SYSOP && !(useron.rest&FLAG('Q'))) {
  280.             sprintf(str,"%-25.25s","SYSOP");
  281.             if(!strnicmp((char *)block+21,str,25)) {
  282.                 sprintf(str,"%-25.25s",username(1,tmp));
  283.                 memcpy((char *)block+21,str,25); } }    /* change from sysop */
  284.                                                         /* to user #1 */
  285.  
  286. #if 0    /* TWIT FILTER */
  287.         sprintf(str,"%25.25s",block+46);  /* From user */
  288.         truncsp(str);
  289.  
  290.         if(!stricmp(str,"Lee Matherne")
  291.             || !stricmp(str,"Big Joe")
  292.             ) {
  293.             bprintf(text[Posted],grp[sub[n]->grp]->sname
  294.                 ,sub[n]->lname);
  295.             continue; }
  296. #endif
  297.  
  298.         if(n!=lastsub) {
  299.             if(lastsub!=INVALID_SUB)
  300.                 smb_close(&smb);
  301.             lastsub=INVALID_SUB;
  302.             sprintf(smb.file,"%s%s",sub[n]->data_dir,sub[n]->code);
  303.             smb.retry_time=smb_retry_time;
  304.             if((j=smb_open(&smb))!=0) {
  305.                 errormsg(WHERE,ERR_OPEN,smb.file,j);
  306.                 continue; }
  307.  
  308.             if(!filelength(fileno(smb.shd_fp))) {
  309.                 smb.status.max_crcs=sub[n]->maxcrcs;
  310.                 smb.status.max_msgs=sub[n]->maxmsgs;
  311.                 smb.status.max_age=sub[n]->maxage;
  312.                 smb.status.attr=sub[n]->misc&SUB_HYPER ? SMB_HYPERALLOC:0;
  313.                 if((j=smb_create(&smb))!=0) {
  314.                     smb_close(&smb);
  315.                     lastsub=INVALID_SUB;
  316.                     errormsg(WHERE,ERR_CREATE,smb.file,j);
  317.                     continue; } }
  318.  
  319.             if((j=smb_locksmbhdr(&smb))!=0) {
  320.                 smb_close(&smb);
  321.                 lastsub=INVALID_SUB;
  322.                 errormsg(WHERE,ERR_LOCK,smb.file,j);
  323.                 continue; }
  324.             if((j=smb_getstatus(&smb))!=0) {
  325.                 smb_close(&smb);
  326.                 lastsub=INVALID_SUB;
  327.                 errormsg(WHERE,ERR_READ,smb.file,j);
  328.                 continue; }
  329.             smb_unlocksmbhdr(&smb);
  330.             lastsub=n; }
  331.  
  332.         if(!qwktomsg(rep,block,0,n,0))
  333.             continue;
  334.  
  335.         useron.ptoday++;
  336.         useron.posts++;
  337. //          if(!(useron.rest&FLAG('Q')))
  338.         logon_posts++;
  339.         putuserrec(useron.number,U_POSTS,5,itoa(useron.posts,str,10));
  340.         putuserrec(useron.number,U_PTODAY,5,itoa(useron.ptoday,str,10));
  341.         bprintf(text[Posted],grp[sub[n]->grp]->sname
  342.             ,sub[n]->lname);
  343.         sprintf(str,"Posted on %s %s",grp[sub[n]->grp]->sname
  344.             ,sub[n]->lname);
  345.         if(sub[n]->misc&SUB_FIDO && sub[n]->echomail_sem[0])  /* semaphore */
  346.             if((file=nopen(sub[n]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
  347.                 close(file);
  348.         logline("P+",str); } }         /* end of public message */
  349.  
  350. update_qwkroute(NULL);            /* Write ROUTE.DAT */
  351.  
  352. if(lastsub!=INVALID_SUB)
  353.     smb_close(&smb);
  354. fclose(rep);
  355.  
  356. if(useron.rest&FLAG('Q')) {             /* QWK Net Node */
  357.     sprintf(str,"%s%s.MSG",temp_dir,sys_id);
  358.     remove(str);
  359.     sprintf(str,"%s%s.REP",temp_dir,sys_id);
  360.     remove(str);
  361.  
  362.     sprintf(str,"%s*.*",temp_dir);
  363.     i=findfirst(str,&ff,0);
  364.     if(!i) {
  365.         sprintf(str,"%sQNET\\%s.IN",data_dir,useron.alias);
  366.         mkdir(str); }
  367.     while(!i) {                         /* Extra files */
  368.         sprintf(str,"%s%s",temp_dir,ff.ff_name);
  369.         sprintf(fname,"%sQNET\\%s.IN\\%s",data_dir,useron.alias,ff.ff_name);
  370.         mv(str,fname,1);
  371.         sprintf(str,text[ReceivedFileViaQWK],ff.ff_name,useron.alias);
  372.         putsmsg(1,str);
  373.         i=findnext(&ff); } }
  374.  
  375. bputs(text[QWKUnpacked]);
  376. CRLF;
  377. /**********************************************/
  378. /* Hang-up now if that's what the user wanted */
  379. /**********************************************/
  380. autohangup();
  381.  
  382. }
  383.