home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 260_01 / cu.c < prev    next >
Text File  |  1988-02-25  |  7KB  |  345 lines

  1. /* @(#)cu.c 1.1  Delta Date: 19:02:52 12/7/87 */
  2. /*
  3.  * Written by Francois Bergeon 1987 to compile under Microsoft C 4.00+
  4.  * with stty.lib
  5.  *
  6.  */
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <process.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <signal.h>
  13. #include <setjmp.h>
  14. #include <stdio.h>
  15. #include <fcntl.h>
  16. #include <io.h>
  17.  
  18. #include <tty.h>
  19.  
  20. #define PARAM   CS8
  21. #define COM300  B300  | PARAM
  22. #define COM1200 B1200 | PARAM
  23. #define COM2400 B2400 | PARAM
  24. #define ETX     3
  25. #define EOT     4
  26. #define COM1    0
  27. #define INIT    "AT E0\r"
  28. #define DIAL    "AT D %s\r"
  29. #define WAIT    'W'
  30. /* IBM PC special keys return codes */
  31. #define HOME   'G'
  32. #define UP     'H'
  33. #define LEFT   'K'
  34. #define RIGHT  'M'
  35. #define DOWN   'P'
  36. #define ANSI_HOME  'H'
  37. #define ANSI_UP    'A'
  38. #define ANSI_LEFT  'D'
  39. #define ANSI_RIGHT 'C'
  40. #define ANSI_DOWN  'B'
  41.  
  42. int (*oldsig)(), ctrlc();
  43. int fd, out = -1, silent = 0, divert = 0;
  44. jmp_buf back;
  45.  
  46. main(argc, argv)
  47. char *argv[];
  48. int argc;
  49.    {
  50.    char *telno, *dev = "COM1";
  51.    int speed = COM1200;
  52.  
  53.    if (--argc < 1)
  54.       usage();
  55.    telno = *++argv;
  56.    while (--argc)
  57.       {
  58.       ++argv;
  59.       if (argv[0][0] == '-')
  60.          switch (tolower(argv[0][1]))
  61.             {
  62.             case 's':
  63.                if (!strcmp(&argv[0][2], "300"))
  64.                   speed = COM300;
  65.                else if (!strcmp(&argv[0][2], "1200"))
  66.                   speed = COM1200;
  67.                else if (!strcmp(&argv[0][2], "2400"))
  68.                   speed = COM2400;
  69.                else
  70.                   usage();
  71.                break;
  72.             case 'l':
  73.                dev = &argv[0][2];
  74.                break;
  75.             default:
  76.                usage();
  77.             }
  78.       }
  79.    if ((fd = tty_open(dev, speed)) < 0)
  80.       {
  81.       fprintf(stderr, "cu: can't open %s\n", dev);
  82.       exit(1);
  83.       }
  84.    oldsig = signal(SIGINT, ctrlc);
  85.    if (!setjmp(back))
  86.       cu(telno);
  87.    tty_close(tty_open(dev, B0));
  88.    if (divert)
  89.       close(out);
  90.    signal(SIGINT, oldsig);
  91.    }
  92.  
  93. usage()
  94.    {
  95.    fprintf(stderr, "Usage: cu <phone> [-s<speed> -l<device>]\n");
  96.    exit(1);
  97.    }
  98.  
  99. cu(number)
  100. char *number;
  101.    {
  102.    char rx[80], tx;
  103.    int l;
  104.  
  105.    dial(number);
  106.    while (1)
  107.       {
  108.       if ((l = tty_read(fd, rx, 80)) > 0)
  109.          {
  110.          if (!silent)
  111.             fwrite(rx, l, 1, stdout);
  112.          if (divert)
  113.             write(out, rx, l);
  114.          }
  115.       if (kbhit())
  116.          if ((tx = getch()) == '~')
  117.             command();
  118.          else
  119.             transmit(tx);
  120.       }
  121.    }
  122.  
  123. dial(phone)
  124. char *phone;
  125.    {
  126.    char dial_it[80];
  127.    int i;
  128.  
  129.    _comflush(fd);
  130.    if (!tty_write(fd, INIT, sizeof(INIT) - 1))
  131.       {
  132.       fprintf(stderr, "cu: modem not present\n");
  133.       longjmp(back, 2);
  134.       }
  135.    sleep(2); 
  136.    hyphen(phone);
  137.    sprintf(dial_it, DIAL, phone);
  138.    tty_write(fd, dial_it, strlen(dial_it));
  139.    _comflush(fd);
  140.    }
  141.  
  142. command()
  143.    {
  144.    char cmd[100];
  145.  
  146.    putchar('~');
  147.    if (gets(cmd) != (char *)NULL)
  148.       switch (cmd[0])
  149.          {
  150.          case '.':
  151.          case EOT:
  152.             longjmp(back, 1);
  153.             break;
  154.          case '!':
  155.             if (cmd[1])
  156.                system(&cmd[1]);
  157.             else
  158.                spawnl(P_WAIT, getenv("COMSPEC"), getenv("COMSPEC"), NULL);
  159.             break;
  160.          case '<':
  161.             send(&cmd[1]);
  162.             break;
  163.          case '$':
  164.             run(&cmd[1]);
  165.             break;
  166.          case '~':
  167.             tty_write(fd, cmd, strlen(cmd));
  168.             break;
  169.          case '>':
  170.             dvrt(&cmd[1]);
  171.             break;
  172.          case '%':
  173.             xfer(&cmd[1]);
  174.             break;
  175.          case '#':
  176.             _combrk(fd);
  177.             break;
  178.          }
  179.    }
  180.  
  181. xfer(str)
  182. char *str;
  183.    {
  184.    char *action, *from, *to;
  185.    char cmd[100];
  186.    char c = EOT;
  187.  
  188.    action = strtok(str, " ");
  189.    from = strtok(action, NULL);
  190.    to   = strtok(from  , NULL);
  191.    to = (to ? to : from);
  192.    if (!strcmp(action, "take"))
  193.       {
  194.       strcpy(cmd, "stty -echo\n");
  195.       tty_write(fd, cmd, strlen(cmd));
  196.       _comflush(fd);
  197.       sprintf(cmd, "cat %s; echo \\#%o\n", from, EOT);
  198.       tty_write(fd, cmd, strlen(cmd));
  199.       receive(to);
  200.       strcpy(cmd, "stty echo\n");
  201.       tty_write(fd, cmd, strlen(cmd));
  202.       _comflush(fd);
  203.       }
  204.    else if (!strcmp(action, "put"))
  205.       {
  206.       sprintf(cmd, "stty -echo; cat > %s; stty echo\n", to);
  207.       tty_write(fd, cmd, strlen(cmd));
  208.       _comflush(fd);
  209.       send(from);
  210.       tty_write(fd, &c, 1);
  211.       _comflush(fd);
  212.       }
  213.    }
  214.  
  215. dvrt(str)
  216. char *str;
  217.    {
  218.    int oflag = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY;
  219.  
  220.    if (divert)
  221.       {
  222.       close(out);
  223.       divert = 0;
  224.       silent = 0;
  225.       }
  226.    if (*str == '>')
  227.       {
  228.       oflag = O_WRONLY | O_CREAT | O_APPEND;
  229.       ++str;
  230.       }
  231.    if (*str == ':')
  232.       {
  233.       silent = 1;
  234.       ++str;
  235.       }
  236.    if ((out = open(str, oflag, S_IREAD | S_IWRITE)) < 0)
  237.       silent = 0;
  238.    else
  239.       divert = 1;
  240.    }
  241.  
  242. send(str)
  243. char *str;
  244.    {
  245.    static char line[100];
  246.    FILE *fp;
  247.    int len;
  248.  
  249.    if ((fp = fopen(str, "r")) != NULL)
  250.       {
  251.       while (fgets(line, 100, fp) != NULL)
  252.          {
  253.          fputs(line, stdout);
  254.          len = strlen(line);
  255.          tty_write(fd, line, len);
  256.          if (line[len-1] == '\n')
  257.             tty_write(fd, "\r", 1);
  258.          _comflush();
  259.          }
  260.       fclose(fp);
  261.       _comflush();
  262.       }
  263.    }
  264.  
  265. receive(str)
  266. char *str;
  267.    {
  268.    FILE *fp;
  269.    char c;
  270.  
  271.    if ((fp = fopen(str, "wb")) != NULL)
  272.       {
  273.       do
  274.          if (tty_read(fd, &c, 1))
  275.             putc(c, fp);
  276.       while (c != EOT);
  277.       fclose(fp);
  278.       }
  279.    }
  280.  
  281. run(str)
  282. char *str;
  283.    {
  284.    char *temp;
  285.    int sout;
  286.  
  287.    temp = mktemp("cuXXXXXX");
  288.    strcat(str, " > ");
  289.    strcat(str, temp);
  290.    system(str);
  291.    send(temp);
  292.    unlink(temp);
  293.    }
  294.  
  295. hyphen(str)
  296. char *str;
  297.    {
  298.    do
  299.       if (*str == '-')
  300.          *str = WAIT;
  301.    while (*(str++));
  302.    }
  303.  
  304. int ctrlc()
  305.    {
  306.    char c = ETX;
  307.  
  308.    signal(SIGINT, ctrlc);
  309.    tty_write(fd, &c, 1);
  310.    }
  311.  
  312. transmit(c)
  313. char c;
  314.    {
  315.    static char *ansistr = "\033[ ";
  316.  
  317.    if (c)
  318.       tty_write(fd, &c, 1);
  319.    else
  320.       {
  321.       switch ((c = getch()))
  322.          {
  323.          case HOME:
  324.             ansistr[2] = ANSI_HOME;
  325.             break;
  326.          case UP:
  327.             ansistr[2] = ANSI_UP;
  328.             break;
  329.          case LEFT:
  330.             ansistr[2] = ANSI_LEFT;
  331.             break;
  332.          case RIGHT:
  333.             ansistr[2] = ANSI_RIGHT;
  334.             break;
  335.          case DOWN:
  336.             ansistr[2] = ANSI_DOWN;
  337.             break;
  338.          default:
  339.             return;
  340.          }
  341.       tty_write(fd, ansistr, 3);
  342.       }
  343.    }
  344.  
  345.