Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | --- termios.c.orig 2009-11-08 16:27:01.000000000 -0800 +++ termios.c 2009-11-08 16:28:15.000000000 -0800 @@ -33,6 +33,14 @@ static char sccsid[] = "@(#)termios.c 8. #include <sys/cdefs.h> __FBSDID("$FreeBSD: src/lib/libc/gen/termios.c,v 1.16 2009/05/07 13:49:48 ed Exp $"); +#if __DARWIN_UNIX03 +#ifdef VARIANT_CANCELABLE +#include <pthread.h> + +extern void _pthread_testcancel(pthread_t thread, int isconforming); +#endif /* VARIANT_CANCELABLE */ +#endif /* __DARWIN_UNIX03 */ + #include "namespace.h" #include <sys/types.h> #include <sys/fcntl.h> @@ -44,6 +52,7 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/ter #include <unistd.h> #include "un-namespace.h" +#ifndef BUILDING_VARIANT int tcgetattr(fd, t) int fd; @@ -83,6 +92,9 @@ tcsetpgrp(int fd, pid_t pgrp) { int s; + if (isatty(fd) == 0) + return (-1); + s = pgrp; return (_ioctl(fd, TIOCSPGRP, &s)); } @@ -93,12 +105,16 @@ tcgetpgrp(fd) { int s; + if (isatty(fd) == 0) + return ((pid_t)-1); + if (_ioctl(fd, TIOCGPGRP, &s) < 0) return ((pid_t)-1); return ((pid_t)s); } +#if 0 // Needs API review first pid_t tcgetsid(int fd) { @@ -121,6 +137,7 @@ tcsetsid(int fd, pid_t pid) return (_ioctl(fd, TIOCSCTTY, NULL)); } +#endif speed_t cfgetospeed(t) @@ -202,17 +219,24 @@ tcsendbreak(fd, len) return (-1); return (0); } +#endif /* BUILDING_VARIANT */ int __tcdrain(fd) int fd; { +#if __DARWIN_UNIX03 +#ifdef VARIANT_CANCELABLE + _pthread_testcancel(pthread_self(), 1); +#endif /* VARIANT_CANCELABLE */ +#endif /* __DARWIN_UNIX03 */ return (_ioctl(fd, TIOCDRAIN, 0)); } __weak_reference(__tcdrain, tcdrain); __weak_reference(__tcdrain, _tcdrain); +#ifndef BUILDING_VARIANT int tcflush(fd, which) int fd, which; @@ -249,16 +273,13 @@ tcflow(fd, action) case TCOON: return (_ioctl(fd, TIOCSTART, 0)); case TCION: + return (_ioctl(fd, TIOCIXON, 0)); case TCIOFF: - if (tcgetattr(fd, &term) == -1) - return (-1); - c = term.c_cc[action == TCIOFF ? VSTOP : VSTART]; - if (c != _POSIX_VDISABLE && _write(fd, &c, sizeof(c)) == -1) - return (-1); - return (0); + return (_ioctl(fd, TIOCIXOFF, 0)); default: errno = EINVAL; return (-1); } /* NOTREACHED */ } +#endif /* BUILDING_VARIANT */ |