home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / SR.C < prev    next >
Text File  |  1991-12-26  |  13KB  |  639 lines

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