home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / DEVBBS.ZIP / SR.C < prev    next >
C/C++ Source or Header  |  1992-07-28  |  12KB  |  599 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. *****************************************************************************/
  7.  
  8. #include "vars.h"
  9. #pragma hdrstop
  10. #include <time.h>
  11. #include <math.h>
  12.  
  13. char *stripfn(char *fn)
  14. {
  15.   static char ofn[15];
  16.   int i,i1;
  17.   char s[81];
  18.  
  19.   i1=-1;
  20.   for (i=0; i<strlen(fn); i++)
  21.     if ((fn[i]=='\\') || (fn[i]==':') || (fn[i]=='/'))
  22.       i1=i;
  23.   if (i1!=-1)
  24.     strcpy(s,&(fn[i1+1]));
  25.   else
  26.     strcpy(s,fn);
  27.   for (i=0; i<strlen(s); i++)
  28.     if ((s[i]>='A') && (s[i]<='Z'))
  29.       s[i]=s[i]-'A'+'a';
  30.   i=0;
  31.   while (s[i]!=0) {
  32.     if (s[i]==32)
  33.       strcpy(&s[i],&s[i+1]);
  34.     else
  35.       ++i;
  36.   }
  37.   strcpy(ofn,s);
  38.   return(ofn);
  39. }
  40.  
  41. void stripfn1(char *fn)
  42. {
  43.   int i,i1;
  44.   char s[81],s1[81];
  45.  
  46.   i1=0;
  47.   for (i=0; i<strlen(fn); i++)
  48.     if ((fn[i]=='\\') || (fn[i]==':') || (fn[i]=='/'))
  49.       i1=i;
  50.   strcpy(s1,fn);
  51.   if (i1) {
  52.     strcpy(s,&(fn[i1+1]));
  53.     s1[i1+1]=0;
  54.   } else {
  55.     strcpy(s,fn);
  56.     s1[0]=0;
  57.   }
  58.   for (i=0; i<strlen(s); i++)
  59.     if ((s[i]>='A') && (s[i]<='Z'))
  60.       s[i]=s[i]-'A'+'a';
  61.   i=0;
  62.   while (s[i]!=0) {
  63.     if (s[i]==32)
  64.       strcpy(&s[i],&s[i+1]);
  65.     else
  66.       ++i;
  67.   }
  68.   strcat(s1,s);
  69.   strcpy(fn,s1);
  70. }
  71.  
  72. void calc_CRC(unsigned char b)
  73. {
  74.   int i;
  75.  
  76.   checksum += b;
  77.   crc ^= (((unsigned short) (b)) << 8);
  78.   for (i=0; i<8; i++)
  79.     if (crc & 0x8000) {
  80.       crc=(crc << 1);
  81.       crc ^= 0x1021;
  82.     } else
  83.       crc=(crc << 1);
  84. }
  85.  
  86. char gettimeout(double d, int *abort)
  87. {
  88.   double d1;
  89.   char ch;
  90.  
  91.   if (comhit())
  92.     return(get1c());
  93.   d1=timer();
  94.   while ((fabs(timer()-d1)<d) && (!comhit()) && (!hangup) && (!*abort)) {
  95.     if (kbhitb()) {
  96.       ch=getchd();
  97.       if (ch==0)
  98.         getchd();
  99.       else
  100.         if (ch==27)
  101.           *abort=1;
  102.     }
  103.     checkhangup();
  104.   }
  105.   if (comhit())
  106.     return(get1c());
  107.   else
  108.     return(0);
  109. }
  110.  
  111. int extern_prot(int pn, char *fn1, int sending)
  112. {
  113.   char s[255],s1[81],s2[81],fn[81],sx1[21],sx2[21],sx3[21];
  114.   int i,i1;
  115.  
  116.   if (sending) {
  117.     nl();
  118.     pl("> Beginning file transmission, ^X to abort.");
  119.     strcpy(s1,(externs[pn].sendfn));
  120.   } else {
  121.     nl();
  122.     pl("> Ready to receive, ^X to abort.");
  123.     strcpy(s1,(externs[pn].receivefn));
  124.   }
  125.   strcpy(fn,fn1);
  126.   stripfn1(fn);
  127.   ultoa(com_speed,sx1,10);
  128.   ultoa(modem_speed,sx3,10);
  129.   sx2[0]='0'+syscfg.primaryport;
  130.   sx2[1]=0;
  131.   stuff_in(s,s1,sx1,sx2,fn,sx3,"");
  132.   if (s[0]) {
  133.     set_protect(0);
  134.     outs("\r\n*> Current user: ");
  135.     outs(nam(&thisuser,usernum));
  136.     outs("\r\n\r\n");
  137.     outs(s);
  138.     outs("\r\n");
  139.     if (incom) {
  140.       i=run_external1(s);
  141.       topscreen();
  142.       return(i);
  143.     } else {
  144.       topscreen();
  145.       return(-5);
  146.     }
  147.   }
  148.   return(-5);
  149. }
  150.  
  151. int ok_prot(int pn, xfertype xt)
  152. {
  153.   int ok=0;
  154.   int i;
  155.  
  156.   if (xt==xf_none)
  157.     return(0);
  158.   if ((pn>0) || (pn<(numextrn+6))) {
  159.     switch(pn) {
  160.       case 1:
  161.         if ((xt==xf_down) || (xt==xf_down_temp))
  162.           ok=1;
  163.         break;
  164.       case 2:
  165.       case 3:
  166.       case 4:
  167.         if ((xt!=xf_up_batch) && (xt!=xf_down_batch) && (xt!=xf_bi))
  168.           ok=1;
  169.         if ((pn==4) && (xt==xf_down_batch))
  170.           ok=1;
  171.         break;
  172.       case 5:
  173.         if (xt==xf_up) {
  174.           for (i=0; i<numextrn; i++)
  175.             if (externs[i].receivebatchfn[0] || externs[i].bibatchfn)
  176.               ok=1;
  177.         } else if (xt==xf_down) {
  178.           for (i=0; i<numextrn; i++)
  179.             if (externs[i].sendbatchfn[0] || externs[i].bibatchfn)
  180.               ok=1;
  181.         }
  182.         if ((xt==xf_up) || (xt==xf_down))
  183.           ok=1;
  184.         break;
  185.       default:
  186.         switch(xt) {
  187.           case xf_up:
  188.           case xf_up_temp:
  189.             if (externs[pn-6].receivefn[0])
  190.               ok=1;
  191.             break;
  192.           case xf_down:
  193.           case xf_down_temp:
  194.             if (externs[pn-6].sendfn[0])
  195.               ok=1;
  196.             break;
  197.           case xf_up_batch:
  198.             if (externs[pn-6].receivebatchfn[0])
  199.               ok=1;
  200.             break;
  201.           case xf_down_batch:
  202.             if (externs[pn-6].sendbatchfn[0])
  203.               ok=1;
  204.             break;
  205.           case xf_bi:
  206.             if (externs[pn-6].bibatchfn[0])
  207.               ok=1;
  208.             break;
  209.         }
  210.         if (externs[pn-6].othr & othr_error_correct)
  211.           if (!(modem_flag & flag_ec))
  212.             ok=0;
  213.         break;
  214.     }
  215.   }
  216.   return(ok);
  217. }
  218.  
  219. char *prot_name(int pn)
  220. {
  221.   char *ss=">NONE<";
  222.  
  223.   switch(pn) {
  224.     case 1:
  225.       ss="ASCII";
  226.       break;
  227.     case 2:
  228.       ss="Xmodem";
  229.       break;
  230.     case 3:
  231.       ss="Xmodem-CRC";
  232.       break;
  233.     case 4:
  234.       ss="Ymodem";
  235.       break;
  236.     case 5:
  237.       ss="Batch";
  238.       break;
  239.     default:
  240.       if ((pn>5) || (pn<(numextrn+6)))
  241.         ss=externs[pn-6].description;
  242.       break;
  243.   }
  244.   return(ss);
  245. }
  246.  
  247. int get_protocol(xfertype xt)
  248. {
  249.   char s[81],s1[81],oks[81],s2[81],ch,*ss;
  250.   int i,i1,i2,prot,maxprot,done,only;
  251.  
  252.   if (ok_prot(thisuser.defprot, xt))
  253.     prot=thisuser.defprot;
  254.   else
  255.     prot=0;
  256.   strcpy(oks,"Q?0");
  257.   i1=strlen(oks);
  258.   only=0;
  259.   maxprot=5+numextrn;
  260.   for (i=1; i<=maxprot; i++) {
  261.     if (ok_prot(i,xt)) {
  262.       if (i<10)
  263.         oks[i1++]='0'+i;
  264.       else
  265.         oks[i1++]='A'+i-10;
  266.       if (only==0)
  267.         only=i;
  268.       else
  269.         only=-1;
  270.     }
  271.   }
  272.   oks[i1]=0;
  273.   if (only>0)
  274.     prot=only;
  275.   if ((only==0) && (xt != xf_none)) {
  276.     nl();
  277.     pl("No protocols available for that.");
  278.     nl();
  279.     return(-1);
  280.   }
  281.   done=0;
  282.   if (prot) {
  283.     ss=prot_name(prot);
  284.     sprintf(s,"Option (?=list, <C/R>=%s) : ",ss);
  285.     strcpy(s1,oks);
  286.     strcat(s1,"\r");
  287.   } else {
  288.     strcpy(s,"Option (?=list) : ");
  289.     strcpy(s1,oks);
  290.   }
  291.   do {
  292.     nl();
  293.     prt(2,s);
  294.     ch=onek(s1);
  295.     if (ch=='?') {
  296.       nl();
  297.       pl("Q: Quit");
  298.       pl("0: Next File");
  299.       for (i=1; i<=maxprot; i++) {
  300.         if (ok_prot(i,xt)) {
  301.           npr("%c. %s\r\n",(i<10)?(i+'0'):(i+'A'-10),prot_name(i));
  302.         }
  303.       }
  304.       nl();
  305.     } else
  306.       done=1;
  307.   } while ((!done) && (!hangup));
  308.   if (ch==13)
  309.     return(prot);
  310.   if ((ch>='0') && (ch<='9'))
  311.     return(ch-'0');
  312.   else
  313.     if (ch=='Q')
  314.       return(-1);
  315.     else
  316.       return(ch-'A'+10);
  317. }
  318.  
  319. void ascii_send(char *fn, int *sent, double *percent)
  320. {
  321.   char b[2048];
  322.   int i,i1,done,abort,i2,next;
  323.   long pos,max;
  324.  
  325.   i=open(fn,O_RDONLY | O_BINARY);
  326.   if (i>0) {
  327.     max=filelength(i);
  328.     if (!max)
  329.       max=1;
  330.     i1=read(i,(void *)b,1024);
  331.     pos=0L;
  332.     abort=0;
  333.     while ((i1) && (!hangup) && (!abort)) {
  334.       i2=0;
  335.       while ((!hangup) && (!abort) && (i2<i1)) {
  336.     checkhangup();
  337.     outchr(b[i2++]);
  338.     checka(&abort,&next);
  339.       }
  340.       pos += (long) i2;
  341.       checka(&abort,&next);
  342.       i1=read(i,(void *)b,1024);
  343.     }
  344.     close(i);
  345.     if (!abort)
  346.       *sent=1;
  347.     else {
  348.       *sent=0;
  349.       thisuser.dk += ((pos+1023L)/1024L);
  350.     }
  351.     *percent=((double) pos)/((double)max);
  352.   } else {
  353.     nl();
  354.     pl("File not found.");
  355.     nl();
  356.     *sent=0;
  357.     *percent=0.0;
  358.   }
  359. }
  360.  
  361. void send_file(char *fn, int *sent, int *abort, char ft, char *sfn, int dn, long fs)
  362. {
  363.   int i,i1,ok;
  364.   double percent,t;
  365.   char s[81];
  366.  
  367.   if (fs<0) {
  368.     i=get_protocol(xf_none);
  369.   } else {
  370.     if (dn==-1)
  371.       i=get_protocol(xf_down_temp);
  372.     else
  373.       i=get_protocol(xf_down);
  374.   }
  375.   ok=0;
  376.   percent=0.0;
  377.   if (check_batch_queue(sfn)) {
  378.     *sent=0;
  379.     if (i>0) {
  380.       nl();
  381.       pl("That file is already in the batch queue.");
  382.       nl();
  383.     } else if (i==-1)
  384.       *abort=1;
  385.   } else {
  386.     switch(i) {
  387.       case -1:
  388.         *sent=0;
  389.         *abort=1;
  390.         ok=1;
  391.         break;
  392.       case 0:
  393.         *sent=0;
  394.         *abort=0;
  395.         ok=1;
  396.         break;
  397.       case 1:
  398.         *sent=0;
  399.         *abort=0;
  400.         ascii_send(fn,sent,&percent);
  401.         break;
  402.       case 2:
  403.         if (incom)
  404.           xymodem_send(fn,sent,&percent,ft,0,0,0);
  405.         break;
  406.       case 3:
  407.         if (incom)
  408.           xymodem_send(fn,sent,&percent,ft,1,0,0);
  409.         break;
  410.       case 4:
  411.         if (incom)
  412.           xymodem_send(fn,sent,&percent,ft,1,1,0);
  413.         break;
  414.       case 5:
  415.         *sent=0;
  416.         *abort=0;
  417.         ok=1;
  418.         if (numbatch>=MAX_BATCH) {
  419.           nl();
  420.           pl("No room left in batch queue.");
  421.           nl();
  422.           *sent=0;
  423.           *abort=0;
  424.         } else {
  425.           t=(12.656) / ((double) (modem_speed)) * ((double)(fs));
  426.           if (nsl()<=(batchtime + t)) {
  427.             nl();
  428.             pl("Not enough time left in queue.");
  429.             nl();
  430.             *sent=0;
  431.             *abort=0;
  432.           } else {
  433.             if (dn==-1) {
  434.               nl();
  435.               pl("Can't add temporary file to batch queue.");
  436.               nl();
  437.               *sent=0;
  438.               *abort=0;
  439.             } else {
  440.               batchtime += t;
  441.               strcpy(batch[numbatch].filename,sfn);
  442.               batch[numbatch].dir=dn;
  443.               batch[numbatch].time=t;
  444.               batch[numbatch].sending=1;
  445.               batch[numbatch].len=fs;
  446.           numbatch++;
  447.           ++numbatchdl;
  448.           nl();
  449.           pl("File added to batch queue.");
  450.           sprintf(s,"Batch: Files - %d  Time - %s",numbatch,ctim(batchtime));
  451.           nl();
  452.           pl(s);
  453.           nl();
  454.           *sent=0;
  455.           *abort=0;
  456.         }
  457.       }
  458.     }
  459.     break;
  460.       default:
  461.         i1=extern_prot(i-6,fn,1);
  462.         *abort=0;
  463.         if (i1==externs[i-6].ok1)
  464.           *sent=1;
  465.         else
  466.           *sent=0;
  467.         break;
  468.     }
  469.   }
  470.   if ((*sent==0) && (ok==0))
  471.     if (percent==1.0) {
  472.       *sent=1;
  473.       add_ass(10,"Aborted on last block");
  474.     } else {
  475.       sprintf(s,"Tried D/L '%s' %3.2f%%",stripfn(fn),percent*100.0);
  476.       sysoplog(s);
  477.     }
  478. }
  479.  
  480. void receive_file(char *fn, int *received, char *ft, char *sfn, int dn)
  481. {
  482.   int i;
  483.   char s[81];
  484.  
  485.   if (dn==-1)
  486.     i=get_protocol(xf_up_temp);
  487.   else
  488.     i=get_protocol(xf_up);
  489.   switch(i) {
  490.     case -1:
  491.       *received=0;
  492.       break;
  493.     case 0:
  494.       *received=0;
  495.       break;
  496.     case 2:
  497.       if (incom)
  498.         xymodem_receive(fn,ft,received,0);
  499.       break;
  500.     case 3:
  501.       if (incom)
  502.         xymodem_receive(fn,ft,received,1);
  503.       break;
  504.     case 4:
  505.       if (incom)
  506.         xymodem_receive(fn,ft,received,1);
  507.       break;
  508.     case 5:
  509.       if (dn!=-1) {
  510.         if (numbatch>=MAX_BATCH) {
  511.           nl();
  512.           pl("No room left in batch queue.");
  513.           nl();
  514.           *received=0;
  515.         } else {
  516.           *received=2;
  517.           strcpy(batch[numbatch].filename,sfn);
  518.           batch[numbatch].dir=dn;
  519.           batch[numbatch].time=0;
  520.           batch[numbatch].sending=0;
  521.           batch[numbatch].len=0;
  522.       numbatch++;
  523.       nl();
  524.       pl("File added to batch queue.");
  525.       sprintf(s,"Batch upload: files - %d", numbatch-numbatchdl);
  526.       nl();
  527.       pl(s);
  528.       nl();
  529.     }
  530.       } else {
  531.         nl();
  532.         pl("Can't batch upload that.");
  533.         nl();
  534.       }
  535.       break;
  536.     default:
  537.       if ((i>5) && (incom)) {
  538.         extern_prot(i-6,fn,0);
  539.         *received=exist(fn);
  540.       }
  541.       break;
  542.   }
  543. }
  544.  
  545. char end_batch1()
  546. {
  547.   char b[128],ch;
  548.   int i,i1,done,nerr;
  549.  
  550.   for (i1=0; i1<128; i1++)
  551.     b[i1]=0;
  552.   done=0;
  553.   nerr=0;
  554.   i=0;
  555.   do {
  556.     send_block(b,5,1,0);
  557.     ch=gettimeout(5.0,&i);
  558.     if ((ch==6) || (ch==24))
  559.       done=1;
  560.     else {
  561.       ++nerr;
  562.       if (nerr>=9)
  563.         done=1;
  564.     }
  565.   } while ((!done) && (!hangup) && (!i));
  566.   if (ch==6)
  567.     return(6);
  568.   if (ch==24)
  569.     return(24);
  570.   return(21);
  571. }
  572.  
  573. void endbatch()
  574. {
  575.   char ch;
  576.   int abort,ucrc,terr,xx1,yy1;
  577.  
  578.   abort=0;
  579.   terr=0;
  580.   xx1=wherex();
  581.   yy1=wherey();
  582.   if (!okstart(&ucrc,&abort))
  583.     abort=1;
  584.   if ((!abort) && (!hangup)) {
  585.     ch=end_batch1();
  586.     if (ch==24)
  587.       abort=1;
  588.     if (ch==21) {
  589.       send_b(0,0L,3,0,&ucrc,"",&terr,&abort);
  590.       abort=1;
  591.     }
  592. /*
  593.     if ((!hangup) && (!abort))
  594.       send_b(0,0L,2,0,&ucrc,"",&terr,&abort);
  595. */
  596.   }
  597.   movecsr(xx1,yy1);
  598. }
  599.