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

  1. #include "vars.h"
  2. #pragma hdrstop
  3. #include <math.h>
  4.  
  5. char modemkey(int *tout)
  6. {
  7.   double d1;
  8.   char ch;
  9.  
  10.   if (comhit()) {
  11.     ch=get1c();
  12.     calc_CRC(ch);
  13.     return(ch);
  14.   }
  15.   if (*tout)
  16.     return(0);
  17.   d1=timer();
  18.   while ((fabs(timer()-d1)<0.5) && (!comhit()) && (!hangup)) {
  19.     checkhangup();
  20.   }
  21.   if (comhit()) {
  22.     ch=get1c();
  23.     calc_CRC(ch);
  24.     return(ch);
  25.   }
  26.   *tout=1;
  27.   return(0);
  28. }
  29.  
  30. int receive_block(char *b, unsigned char *bln, int ucrc)
  31. {
  32.   int i,i1,bs,cerr,abort,err,tout,cc1;
  33.   unsigned char ch,bn,bn1,cs1;
  34.  
  35.   abort=0;
  36.   ch=gettimeout(5.0,&abort);
  37.   err=0;
  38.   if (abort)
  39.     return(6);
  40.   tout=0;
  41.   if (ch==0x81) {
  42.     bn=modemkey(&tout);
  43.     bn1=modemkey(&tout);
  44.     if ((bn ^ bn1)==0xff) {
  45.       b[0]=bn;
  46.       *bln=bn;
  47.       return(8);
  48.     } else
  49.       return(3);
  50.   } else
  51.     if (ch==1) {
  52.       bn=modemkey(&tout);
  53.       bn1=modemkey(&tout);
  54.       if ((bn ^ bn1)!=0xff)
  55.         err=3;
  56.       *bln=bn;
  57.       crc=0;
  58.       checksum=0;
  59.       for (i=0; (i<128) && (!hangup); i++)
  60.         b[i]=modemkey(&tout);
  61.       if ((!ucrc) && (!hangup)) {
  62.         cs1=checksum;
  63.         bn1=modemkey(&tout);
  64.         if (bn1!=cs1) {
  65.           err=2;
  66.         }
  67.       } else if (!hangup) {
  68.         cc1=crc;
  69.         bn=modemkey(&tout);
  70.         bn1=modemkey(&tout);
  71.         if ((bn!=(unsigned char)(cc1 >> 8)) || (bn1!=(unsigned char)(cc1 & 0x00ff)))
  72.           err=2;
  73.       }
  74.       if (tout)
  75.         return(7);
  76.       return(err);
  77.     } else
  78.       if (ch==2) {
  79.         bn=modemkey(&tout);
  80.         bn1=modemkey(&tout);
  81.         crc=0;
  82.         checksum=0;
  83.         if ((bn ^ bn1)!=0xff)
  84.           err=3;
  85.         *bln=bn;
  86.         for (i=0; (i<1024) && (!hangup); i++)
  87.           b[i]=modemkey(&tout);
  88.         if ((!ucrc) && (!hangup)){
  89.           cs1=checksum;
  90.           bn1=modemkey(&tout);
  91.           if (bn1!=cs1)
  92.             err=2;
  93.         } else if (!hangup) {
  94.           cc1=crc;
  95.           bn=modemkey(&tout);
  96.           bn1=modemkey(&tout);
  97.           if ((bn!=(unsigned char)(cc1 >> 8)) || (bn1!=(unsigned char)(cc1 & 0x00ff)))
  98.             err=2;
  99.         }
  100.         if (tout)
  101.           return(7);
  102.         if (err==0)
  103.           return(1);
  104.         else
  105.           return(err);
  106.       } else
  107.         if (ch==24) {
  108.           return(4);
  109.         } else
  110.           if (ch==4) {
  111.             return(5);
  112.           } else
  113.             if (ch==0)
  114.               return(7);
  115.              else
  116.               return(9);
  117. }
  118.  
  119. void xymodem_receive(char *fn, char *ft, int *received, int ucrc)
  120. {
  121.   char b[1025],x[81],x1[20],ch;
  122.   unsigned char bln;
  123.   unsigned int bn;
  124.   int done,ok,lastcan,lasteot,terr,cerr;
  125.   long pos,reallen,filedatetime,lx;
  126.   int f,i,i1,i2,i3,ox,oy;
  127.   double tpb;
  128.   struct ftime ff;
  129.   struct date d;
  130.   struct time t;
  131.   double d1;
  132.  
  133.   unlink(fn);
  134.   f=open(fn,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  135.   ok=1;
  136.   lastcan=0;
  137.   lasteot=0;
  138.   terr=0;
  139.   cerr=0;
  140.   if (f<0) {
  141.     nl();
  142.     nl();
  143.     pl("DOS error - Can't create file.");
  144.     nl();
  145.     *received=0;
  146.     return;
  147.   }
  148.   pos=0L;
  149.   reallen=0L;
  150.   filedatetime=0L;
  151.   bn=1;
  152.   done=0;
  153.   tpb=(12.656) / ((double) (modem_speed));
  154.   nl();
  155.   pl("> Ready to receive, ^X to abort.");
  156.   ox=wherex();
  157.   oy=wherey();
  158.   movecsr(52,0);
  159.   outs("│ Filename :               ");
  160.   movecsr(52,1);
  161.   outs("│ Xfer Time:               ");
  162.   movecsr(52,2);
  163.   outs("│ File Size:               ");
  164.   movecsr(52,3);
  165.   outs("│ Cur Block: 1 - 1k        ");
  166.   movecsr(52,4);
  167.   outs("│ Consec Errors: 0         ");
  168.   movecsr(52,5);
  169.   outs("│ Total Errors : 0         ");
  170.   movecsr(52,6);
  171.   outs("└──────────────────────────");
  172.   movecsr(65,0);
  173.   outs(stripfn(fn));
  174.   i=0;
  175.   do {
  176.     if (i++>9) {
  177.       *received=0;
  178.       return;
  179.     }
  180.     if (ucrc)
  181.       outcomch('C');
  182.     else
  183.       outcomch(21);
  184.     d1=timer();
  185.     while ((fabs(timer()-d1)<10.0) && (!comhit()) && (!hangup)) {
  186.       checkhangup();
  187.       if (kbhitb()) {
  188.         ch=getchd();
  189.         if (ch==0)
  190.           getchd();
  191.         else
  192.           if (ch==27) {
  193.             done=1;
  194.             ok=0;
  195.           }
  196.       }
  197.     }
  198.   } while(!comhit() && !hangup);
  199.   do {
  200.     bln=255;
  201.     itoa(cerr,x,10);
  202.     strcat(x,"  ");
  203.     movecsr(69,4);
  204.     outs(x);
  205.     itoa(terr,x,10);
  206.     movecsr(69,5);
  207.     outs(x);
  208.     sprintf(x,"%ld - %ldk",
  209.       pos/128+1,
  210.       pos/1024+1);
  211.     movecsr(65,3);
  212.     outs(x);
  213.     if (reallen) {
  214.       movecsr(65,1);
  215.       outs(ctim(((double)(reallen-pos))*tpb));
  216.     }
  217.     i=receive_block(b,&bln,ucrc);
  218.     if ((i==0) || (i==1)) {
  219.       if ((bln==0) && (pos==0L)) {
  220.         i1=strlen(b)+1;
  221.     i3=i1;
  222.     while ((b[i3]>='0') && (b[i3]<='9') && ((i3-i1)<15))
  223.       x[i3-i1]=b[i3++];
  224.     x[i3-i1]=0;
  225.         reallen=atol(x);
  226.         sprintf(x,"%ld - %ldk",
  227.           (reallen+127)/128,
  228.           (reallen+1023)/1024);
  229.         movecsr(65,2);
  230.         outs(x);
  231.         while ((b[i1]!=32) && (i1<64))
  232.           ++i1;
  233.         if (b[i1]==32) {
  234.           ++i1;
  235.           while ((b[i1]>='0') && (b[i1]<='8')) {
  236.             filedatetime=(filedatetime*8) + ((long) (b[i1]-'0'));
  237.             ++i1;
  238.           }
  239.           i1+=timezone+5*60*60;
  240.         }
  241.         outcomch(6);
  242.       } else
  243.         if ((bn & 0x00ff)==(unsigned int)bln) {
  244.           lseek(f,pos, SEEK_SET);
  245.           lx=reallen-pos;
  246.           if (i==0)
  247.             i2=128;
  248.           else
  249.             i2=1024;
  250.           if ((((long) i2)>lx) && (reallen))
  251.             i2=(int) lx;
  252.           write(f,(void *)b,i2);
  253.           pos += (long)i2;
  254.           ++bn;
  255.           outcomch(6);
  256.         } else
  257.           if (((bn-1) & 0x00ff)==(unsigned int)bln) {
  258.             outcomch(6);
  259.           } else {
  260.             outcomch(24);
  261.             ok=0;
  262.             done=1;
  263.           }
  264.       cerr=0;
  265.     } else
  266.       if ((i==2) || (i==7) || (i==3)) {
  267.         if ((pos==0L) && (reallen==0L) && (ucrc))
  268.           outcomch('C');
  269.         else
  270.           outcomch(21);
  271.         ++cerr;
  272.         ++terr;
  273.         if (cerr>9) {
  274.           outcomch(24);
  275.           ok=0;
  276.           done=1;
  277.         }
  278.       } else
  279.         if (i==6) {
  280.           ok=0;
  281.           done=1;
  282.           outcomch(24);
  283.         } else
  284.           if (i==4) {
  285.             if (lastcan) {
  286.               ok=0;
  287.               done=1;
  288.               outcomch(6);
  289.             } else {
  290.               lastcan=1;
  291.               outcomch(21);
  292.             }
  293.           } else
  294.             if (i==5) {
  295.           lasteot=1;
  296.               if (lasteot) {
  297.                 done=1;
  298.                 outcomch(6);
  299.               } else {
  300.                 lasteot=1;
  301.                 outcomch(21);
  302.               }
  303.             } else
  304.               if (i==8) {
  305.                 *ft=bln;
  306.                 outcomch(6);
  307.                 cerr=0;
  308.               } else
  309.                 if (i==9)
  310.                   dump();
  311.     if (i!=4)
  312.       lastcan=0;
  313.     if (i!=5)
  314.       lasteot=0;
  315.   } while ((!hangup) && (!done));
  316.   movecsr(ox,oy);
  317.   if (ok) {
  318.     if (filedatetime) {
  319.       unixtodos(filedatetime,&d,&t);
  320.       if (d.da_year>=1980) {
  321.         ff.ft_min=t.ti_min;
  322.         ff.ft_hour=t.ti_hour;
  323.         ff.ft_tsec=t.ti_sec/2;
  324.         ff.ft_year=d.da_year-1980;
  325.         ff.ft_day=d.da_day;
  326.         ff.ft_month=d.da_mon;
  327.         setftime(f,&ff);
  328.       }
  329.     }
  330.     close(f);
  331.     *received=1;
  332.   } else {
  333.     close(f);
  334.     unlink(fn);
  335.     *received=0;
  336.   }
  337. }
  338.