+
+tcsendbreak(fd, len)
+ int fd, len;
+{
+ struct timeval sleepytime;
+
+ sleepytime.tv_sec = 0;
+ sleepytime.tv_usec = 400000;
+ if (ioctl(fd, TIOCSBRK, 0) == -1)
+ return (-1);
+ select(0, 0, 0, 0, &sleepytime);
+ if (ioctl(fd, TIOCCBRK, 0) == -1)
+ return (-1);
+
+ return (0);
+}
+
+tcdrain(fd)
+ int fd;
+{
+ if (ioctl(fd, TIOCDRAIN, 0) == -1)
+ return (-1);
+
+ return (0);
+}
+
+tcflush(fd, which)
+ int fd, which;
+{
+ int com;
+
+ switch (which) {
+ case TCIFLUSH:
+ com = FREAD;
+ break;
+ case TCOFLUSH:
+ com = FWRITE;
+ break;
+ case TCIOFLUSH:
+ com = FREAD | FWRITE;
+ break;
+ default:
+ errno = EINVAL;
+ return (-1);
+ }
+ if (ioctl(fd, TIOCFLUSH, &com) == -1)
+ return (-1);
+
+ return (0);
+}
+
+tcflow(fd, action)
+ int fd, action;
+{
+ switch (action) {
+ case TCOOFF:
+ return (ioctl(fd, TIOCSTOP, 0));
+ break;
+ case TCOON:
+ return (ioctl(fd, TIOCSTART, 0));
+ break;
+ case TCIOFF:
+ case TCION: { /* these posix functions are STUPID */
+ struct termios term;
+ char c;
+
+ if (tcgetattr(fd, &term) == -1);
+ return (-1);
+ c = term.c_cc[action == TCIOFF ? VSTOP : VSTART];
+ if (c != _POSIX_VDISABLE && write(fd, &c, 1) == -1)
+ return (-1);
+ break;
+ }
+ default:
+ errno = EINVAL;
+ return (-1);
+ }
+
+ return (0);
+}