home *** CD-ROM | disk | FTP | other *** search
/ Serving the Web / ServingTheWeb1995.disc1of1.iso / linux / slacksrce / d / libc / libc-4.6 / libc-4 / libc-linux / libbsd / sgtty.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-14  |  5.7 KB  |  245 lines

  1. /* sgtty.c - emulate BSD sgtty stuff with termios - ross biro, rick sladkey */
  2.  
  3. #define _SGTTY_SOURCE
  4.  
  5. #include <bsd/sgtty.h>
  6. #include <sys/ioctl.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <termios.h>
  11.  
  12. struct mask
  13. {
  14.    unsigned short mask;
  15.    unsigned short res;
  16. };
  17.  
  18. struct sf 
  19. {
  20.    struct mask iflag;
  21.    struct mask oflag;
  22.    struct mask cflag;
  23.    struct mask lflag;
  24. };
  25.  
  26. static struct sf trans[] =
  27. {
  28.    /* order is important here. */
  29.    /* iflag oflag cflag lflag */
  30.    /* this needs to be fixed. */
  31.    {{0,0}, {OPOST,0}, {0,0}, {ISIG,0}},            /* O_RAW */
  32.    {{0,0}, {0,0}, {0,0}, {XCASE,XCASE}},        /* O_LCASE */
  33.    {{ICRNL,ICRNL}, {ONLCR, ONLCR}, {0,0}, {0,0}},    /* O_CRMOD */
  34.    {{0,0}, {0,0}, {0,0}, {ECHO,ECHO}},            /* O_ECHO */
  35.    {{0,0}, {0,0}, {PARENB|PARODD,PARENB|PARODD}, {0,0}},/* O_ODDP */
  36.    {{0,0}, {0,0}, {PARENB|PARODD,PARENB}, {0,0}},    /* O_EVENP */
  37.    {{0,0}, {0,0}, {0,0}, {ICANON,0}},            /* O_CBREAK */
  38. };
  39.  
  40. #define _BSD_VDISABLE    255
  41.  
  42. static int
  43. bchar (unsigned char c)
  44. {
  45.    return c == _POSIX_VDISABLE ? _BSD_VDISABLE : c;
  46. }
  47.  
  48. static inline int
  49. pchar (unsigned char c)
  50. {
  51.    return c == _BSD_VDISABLE ? _POSIX_VDISABLE : c;
  52. }
  53.  
  54. int 
  55. gtty (int fd, struct sgttyb *sg)
  56. {
  57.    struct termios t;
  58.    int err;
  59.    int i;
  60.    err = ioctl (fd, TCGETS, &t);
  61.    if (err < 0) return (err);
  62.    sg->sg_ispeed = cfgetispeed (&t);
  63.    sg->sg_ospeed = cfgetospeed (&t);
  64.    sg->sg_erase = bchar (t.c_cc[VERASE]);
  65.    sg->sg_kill = bchar (t.c_cc[VKILL]);
  66.    sg->sg_flags = 0;
  67.    for (i = 0; i < sizeof (trans) / sizeof (struct sf); i++)
  68.      {
  69.     if ((t.c_iflag & trans[i].iflag.mask) == trans[i].iflag.res &&
  70.         (t.c_oflag & trans[i].oflag.mask) == trans[i].oflag.res &&
  71.         (t.c_cflag & trans[i].cflag.mask) == trans[i].cflag.res &&
  72.         (t.c_lflag & trans[i].lflag.mask) == trans[i].lflag.res)
  73.       {
  74.          sg->sg_flags |= 1 << i;
  75.       }
  76.      }
  77.    return (0);
  78. }
  79.  
  80. static int 
  81. tiocset (int fd, struct sgttyb *sg, int method)
  82. {
  83.    struct termios t;
  84.    int err;
  85.    int i;
  86.    err = ioctl (fd, TCGETS, &t);
  87.    if (err < 0) return (err);
  88.  
  89.    cfsetispeed (&t, sg->sg_ispeed);
  90.    cfsetospeed (&t, sg->sg_ospeed);
  91.    t.c_cc[VERASE] = pchar (sg->sg_erase);
  92.    t.c_cc[VKILL] = pchar (sg->sg_kill); 
  93.    for (i = sizeof (trans) / sizeof (struct sf) - 1; i >= 0; i--)
  94.      {
  95.     t.c_iflag &= ~trans[i].iflag.mask;
  96.     t.c_oflag &= ~trans[i].oflag.mask;
  97.     t.c_cflag &= ~trans[i].cflag.mask;
  98.     t.c_lflag &= ~trans[i].lflag.mask;
  99.     if (sg->sg_flags & (1 << i))
  100.       {
  101.          t.c_iflag |= trans[i].iflag.res;
  102.          t.c_oflag |= trans[i].oflag.res;
  103.          t.c_cflag |= trans[i].cflag.res;
  104.          t.c_lflag |= trans[i].lflag.res;
  105.       }
  106.     else
  107.       {
  108.          t.c_iflag |= (~trans[i].iflag.res) & trans[i].iflag.mask;
  109.          t.c_oflag |= (~trans[i].oflag.res) & trans[i].oflag.mask;
  110.          t.c_cflag |= (~trans[i].cflag.res) & trans[i].cflag.mask;
  111.          t.c_lflag |= (~trans[i].lflag.res) & trans[i].lflag.mask;
  112.       }
  113.      }
  114.    return (ioctl (fd, method, &t));
  115. }
  116.  
  117. int 
  118. stty (int fd, struct sgttyb *sg)
  119. {
  120.    return tiocset (fd, sg, TCSETSF);
  121. }
  122.  
  123. static int 
  124. tiocsetn (int fd, struct sgttyb *sg)
  125. {
  126.    return tiocset (fd, sg, TCSETS);
  127. }
  128.  
  129. static int
  130. tiocgetc (int fd, struct tchars *tc)
  131. {
  132.    struct termios t;
  133.    int err;
  134.    err = ioctl (fd, TCGETS, &t);
  135.    if (err < 0) return (err);
  136.    tc->t_intrc = bchar (t.c_cc[VINTR]);
  137.    tc->t_quitc = bchar (t.c_cc[VQUIT]);
  138.    tc->t_eofc = bchar (t.c_cc[VEOF]);
  139.    tc->t_startc = bchar (t.c_cc[VSTART]);
  140.    tc->t_stopc = bchar (t.c_cc[VSTOP]);
  141.    tc->t_brkc = bchar (t.c_cc[VEOL]);
  142.    return (0);
  143. }
  144.  
  145. static int
  146. tiocsetc (int fd, struct tchars *tc)
  147. {
  148.    struct termios t;
  149.    int err;
  150.    err = ioctl (fd, TCGETS, &t);
  151.    if (err < 0) return (err);
  152.    t.c_cc[VINTR] = pchar (tc->t_intrc);
  153.    t.c_cc[VQUIT] = pchar (tc->t_quitc);
  154.    t.c_cc[VEOF] = pchar (tc->t_eofc);
  155.    t.c_cc[VEOL] = pchar (tc->t_brkc);
  156.    t.c_cc[VSTART] = pchar (tc->t_startc);
  157.    t.c_cc[VSTOP] = pchar (tc->t_stopc);
  158.    return (ioctl (fd, TCSETS, &t));
  159. }
  160.  
  161. static int
  162. tiocgltc (int fd, struct ltchars *tc)
  163. {
  164.    struct termios t;
  165.    int err;
  166.    err = ioctl (fd, TCGETS, &t);
  167.    if (err < 0) return (err);
  168.    tc->t_werasc = bchar (t.c_cc[VWERASE]);
  169.    tc->t_suspc = bchar (t.c_cc[VSUSP]);
  170.    tc->t_dsuspc = bchar (t.c_cc[VSUSP]);
  171.    tc->t_rprntc = bchar (t.c_cc[VREPRINT]);
  172.    tc->t_flushc = bchar (t.c_cc[VDISCARD]);
  173.    tc->t_lnextc = bchar (t.c_cc[VLNEXT]);
  174.    return (0);
  175. }
  176.  
  177. static int
  178. tiocsltc (int fd, struct ltchars *tc)
  179. {
  180.    struct termios t;
  181.    int err;
  182.    err = ioctl (fd, TCGETS, &t);
  183.    if (err < 0) return (err);
  184.    t.c_cc[VWERASE] = pchar (tc->t_werasc);
  185.    t.c_cc[VSUSP] = pchar (tc->t_suspc);
  186.    if(t.c_cc[VSUSP] == _POSIX_VDISABLE)
  187.        t.c_cc[VSUSP] = pchar (tc->t_dsuspc);
  188.    t.c_cc[VREPRINT] = pchar (tc->t_rprntc);
  189.    t.c_cc[VDISCARD] = pchar (tc->t_flushc);
  190.    t.c_cc[VLNEXT] = pchar (tc->t_lnextc);
  191.    return (ioctl (fd, TCSETS, &t));
  192. }
  193.  
  194. static int
  195. tioclget (int fd, int *lflagsp)
  196. {
  197.    struct termios t;
  198.    int lflags = 0;
  199.  
  200.    *lflagsp = lflags;
  201.    return 0;
  202. }
  203.  
  204. static int
  205. tioclset (int fd, int *lflagsp)
  206. {
  207.    return 0;
  208. }
  209.  
  210. static int
  211. tiocflush (int fd, int *arg)
  212. {
  213.    return 0;
  214. }
  215.  
  216. int
  217. bsd_ioctl (int fd, int option, void *arg)
  218. {
  219.    switch (option) {
  220.    case TIOCGETP:
  221.       return gtty(fd, (struct sgttyb *) arg);
  222.    case TIOCSETP:
  223.       return stty(fd, (struct sgttyb *) arg);
  224.    case TIOCGETC:
  225.       return tiocgetc(fd, (struct tchars *) arg);
  226.    case TIOCSETC:
  227.       return tiocsetc(fd, (struct tchars *) arg);
  228.    case TIOCGLTC:
  229.       return tiocgltc(fd, (struct ltchars *) arg);
  230.    case TIOCSLTC:
  231.       return tiocsltc(fd, (struct ltchars *) arg);
  232.    case TIOCLGET:
  233.       return tioclget(fd, (int *) arg);
  234.    case TIOCLSET:
  235.       return tioclset(fd, (int *) arg);
  236.    case TIOCFLUSH:
  237.       return tiocflush(fd, (int *) arg);
  238.    case TIOCSETN:
  239.       return tiocsetn(fd, (struct sgttyb *) arg);
  240.    default:
  241.       return ioctl(fd, option, arg);
  242.    }
  243. }
  244.  
  245.