home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: DFÜ und Kommunikation / SOS-DFUE.ISO / programm / dos / utility / pccp076 / rcvfax.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-27  |  5.2 KB  |  318 lines

  1. /* Copyright (C) 1992,1993 Peter Edward Cann */
  2.  
  3. #include<stdio.h>
  4. #include<fcntl.h>
  5. #include<sys\types.h>
  6. #include<sys\stat.h>
  7. #include<time.h>
  8. #include<signal.h>
  9. #include"port.h"
  10.  
  11. #define FBUFSIZ 4096
  12. unsigned char fbuf[FBUFSIZ];
  13. int fbufn;
  14.  
  15. int rfxfd;
  16.  
  17. putbyte(byte)
  18.     unsigned char byte;
  19.     {
  20.     fbuf[fbufn++]=byte;
  21.     if(fbufn>=FBUFSIZ)
  22.         if(write(rfxfd, fbuf, fbufn)!=fbufn)
  23.             {
  24.             printf("File write error.\n");
  25.             exit(72);
  26.             }
  27.         else
  28.             fbufn=0;
  29.     }
  30.  
  31. flush()
  32.     {
  33.     if(write(rfxfd, fbuf, fbufn)!=fbufn)
  34.         {
  35.         printf("File write error on explicit flush.\n");
  36.         exit(73);
  37.         }
  38.     fbufn=0;
  39.     }
  40.     
  41.  
  42. #define NSCANS 4
  43.  
  44. unsigned char scans[NSCANS][16]=
  45.     {
  46.     "+FCON\r\n",
  47.     "OK\r\n",
  48.     "CONNECT\r\n",
  49.     "+FHNG"
  50.     };
  51.  
  52. int scani[NSCANS];
  53.  
  54. sendchar(c)
  55.     unsigned char c;
  56.     {
  57.     while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)))
  58.         if(kbhit())
  59.             getch();
  60.     outp(basereg, c);
  61.     }
  62.  
  63. int follow;
  64.  
  65. quit()
  66.     {
  67.     cleanup(0);
  68.     exit(99);
  69.     }
  70.  
  71. sendstr(str)
  72.     char *str;
  73.     {
  74.     int i;
  75.     for(i=0;str[i]!='\0';++i)
  76.         sendchar(str[i]);
  77.     }
  78.  
  79. int scan(seconds)
  80.     int seconds;
  81.     {
  82.     long timestamp;
  83.     int i, j;
  84.     timestamp=time(NULL);
  85.     for(i=0;i<NSCANS;++i)
  86.         scani[i]=0;
  87.     while(1)
  88.         {
  89.         while(follow==index)
  90.             {
  91.             if(kbhit())
  92.                 getch();
  93.             if((time(NULL)-timestamp)>seconds)
  94.                 {
  95.                 for(j=0;j<NSCANS;j++)
  96.                     scani[j]=0;
  97.                 return(-1);
  98.                 }
  99.             }
  100.         putbyte(buf[follow]);
  101.         putch(buf[follow]);
  102.         for(i=0;i<NSCANS;i++)
  103.             if(scans[i][scani[i]]==buf[follow])
  104.                 {
  105.                 scani[i]++;
  106.                 if(scans[i][scani[i]]=='\0')
  107.                     {
  108.                     for(j=0;j<NSCANS;j++)
  109.                         scani[j]=0;
  110.                     follow++;
  111.                     follow%=TBUFSIZ;
  112.                     return(i);
  113.                     }
  114.                 }
  115.             else
  116.                 scani[i]=0;
  117.         follow++;
  118.         follow%=TBUFSIZ;
  119.         }
  120.     }
  121.  
  122. putstr(str)
  123.     char *str;
  124.     {
  125.     char *strp;
  126.     strp=str;
  127.     if(*strp)
  128.         do
  129.             putbyte(*(strp++));
  130.         while(*strp);
  131.     }
  132.  
  133. main(argc, argv)
  134.     int argc;
  135.     char **argv;
  136.     {
  137.     long timestamp;
  138.     int flag;
  139.     unsigned char c;
  140.     char fname[256];
  141.     if(argc!=5)
  142.         {
  143.         printf("USAGE: rcvfax <comnum> <initspeed> <afterspeed> <dir>\n");
  144.         exit(98);
  145.         }
  146.     fbufn=0;
  147.     timestamp=time(NULL);
  148.     sprintf(fname, "%s\\%08lx.rfx", argv[4], timestamp);
  149.     printf("Opening received fax file %s.\n", fname);
  150.     if((rfxfd=open(fname, O_WRONLY|O_BINARY|O_CREAT|O_TRUNC, S_IWRITE))==-1)
  151.         {
  152.         printf("Error opening file %s.\n", fname);
  153.         exit(97);
  154.         }
  155.     comnum=atoi(argv[1])-1;
  156.     speed=atoi(argv[2]);
  157.     databits='8';
  158.     parity='n';
  159.     stopbits='1';
  160.     setport();
  161.     readset();
  162.     follow=index=0;
  163.     setup();
  164.     speed=atoi(argv[3]);
  165.     switch(scan(60))
  166.         {
  167.         case -1:
  168.             cleanup(0);
  169.             printf("Timeout waiting for +FCON.\n");
  170.             close(rfxfd);
  171.             unlink(fname);
  172.             exit(1);
  173.             break;
  174.         case 0:
  175.             break;
  176.         case 3:
  177.             cleanup(0);
  178.             printf("Hangup waiting for +FCON.\n");
  179.             close(rfxfd);
  180.             unlink(fname);
  181.             exit(1);
  182.             break;
  183.         default:
  184.             cleanup(0);
  185.             printf("Received recognized token other than +FCON.\n");
  186.             close(rfxfd);
  187.             unlink(fname);
  188.             exit(2);
  189.             break;
  190.         }
  191.     setport();
  192.     setup();
  193.     switch(scan(60))
  194.         {
  195.         case -1:
  196.             putstr("\nTIMEOUT\n");
  197.             cleanup(0);
  198.             printf("Timeout waiting for initial OK.\n");
  199.             flush();
  200.             exit(3);
  201.             break;
  202.         case 1:
  203.             break;
  204.         case 3:
  205.             scan(15);
  206.             cleanup(0);
  207.             printf("Waiting for initial OK received +FHNG.\n");
  208.             flush();
  209.             exit(30);
  210.             break;
  211.         default:
  212.             cleanup(0);
  213.             printf("Waiting for initial OK received other recognized token.\n");
  214.             flush();
  215.             exit(4);
  216.             break;
  217.         }
  218.     while(1)
  219.         {
  220.         /* Loop over pages */
  221.         sendstr("AT+FDR\r");
  222.         switch(scan(60))
  223.             {
  224.             case -1:
  225.                 putstr("\nTIMEOUT\n");
  226.                 cleanup(0);
  227.                 printf("Timeout waiting for CONNECT.\n");
  228.                 flush();
  229.                 exit(5);
  230.                 break;
  231.             case 2:
  232.                 break;
  233.             case 3:
  234.                 if(scan(15)==1)
  235.                     {
  236.                     cleanup(0);
  237.                     flush();
  238.                     exit(0);
  239.                     }
  240.                 else
  241.                     {
  242.                     cleanup(0);
  243.                     printf("No OK after FHNG.\n");
  244.                     flush();
  245.                     exit(11);
  246.                     }
  247.             default:
  248.                 cleanup(0);
  249.                 printf("Bad stuff after +FDR command.\n");
  250.                 flush();
  251.                 exit(6);
  252.                 break;
  253.             }
  254.         sendchar(0x11);
  255.         flag=0;
  256.         while(1)
  257.             {
  258.             /* Loop over characters */
  259.             timestamp=time(NULL);
  260.             while(follow==index)
  261.                 {
  262.                 if(kbhit())
  263.                     getch();
  264.                 if((time(NULL)-timestamp)>120)
  265.                 /*120 seems ridiculous, but 60 didn't do it*/
  266.                     {
  267.                     cleanup(0);
  268.                     putstr("\nTIMEOUT\n");
  269.                     printf("Data timeout.\n");
  270.                     flush();
  271.                     exit(7);
  272.                     }
  273.                 }
  274.             putbyte(buf[follow]);
  275.             if(buf[follow]==0x10)
  276.                 flag=!flag;
  277.             else
  278.                 if(buf[follow]==0x03)
  279.                     if(flag)
  280.                         {
  281.                         follow++;
  282.                         follow%=TBUFSIZ;
  283.                         break;
  284.                         }
  285.                     else;
  286.                 else
  287.                     flag=0;
  288.             follow++;
  289.             follow%=TBUFSIZ;
  290.             }
  291.         switch(scan(60))
  292.             {
  293.             case -1:
  294.                 putstr("\nTIMEOUT\n");
  295.                 cleanup(0);
  296.                 printf("Timeout waiting for post-data OK.\n");
  297.                 flush();
  298.                 exit(8);
  299.                 break;
  300.             case 1:
  301.                 break;
  302.             case 3:
  303.                 scan(15);
  304.                 printf("Hangup waiting for post-data OK.\n");
  305.                 cleanup(0);
  306.                 flush();
  307.                 exit(31);
  308.                 break;
  309.             default:
  310.                 cleanup(0);
  311.                 printf("Got wrong token while waiting for post-data OK.\n");
  312.                 flush();
  313.                 exit(9);
  314.                 break;
  315.             }
  316.         }
  317.     }
  318.