deveia-bsd.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * BSD serial port control features not found in POSIX
  3. * including modem line control and hardware flow control
  4. */
  5. static struct flagmap lines[] = {
  6. {"cts", TIOCM_CTS},
  7. {"dsr", TIOCM_DSR},
  8. {"ring", TIOCM_RI},
  9. {"dcd", TIOCM_CD},
  10. {"dtr", TIOCM_DTR},
  11. {"rts", TIOCM_RTS},
  12. {0, -1}
  13. };
  14. static void
  15. resxtra(int port, struct termios *ts)
  16. {
  17. int fd = eia[port].fd;
  18. USED(ts);
  19. if(eia[port].dtr)
  20. ioctl(fd, TIOCM_DTR, eia[port].dtr);
  21. if(eia[port].rts)
  22. ioctl(fd, TIOCM_RTS, eia[port].rts);
  23. if(eia[port].cts)
  24. ioctl(fd, TIOCM_CTS, eia[port].cts);
  25. }
  26. static char *
  27. rdxtra(int port, struct termios *ts, char *str)
  28. {
  29. int fd = eia[port].fd;
  30. int line;
  31. // struct flagmap *lp;
  32. char *s = str;
  33. USED(ts);
  34. if(ioctl(fd, TIOCMGET, &line) < 0)
  35. oserror();
  36. // for(lp = lines; lp->str; lp++)
  37. // if(line&lp->flag)
  38. // s += sprint(s, " %s", lp->str);
  39. return s;
  40. }
  41. static char *
  42. wrxtra(int port, struct termios *ts, char *cmd)
  43. {
  44. int fd = eia[port].fd;
  45. int n, r, flag, iocmd, *l;
  46. USED(ts);
  47. switch(*cmd) {
  48. case 'D':
  49. case 'd':
  50. flag = TIOCM_DTR;
  51. l = &eia[port].dtr;
  52. break;
  53. case 'R':
  54. case 'r':
  55. flag = TIOCM_RTS;
  56. l = &eia[port].rts;
  57. break;
  58. case 'M':
  59. case 'm':
  60. flag = TIOCM_CTS;
  61. l = &eia[port].cts;
  62. break;
  63. default:
  64. return nil;
  65. }
  66. n = atoi(cmd+1);
  67. if(n)
  68. iocmd = TIOCMBIS;
  69. else
  70. iocmd = TIOCMBIC;
  71. osenter();
  72. r = ioctl(fd, iocmd, &flag);
  73. osleave();
  74. if(r < 0)
  75. oserror();
  76. eia[port].restore = 1;
  77. *l = iocmd;
  78. return nil;
  79. }