home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / SR.C < prev    next >
C/C++ Source or Header  |  1993-05-06  |  12KB  |  592 lines

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