OSDN Git Service

2002-03-01 David O'Brien <obrien@FreeBSD.org>
[pf3gnuchains/pf3gnuchains3x.git] / winsup / cygwin / termios.cc
1 /* termios.cc: termios for WIN32.
2
3    Copyright 1996, 1997, 1998, 2000, 2001 Red Hat, Inc.
4
5    Written by Doug Evans and Steve Chamberlain of Cygnus Support
6    dje@cygnus.com, sac@cygnus.com
7
8 This file is part of Cygwin.
9
10 This software is a copyrighted work licensed under the terms of the
11 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
12 details. */
13
14 #include "winsup.h"
15 #include <errno.h>
16 #include <signal.h>
17 #include <stdlib.h>
18 #include "cygerrno.h"
19 #include "security.h"
20 #include "fhandler.h"
21 #include "path.h"
22 #include "dtable.h"
23 #include "cygheap.h"
24 #include "cygwin/version.h"
25 #include "perprocess.h"
26 #include <sys/termios.h>
27
28 /* tcsendbreak: POSIX 7.2.2.1 */
29 extern "C" int
30 tcsendbreak (int fd, int duration)
31 {
32   int res = -1;
33
34   cygheap_fdget cfd (fd);
35   if (cfd < 0)
36     goto out;
37
38   if (!cfd->is_tty ())
39     set_errno (ENOTTY);
40   else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof)
41     res = cfd->tcsendbreak (duration);
42
43 out:
44   syscall_printf ("%d = tcsendbreak (%d, %d)", res, fd, duration);
45   return res;
46 }
47
48 /* tcdrain: POSIX 7.2.2.1 */
49 extern "C" int
50 tcdrain (int fd)
51 {
52   int res = -1;
53
54   termios_printf ("tcdrain");
55
56   cygheap_fdget cfd (fd);
57   if (cfd < 0)
58     goto out;
59
60   if (!cfd->is_tty ())
61     set_errno (ENOTTY);
62   else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof)
63     res = cfd->tcdrain ();
64
65 out:
66   syscall_printf ("%d = tcdrain (%d)", res, fd);
67   return res;
68 }
69
70 /* tcflush: POSIX 7.2.2.1 */
71 extern "C" int
72 tcflush (int fd, int queue)
73 {
74   int res = -1;
75
76   cygheap_fdget cfd (fd);
77   if (cfd < 0)
78     goto out;
79
80   if (!cfd->is_tty ())
81     set_errno (ENOTTY);
82   else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof)
83     res = cfd->tcflush (queue);
84
85 out:
86   termios_printf ("%d = tcflush (%d, %d)", res, fd, queue);
87   return res;
88 }
89
90 /* tcflow: POSIX 7.2.2.1 */
91 extern "C" int
92 tcflow (int fd, int action)
93 {
94   int res = -1;
95
96   cygheap_fdget cfd (fd);
97   if (cfd < 0)
98     goto out;
99
100   if (!cfd->is_tty ())
101     set_errno (ENOTTY);
102   else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof)
103     res = cfd->tcflow (action);
104
105 out:
106   syscall_printf ("%d = tcflow (%d, %d)", res, fd, action);
107   return res;
108 }
109
110 /* tcsetattr: POSIX96 7.2.1.1 */
111 extern "C" int
112 tcsetattr (int fd, int a, const struct termios *t)
113 {
114   int res = -1;
115
116   cygheap_fdget cfd (fd);
117   if (cfd < 0)
118     goto out;
119
120   t = __tonew_termios (t);
121
122   if (!cfd->is_tty ())
123     set_errno (ENOTTY);
124   else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof)
125     res = cfd->tcsetattr (a, t);
126
127 out:
128   termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d",
129         t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN],
130         t->c_cc[VTIME]);
131   termios_printf ("%d = tcsetattr (%d, %d, %x)", res, fd, a, t);
132   return res;
133 }
134
135 /* tcgetattr: POSIX 7.2.1.1 */
136 extern "C" int
137 tcgetattr (int fd, struct termios *in_t)
138 {
139   int res = -1;
140   struct termios *t = __makenew_termios (in_t);
141
142   cygheap_fdget cfd (fd);
143   if (cfd < 0)
144     /* saw an error */;
145   else if (!cfd->is_tty ())
146     set_errno (ENOTTY);
147   else if ((res = cfd->tcgetattr (t)) == 0)
148     (void) __toapp_termios (in_t, t);
149
150   if (res)
151     termios_printf ("%d = tcgetattr (%d, %p)", res, fd, in_t);
152   else
153     termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d",
154           t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN],
155           t->c_cc[VTIME]);
156
157   return res;
158 }
159
160 /* tcgetpgrp: POSIX 7.2.3.1 */
161 extern "C" int
162 tcgetpgrp (int fd)
163 {
164   int res = -1;
165
166   cygheap_fdget cfd (fd);
167   if (cfd < 0)
168     /* saw an error */;
169   else if (!cfd->is_tty ())
170     set_errno (ENOTTY);
171   else
172     res = cfd->tcgetpgrp ();
173
174   termios_printf ("%d = tcgetpgrp (%d)", res, fd);
175   return res;
176 }
177
178 /* tcsetpgrp: POSIX 7.2.4.1 */
179 extern "C" int
180 tcsetpgrp (int fd, pid_t pgid)
181 {
182   int res = -1;
183
184   cygheap_fdget cfd (fd);
185   if (cfd < 0)
186     /* saw an error */;
187   else if (!cfd->is_tty ())
188     set_errno (ENOTTY);
189   else
190     res = cfd->tcsetpgrp (pgid);
191
192   termios_printf ("%d = tcsetpgrp (%d, %x)", res, fd, pgid);
193   return res;
194 }
195
196 /* NIST PCTS requires not macro-only implementation */
197 #undef cfgetospeed
198 #undef cfgetispeed
199 #undef cfsetospeed
200 #undef cfsetispeed
201
202 /* cfgetospeed: POSIX96 7.1.3.1 */
203 extern "C" speed_t
204 cfgetospeed (struct termios *tp)
205 {
206   return __tonew_termios(tp)->c_ospeed;
207 }
208
209 /* cfgetispeed: POSIX96 7.1.3.1 */
210 extern "C" speed_t
211 cfgetispeed (struct termios *tp)
212 {
213   return __tonew_termios(tp)->c_ispeed;
214 }
215
216 /* cfsetospeed: POSIX96 7.1.3.1 */
217 extern "C" int
218 cfsetospeed (struct termios *in_tp, speed_t speed)
219 {
220   struct termios *tp = __tonew_termios (in_tp);
221   tp->c_ospeed = speed;
222   (void) __toapp_termios (in_tp, tp);
223   return 0;
224 }
225
226 /* cfsetispeed: POSIX96 7.1.3.1 */
227 extern "C" int
228 cfsetispeed (struct termios *in_tp, speed_t speed)
229 {
230   struct termios *tp = __tonew_termios (in_tp);
231   tp->c_ispeed = speed;
232   (void) __toapp_termios (in_tp, tp);
233   return 0;
234 }