diff options
Diffstat (limited to 'libc/termios/tcdrain.c')
| -rw-r--r-- | libc/termios/tcdrain.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/libc/termios/tcdrain.c b/libc/termios/tcdrain.c index a13374cb5..011a78636 100644 --- a/libc/termios/tcdrain.c +++ b/libc/termios/tcdrain.c @@ -12,13 +12,15 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ #include <errno.h> #include <termios.h> #include <sys/ioctl.h> +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include <sysdep-cancel.h> +#endif libc_hidden_proto(ioctl) @@ -26,6 +28,21 @@ extern __typeof(tcdrain) __libc_tcdrain; /* Wait for pending output to be written on FD. */ int __libc_tcdrain (int fd) { - return ioctl(fd, TCSBRK, 1); +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ + if (SINGLE_THREAD_P) + /* With an argument of 1, TCSBRK for output to be drain. */ + return INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1); + + int oldtype = LIBC_CANCEL_ASYNC (); + + /* With an argument of 1, TCSBRK for output to be drain. */ + int result = INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1); + + LIBC_CANCEL_RESET (oldtype); + + return result; +#else + return ioctl(fd, TCSBRK, 1); +#endif } weak_alias(__libc_tcdrain,tcdrain) |
