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

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