chiark / gitweb /
eglibc (2.11.3-4+deb6u3) squeeze-lts; urgency=medium
[eglibc.git] / sysdeps / unix / bsd / tcflow.c
1 /* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <errno.h>
20 #include <stddef.h>
21 #include <termios.h>
22 #include <unistd.h>
23
24 #include "bsdtty.h"
25
26 /* Suspend or restart transmission on FD.  */
27 int
28 tcflow (fd, action)
29      int fd;
30      int action;
31 {
32   switch (action)
33     {
34     case TCOOFF:
35       return __ioctl (fd, TIOCSTOP, (void *) NULL);
36     case TCOON:
37       return __ioctl (fd, TIOCSTART, (void *) NULL);
38
39     case TCIOFF:
40     case TCION:
41       {
42         /* This just writes the START or STOP character with
43            `write'.  Is there another way to do this?  */
44         struct termios attr;
45         unsigned char c;
46         if (tcgetattr (fd, &attr) < 0)
47           return -1;
48         c = attr.c_cc[action == TCIOFF ? VSTOP : VSTART];
49         if (c != _POSIX_VDISABLE && write (fd, &c, 1) < 1)
50           return -1;
51         return 0;
52       }
53
54     default:
55       __set_errno (EINVAL);
56       return -1;
57     }
58 }