home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 277_01 / xr.c < prev   
Text File  |  1988-11-15  |  2KB  |  117 lines

  1. /*
  2.  * xr.c - remote xmodem functions for xenix/unix
  3.  * copyright 1986 Ronald Florence
  4.  *
  5.  * usage: xr|xt [-ct] [-d errfile] file
  6.  *    -c    crc (instead of checksum)
  7.  *    -t    text mode (CR-NL <-> NL)
  8.  *
  9.  * To avoid overwriting existing files, 
  10.  * a received file with the same name 
  11.  * as an existing file is stored as fname~.
  12.  */
  13.  
  14. #include <signal.h>
  15. #include <stdio.h>
  16. #include <fcntl.h>
  17. #include <sys/ioctl.h>
  18. #include <sys/types.h>
  19. #include <sys/stat.h>
  20. #include <termio.h>
  21.  
  22. #define    DEBUG        01
  23. #define    LF        02
  24. #define    CRC        04
  25. #define    BSIZE        128
  26. #define errx(m,f)    printf("%s: ", pname), \
  27.             printf(m, f), \
  28.             printf("\n"), \
  29.             exit(1)
  30.  
  31. FILE    *errf;
  32.  
  33. struct    termio    old,
  34.         new;
  35.  
  36. hangup()
  37. {
  38.     resetline();
  39.     exit(1);
  40. }
  41.  
  42.  
  43. main(ac, av)
  44. int    ac;
  45. char    **av;
  46. {
  47.     char    *pname, 
  48.         trans = (av[0][strlen(av[0]) -1] == 't'),
  49.         *fname;
  50.     int    c, opts = 0; 
  51.     struct    stat    stbuf;
  52.     extern    int    optind;
  53.     extern    char    *optarg;
  54.     FILE    *fp;
  55.  
  56.     pname = *av;
  57.     while ((c = getopt(ac, av, "ctd:?")) != EOF)
  58.         switch (c)  {
  59.         case 't' :
  60.             opts |= LF;
  61.             break;
  62.         case 'c' :
  63.             opts |= CRC;
  64.             break;
  65.         case 'd' :
  66.             opts |= DEBUG;
  67.             if (!(errf = fopen(optarg, "w")))
  68.                 errx("can't open %s", optarg);
  69.             setbuf(errf, NULL);
  70.             break;
  71.         case '?' :
  72.             printf("usage: %s [-ct] [-d errfile] file\n", pname);
  73.             exit(1);
  74.         }
  75.     if (ac == 1 || ac == optind) 
  76.         errx("need file name", NULL);
  77.     fname = av[optind];
  78.     if (trans && !(fp = fopen(fname, "r"))) 
  79.         errx("can't open %s", fname);
  80.     if (!trans) {
  81.         if (!access(fname, 0))
  82.             strcat(fname, "~");
  83.         if (!(fp = fopen(fname, "w")))
  84.             errx("can't write %s", fname);
  85.     }
  86.     printf("Ready to %s %s\n", (trans) ? "send" : "receive", fname);
  87.     if (trans) {
  88.         stat(fname, &stbuf);
  89.         printf("%d blocks (128 bytes/block)\n",stbuf.st_size/BSIZE+1);
  90.     }
  91.     printf("Ctrl-X to abort transfer\n");
  92.  
  93.     signal(SIGINT, SIG_IGN);
  94.     signal(SIGQUIT, SIG_IGN);
  95.     signal(SIGHUP, hangup);
  96.  
  97.         ioctl(1, TCGETA, &old);
  98.         ioctl(1, TCGETA, &new);
  99.     fflush(stdin);
  100.         new.c_iflag = IGNBRK|IGNPAR;
  101.         new.c_oflag = 0;
  102.         new.c_lflag = 0;
  103.         new.c_cc[4] = 1;
  104.         new.c_cflag &= ~PARENB;
  105.         new.c_cflag |= CS8;
  106.         ioctl(1, TCSETAW, &new);
  107.  
  108.     (trans) ? xput(fp, opts) : xget(fp, opts);
  109. }
  110.  
  111.  
  112. resetline()
  113. {
  114.     ioctl(1, TCSETA, &old);
  115. }
  116.  
  117.