Commit ff8cb0fd6f195389aefe55d5dac9927d09a9de54
Committed by
Linus Torvalds
1 parent
eff6937a46
Exists in
master
and in
4 other branches
tty: N_TTY SIGIO only works for read
The N_TTY ldisc layer does not send SIGIO POLL_OUTs correctly when output is possible due to flawed handling of the TTY_DO_WRITE_WAKEUP bit. It will either send no SIGIOs at all or on every tty wakeup. The fix is to set the bit when the tty driver write would block and test and clear it on write wakeup. [Merged with existing N_TTY patches and a small buglet fixed -- Alan] Signed-off-by: Thomas Pfaff <tpfaff@pcs.com> Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 3 additions and 3 deletions Inline Diff
drivers/char/n_tty.c
1 | /* | 1 | /* |
2 | * n_tty.c --- implements the N_TTY line discipline. | 2 | * n_tty.c --- implements the N_TTY line discipline. |
3 | * | 3 | * |
4 | * This code used to be in tty_io.c, but things are getting hairy | 4 | * This code used to be in tty_io.c, but things are getting hairy |
5 | * enough that it made sense to split things off. (The N_TTY | 5 | * enough that it made sense to split things off. (The N_TTY |
6 | * processing has changed so much that it's hardly recognizable, | 6 | * processing has changed so much that it's hardly recognizable, |
7 | * anyway...) | 7 | * anyway...) |
8 | * | 8 | * |
9 | * Note that the open routine for N_TTY is guaranteed never to return | 9 | * Note that the open routine for N_TTY is guaranteed never to return |
10 | * an error. This is because Linux will fall back to setting a line | 10 | * an error. This is because Linux will fall back to setting a line |
11 | * to N_TTY if it can not switch to any other line discipline. | 11 | * to N_TTY if it can not switch to any other line discipline. |
12 | * | 12 | * |
13 | * Written by Theodore Ts'o, Copyright 1994. | 13 | * Written by Theodore Ts'o, Copyright 1994. |
14 | * | 14 | * |
15 | * This file also contains code originally written by Linus Torvalds, | 15 | * This file also contains code originally written by Linus Torvalds, |
16 | * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994. | 16 | * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994. |
17 | * | 17 | * |
18 | * This file may be redistributed under the terms of the GNU General Public | 18 | * This file may be redistributed under the terms of the GNU General Public |
19 | * License. | 19 | * License. |
20 | * | 20 | * |
21 | * Reduced memory usage for older ARM systems - Russell King. | 21 | * Reduced memory usage for older ARM systems - Russell King. |
22 | * | 22 | * |
23 | * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of | 23 | * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of |
24 | * the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu> | 24 | * the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu> |
25 | * who actually finally proved there really was a race. | 25 | * who actually finally proved there really was a race. |
26 | * | 26 | * |
27 | * 2002/03/18 Implemented n_tty_wakeup to send SIGIO POLL_OUTs to | 27 | * 2002/03/18 Implemented n_tty_wakeup to send SIGIO POLL_OUTs to |
28 | * waiting writing processes-Sapan Bhatia <sapan@corewars.org>. | 28 | * waiting writing processes-Sapan Bhatia <sapan@corewars.org>. |
29 | * Also fixed a bug in BLOCKING mode where n_tty_write returns | 29 | * Also fixed a bug in BLOCKING mode where n_tty_write returns |
30 | * EAGAIN | 30 | * EAGAIN |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #include <linux/types.h> | 33 | #include <linux/types.h> |
34 | #include <linux/major.h> | 34 | #include <linux/major.h> |
35 | #include <linux/errno.h> | 35 | #include <linux/errno.h> |
36 | #include <linux/signal.h> | 36 | #include <linux/signal.h> |
37 | #include <linux/fcntl.h> | 37 | #include <linux/fcntl.h> |
38 | #include <linux/sched.h> | 38 | #include <linux/sched.h> |
39 | #include <linux/interrupt.h> | 39 | #include <linux/interrupt.h> |
40 | #include <linux/tty.h> | 40 | #include <linux/tty.h> |
41 | #include <linux/timer.h> | 41 | #include <linux/timer.h> |
42 | #include <linux/ctype.h> | 42 | #include <linux/ctype.h> |
43 | #include <linux/mm.h> | 43 | #include <linux/mm.h> |
44 | #include <linux/string.h> | 44 | #include <linux/string.h> |
45 | #include <linux/slab.h> | 45 | #include <linux/slab.h> |
46 | #include <linux/poll.h> | 46 | #include <linux/poll.h> |
47 | #include <linux/bitops.h> | 47 | #include <linux/bitops.h> |
48 | #include <linux/audit.h> | 48 | #include <linux/audit.h> |
49 | #include <linux/file.h> | 49 | #include <linux/file.h> |
50 | #include <linux/uaccess.h> | 50 | #include <linux/uaccess.h> |
51 | 51 | ||
52 | #include <asm/system.h> | 52 | #include <asm/system.h> |
53 | 53 | ||
54 | /* number of characters left in xmit buffer before select has we have room */ | 54 | /* number of characters left in xmit buffer before select has we have room */ |
55 | #define WAKEUP_CHARS 256 | 55 | #define WAKEUP_CHARS 256 |
56 | 56 | ||
57 | /* | 57 | /* |
58 | * This defines the low- and high-watermarks for throttling and | 58 | * This defines the low- and high-watermarks for throttling and |
59 | * unthrottling the TTY driver. These watermarks are used for | 59 | * unthrottling the TTY driver. These watermarks are used for |
60 | * controlling the space in the read buffer. | 60 | * controlling the space in the read buffer. |
61 | */ | 61 | */ |
62 | #define TTY_THRESHOLD_THROTTLE 128 /* now based on remaining room */ | 62 | #define TTY_THRESHOLD_THROTTLE 128 /* now based on remaining room */ |
63 | #define TTY_THRESHOLD_UNTHROTTLE 128 | 63 | #define TTY_THRESHOLD_UNTHROTTLE 128 |
64 | 64 | ||
65 | /* | 65 | /* |
66 | * Special byte codes used in the echo buffer to represent operations | 66 | * Special byte codes used in the echo buffer to represent operations |
67 | * or special handling of characters. Bytes in the echo buffer that | 67 | * or special handling of characters. Bytes in the echo buffer that |
68 | * are not part of such special blocks are treated as normal character | 68 | * are not part of such special blocks are treated as normal character |
69 | * codes. | 69 | * codes. |
70 | */ | 70 | */ |
71 | #define ECHO_OP_START 0xff | 71 | #define ECHO_OP_START 0xff |
72 | #define ECHO_OP_MOVE_BACK_COL 0x80 | 72 | #define ECHO_OP_MOVE_BACK_COL 0x80 |
73 | #define ECHO_OP_SET_CANON_COL 0x81 | 73 | #define ECHO_OP_SET_CANON_COL 0x81 |
74 | #define ECHO_OP_ERASE_TAB 0x82 | 74 | #define ECHO_OP_ERASE_TAB 0x82 |
75 | 75 | ||
76 | static inline unsigned char *alloc_buf(void) | 76 | static inline unsigned char *alloc_buf(void) |
77 | { | 77 | { |
78 | gfp_t prio = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL; | 78 | gfp_t prio = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL; |
79 | 79 | ||
80 | if (PAGE_SIZE != N_TTY_BUF_SIZE) | 80 | if (PAGE_SIZE != N_TTY_BUF_SIZE) |
81 | return kmalloc(N_TTY_BUF_SIZE, prio); | 81 | return kmalloc(N_TTY_BUF_SIZE, prio); |
82 | else | 82 | else |
83 | return (unsigned char *)__get_free_page(prio); | 83 | return (unsigned char *)__get_free_page(prio); |
84 | } | 84 | } |
85 | 85 | ||
86 | static inline void free_buf(unsigned char *buf) | 86 | static inline void free_buf(unsigned char *buf) |
87 | { | 87 | { |
88 | if (PAGE_SIZE != N_TTY_BUF_SIZE) | 88 | if (PAGE_SIZE != N_TTY_BUF_SIZE) |
89 | kfree(buf); | 89 | kfree(buf); |
90 | else | 90 | else |
91 | free_page((unsigned long) buf); | 91 | free_page((unsigned long) buf); |
92 | } | 92 | } |
93 | 93 | ||
94 | static inline int tty_put_user(struct tty_struct *tty, unsigned char x, | 94 | static inline int tty_put_user(struct tty_struct *tty, unsigned char x, |
95 | unsigned char __user *ptr) | 95 | unsigned char __user *ptr) |
96 | { | 96 | { |
97 | tty_audit_add_data(tty, &x, 1); | 97 | tty_audit_add_data(tty, &x, 1); |
98 | return put_user(x, ptr); | 98 | return put_user(x, ptr); |
99 | } | 99 | } |
100 | 100 | ||
101 | /** | 101 | /** |
102 | * n_tty_set__room - receive space | 102 | * n_tty_set__room - receive space |
103 | * @tty: terminal | 103 | * @tty: terminal |
104 | * | 104 | * |
105 | * Called by the driver to find out how much data it is | 105 | * Called by the driver to find out how much data it is |
106 | * permitted to feed to the line discipline without any being lost | 106 | * permitted to feed to the line discipline without any being lost |
107 | * and thus to manage flow control. Not serialized. Answers for the | 107 | * and thus to manage flow control. Not serialized. Answers for the |
108 | * "instant". | 108 | * "instant". |
109 | */ | 109 | */ |
110 | 110 | ||
111 | static void n_tty_set_room(struct tty_struct *tty) | 111 | static void n_tty_set_room(struct tty_struct *tty) |
112 | { | 112 | { |
113 | /* tty->read_cnt is not read locked ? */ | 113 | /* tty->read_cnt is not read locked ? */ |
114 | int left = N_TTY_BUF_SIZE - tty->read_cnt - 1; | 114 | int left = N_TTY_BUF_SIZE - tty->read_cnt - 1; |
115 | 115 | ||
116 | /* | 116 | /* |
117 | * If we are doing input canonicalization, and there are no | 117 | * If we are doing input canonicalization, and there are no |
118 | * pending newlines, let characters through without limit, so | 118 | * pending newlines, let characters through without limit, so |
119 | * that erase characters will be handled. Other excess | 119 | * that erase characters will be handled. Other excess |
120 | * characters will be beeped. | 120 | * characters will be beeped. |
121 | */ | 121 | */ |
122 | if (left <= 0) | 122 | if (left <= 0) |
123 | left = tty->icanon && !tty->canon_data; | 123 | left = tty->icanon && !tty->canon_data; |
124 | tty->receive_room = left; | 124 | tty->receive_room = left; |
125 | } | 125 | } |
126 | 126 | ||
127 | static void put_tty_queue_nolock(unsigned char c, struct tty_struct *tty) | 127 | static void put_tty_queue_nolock(unsigned char c, struct tty_struct *tty) |
128 | { | 128 | { |
129 | if (tty->read_cnt < N_TTY_BUF_SIZE) { | 129 | if (tty->read_cnt < N_TTY_BUF_SIZE) { |
130 | tty->read_buf[tty->read_head] = c; | 130 | tty->read_buf[tty->read_head] = c; |
131 | tty->read_head = (tty->read_head + 1) & (N_TTY_BUF_SIZE-1); | 131 | tty->read_head = (tty->read_head + 1) & (N_TTY_BUF_SIZE-1); |
132 | tty->read_cnt++; | 132 | tty->read_cnt++; |
133 | } | 133 | } |
134 | } | 134 | } |
135 | 135 | ||
136 | /** | 136 | /** |
137 | * put_tty_queue - add character to tty | 137 | * put_tty_queue - add character to tty |
138 | * @c: character | 138 | * @c: character |
139 | * @tty: tty device | 139 | * @tty: tty device |
140 | * | 140 | * |
141 | * Add a character to the tty read_buf queue. This is done under the | 141 | * Add a character to the tty read_buf queue. This is done under the |
142 | * read_lock to serialize character addition and also to protect us | 142 | * read_lock to serialize character addition and also to protect us |
143 | * against parallel reads or flushes | 143 | * against parallel reads or flushes |
144 | */ | 144 | */ |
145 | 145 | ||
146 | static void put_tty_queue(unsigned char c, struct tty_struct *tty) | 146 | static void put_tty_queue(unsigned char c, struct tty_struct *tty) |
147 | { | 147 | { |
148 | unsigned long flags; | 148 | unsigned long flags; |
149 | /* | 149 | /* |
150 | * The problem of stomping on the buffers ends here. | 150 | * The problem of stomping on the buffers ends here. |
151 | * Why didn't anyone see this one coming? --AJK | 151 | * Why didn't anyone see this one coming? --AJK |
152 | */ | 152 | */ |
153 | spin_lock_irqsave(&tty->read_lock, flags); | 153 | spin_lock_irqsave(&tty->read_lock, flags); |
154 | put_tty_queue_nolock(c, tty); | 154 | put_tty_queue_nolock(c, tty); |
155 | spin_unlock_irqrestore(&tty->read_lock, flags); | 155 | spin_unlock_irqrestore(&tty->read_lock, flags); |
156 | } | 156 | } |
157 | 157 | ||
158 | /** | 158 | /** |
159 | * check_unthrottle - allow new receive data | 159 | * check_unthrottle - allow new receive data |
160 | * @tty; tty device | 160 | * @tty; tty device |
161 | * | 161 | * |
162 | * Check whether to call the driver unthrottle functions | 162 | * Check whether to call the driver unthrottle functions |
163 | * | 163 | * |
164 | * Can sleep, may be called under the atomic_read_lock mutex but | 164 | * Can sleep, may be called under the atomic_read_lock mutex but |
165 | * this is not guaranteed. | 165 | * this is not guaranteed. |
166 | */ | 166 | */ |
167 | static void check_unthrottle(struct tty_struct *tty) | 167 | static void check_unthrottle(struct tty_struct *tty) |
168 | { | 168 | { |
169 | if (tty->count) | 169 | if (tty->count) |
170 | tty_unthrottle(tty); | 170 | tty_unthrottle(tty); |
171 | } | 171 | } |
172 | 172 | ||
173 | /** | 173 | /** |
174 | * reset_buffer_flags - reset buffer state | 174 | * reset_buffer_flags - reset buffer state |
175 | * @tty: terminal to reset | 175 | * @tty: terminal to reset |
176 | * | 176 | * |
177 | * Reset the read buffer counters, clear the flags, | 177 | * Reset the read buffer counters, clear the flags, |
178 | * and make sure the driver is unthrottled. Called | 178 | * and make sure the driver is unthrottled. Called |
179 | * from n_tty_open() and n_tty_flush_buffer(). | 179 | * from n_tty_open() and n_tty_flush_buffer(). |
180 | * | 180 | * |
181 | * Locking: tty_read_lock for read fields. | 181 | * Locking: tty_read_lock for read fields. |
182 | */ | 182 | */ |
183 | 183 | ||
184 | static void reset_buffer_flags(struct tty_struct *tty) | 184 | static void reset_buffer_flags(struct tty_struct *tty) |
185 | { | 185 | { |
186 | unsigned long flags; | 186 | unsigned long flags; |
187 | 187 | ||
188 | spin_lock_irqsave(&tty->read_lock, flags); | 188 | spin_lock_irqsave(&tty->read_lock, flags); |
189 | tty->read_head = tty->read_tail = tty->read_cnt = 0; | 189 | tty->read_head = tty->read_tail = tty->read_cnt = 0; |
190 | spin_unlock_irqrestore(&tty->read_lock, flags); | 190 | spin_unlock_irqrestore(&tty->read_lock, flags); |
191 | 191 | ||
192 | mutex_lock(&tty->echo_lock); | 192 | mutex_lock(&tty->echo_lock); |
193 | tty->echo_pos = tty->echo_cnt = tty->echo_overrun = 0; | 193 | tty->echo_pos = tty->echo_cnt = tty->echo_overrun = 0; |
194 | mutex_unlock(&tty->echo_lock); | 194 | mutex_unlock(&tty->echo_lock); |
195 | 195 | ||
196 | tty->canon_head = tty->canon_data = tty->erasing = 0; | 196 | tty->canon_head = tty->canon_data = tty->erasing = 0; |
197 | memset(&tty->read_flags, 0, sizeof tty->read_flags); | 197 | memset(&tty->read_flags, 0, sizeof tty->read_flags); |
198 | n_tty_set_room(tty); | 198 | n_tty_set_room(tty); |
199 | check_unthrottle(tty); | 199 | check_unthrottle(tty); |
200 | } | 200 | } |
201 | 201 | ||
202 | /** | 202 | /** |
203 | * n_tty_flush_buffer - clean input queue | 203 | * n_tty_flush_buffer - clean input queue |
204 | * @tty: terminal device | 204 | * @tty: terminal device |
205 | * | 205 | * |
206 | * Flush the input buffer. Called when the line discipline is | 206 | * Flush the input buffer. Called when the line discipline is |
207 | * being closed, when the tty layer wants the buffer flushed (eg | 207 | * being closed, when the tty layer wants the buffer flushed (eg |
208 | * at hangup) or when the N_TTY line discipline internally has to | 208 | * at hangup) or when the N_TTY line discipline internally has to |
209 | * clean the pending queue (for example some signals). | 209 | * clean the pending queue (for example some signals). |
210 | * | 210 | * |
211 | * Locking: ctrl_lock, read_lock. | 211 | * Locking: ctrl_lock, read_lock. |
212 | */ | 212 | */ |
213 | 213 | ||
214 | static void n_tty_flush_buffer(struct tty_struct *tty) | 214 | static void n_tty_flush_buffer(struct tty_struct *tty) |
215 | { | 215 | { |
216 | unsigned long flags; | 216 | unsigned long flags; |
217 | /* clear everything and unthrottle the driver */ | 217 | /* clear everything and unthrottle the driver */ |
218 | reset_buffer_flags(tty); | 218 | reset_buffer_flags(tty); |
219 | 219 | ||
220 | if (!tty->link) | 220 | if (!tty->link) |
221 | return; | 221 | return; |
222 | 222 | ||
223 | spin_lock_irqsave(&tty->ctrl_lock, flags); | 223 | spin_lock_irqsave(&tty->ctrl_lock, flags); |
224 | if (tty->link->packet) { | 224 | if (tty->link->packet) { |
225 | tty->ctrl_status |= TIOCPKT_FLUSHREAD; | 225 | tty->ctrl_status |= TIOCPKT_FLUSHREAD; |
226 | wake_up_interruptible(&tty->link->read_wait); | 226 | wake_up_interruptible(&tty->link->read_wait); |
227 | } | 227 | } |
228 | spin_unlock_irqrestore(&tty->ctrl_lock, flags); | 228 | spin_unlock_irqrestore(&tty->ctrl_lock, flags); |
229 | } | 229 | } |
230 | 230 | ||
231 | /** | 231 | /** |
232 | * n_tty_chars_in_buffer - report available bytes | 232 | * n_tty_chars_in_buffer - report available bytes |
233 | * @tty: tty device | 233 | * @tty: tty device |
234 | * | 234 | * |
235 | * Report the number of characters buffered to be delivered to user | 235 | * Report the number of characters buffered to be delivered to user |
236 | * at this instant in time. | 236 | * at this instant in time. |
237 | * | 237 | * |
238 | * Locking: read_lock | 238 | * Locking: read_lock |
239 | */ | 239 | */ |
240 | 240 | ||
241 | static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty) | 241 | static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty) |
242 | { | 242 | { |
243 | unsigned long flags; | 243 | unsigned long flags; |
244 | ssize_t n = 0; | 244 | ssize_t n = 0; |
245 | 245 | ||
246 | spin_lock_irqsave(&tty->read_lock, flags); | 246 | spin_lock_irqsave(&tty->read_lock, flags); |
247 | if (!tty->icanon) { | 247 | if (!tty->icanon) { |
248 | n = tty->read_cnt; | 248 | n = tty->read_cnt; |
249 | } else if (tty->canon_data) { | 249 | } else if (tty->canon_data) { |
250 | n = (tty->canon_head > tty->read_tail) ? | 250 | n = (tty->canon_head > tty->read_tail) ? |
251 | tty->canon_head - tty->read_tail : | 251 | tty->canon_head - tty->read_tail : |
252 | tty->canon_head + (N_TTY_BUF_SIZE - tty->read_tail); | 252 | tty->canon_head + (N_TTY_BUF_SIZE - tty->read_tail); |
253 | } | 253 | } |
254 | spin_unlock_irqrestore(&tty->read_lock, flags); | 254 | spin_unlock_irqrestore(&tty->read_lock, flags); |
255 | return n; | 255 | return n; |
256 | } | 256 | } |
257 | 257 | ||
258 | /** | 258 | /** |
259 | * is_utf8_continuation - utf8 multibyte check | 259 | * is_utf8_continuation - utf8 multibyte check |
260 | * @c: byte to check | 260 | * @c: byte to check |
261 | * | 261 | * |
262 | * Returns true if the utf8 character 'c' is a multibyte continuation | 262 | * Returns true if the utf8 character 'c' is a multibyte continuation |
263 | * character. We use this to correctly compute the on screen size | 263 | * character. We use this to correctly compute the on screen size |
264 | * of the character when printing | 264 | * of the character when printing |
265 | */ | 265 | */ |
266 | 266 | ||
267 | static inline int is_utf8_continuation(unsigned char c) | 267 | static inline int is_utf8_continuation(unsigned char c) |
268 | { | 268 | { |
269 | return (c & 0xc0) == 0x80; | 269 | return (c & 0xc0) == 0x80; |
270 | } | 270 | } |
271 | 271 | ||
272 | /** | 272 | /** |
273 | * is_continuation - multibyte check | 273 | * is_continuation - multibyte check |
274 | * @c: byte to check | 274 | * @c: byte to check |
275 | * | 275 | * |
276 | * Returns true if the utf8 character 'c' is a multibyte continuation | 276 | * Returns true if the utf8 character 'c' is a multibyte continuation |
277 | * character and the terminal is in unicode mode. | 277 | * character and the terminal is in unicode mode. |
278 | */ | 278 | */ |
279 | 279 | ||
280 | static inline int is_continuation(unsigned char c, struct tty_struct *tty) | 280 | static inline int is_continuation(unsigned char c, struct tty_struct *tty) |
281 | { | 281 | { |
282 | return I_IUTF8(tty) && is_utf8_continuation(c); | 282 | return I_IUTF8(tty) && is_utf8_continuation(c); |
283 | } | 283 | } |
284 | 284 | ||
285 | /** | 285 | /** |
286 | * do_output_char - output one character | 286 | * do_output_char - output one character |
287 | * @c: character (or partial unicode symbol) | 287 | * @c: character (or partial unicode symbol) |
288 | * @tty: terminal device | 288 | * @tty: terminal device |
289 | * @space: space available in tty driver write buffer | 289 | * @space: space available in tty driver write buffer |
290 | * | 290 | * |
291 | * This is a helper function that handles one output character | 291 | * This is a helper function that handles one output character |
292 | * (including special characters like TAB, CR, LF, etc.), | 292 | * (including special characters like TAB, CR, LF, etc.), |
293 | * putting the results in the tty driver's write buffer. | 293 | * putting the results in the tty driver's write buffer. |
294 | * | 294 | * |
295 | * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY | 295 | * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY |
296 | * and NLDLY. They simply aren't relevant in the world today. | 296 | * and NLDLY. They simply aren't relevant in the world today. |
297 | * If you ever need them, add them here. | 297 | * If you ever need them, add them here. |
298 | * | 298 | * |
299 | * Returns the number of bytes of buffer space used or -1 if | 299 | * Returns the number of bytes of buffer space used or -1 if |
300 | * no space left. | 300 | * no space left. |
301 | * | 301 | * |
302 | * Locking: should be called under the output_lock to protect | 302 | * Locking: should be called under the output_lock to protect |
303 | * the column state and space left in the buffer | 303 | * the column state and space left in the buffer |
304 | */ | 304 | */ |
305 | 305 | ||
306 | static int do_output_char(unsigned char c, struct tty_struct *tty, int space) | 306 | static int do_output_char(unsigned char c, struct tty_struct *tty, int space) |
307 | { | 307 | { |
308 | int spaces; | 308 | int spaces; |
309 | 309 | ||
310 | if (!space) | 310 | if (!space) |
311 | return -1; | 311 | return -1; |
312 | 312 | ||
313 | switch (c) { | 313 | switch (c) { |
314 | case '\n': | 314 | case '\n': |
315 | if (O_ONLRET(tty)) | 315 | if (O_ONLRET(tty)) |
316 | tty->column = 0; | 316 | tty->column = 0; |
317 | if (O_ONLCR(tty)) { | 317 | if (O_ONLCR(tty)) { |
318 | if (space < 2) | 318 | if (space < 2) |
319 | return -1; | 319 | return -1; |
320 | tty->canon_column = tty->column = 0; | 320 | tty->canon_column = tty->column = 0; |
321 | tty_put_char(tty, '\r'); | 321 | tty_put_char(tty, '\r'); |
322 | tty_put_char(tty, c); | 322 | tty_put_char(tty, c); |
323 | return 2; | 323 | return 2; |
324 | } | 324 | } |
325 | tty->canon_column = tty->column; | 325 | tty->canon_column = tty->column; |
326 | break; | 326 | break; |
327 | case '\r': | 327 | case '\r': |
328 | if (O_ONOCR(tty) && tty->column == 0) | 328 | if (O_ONOCR(tty) && tty->column == 0) |
329 | return 0; | 329 | return 0; |
330 | if (O_OCRNL(tty)) { | 330 | if (O_OCRNL(tty)) { |
331 | c = '\n'; | 331 | c = '\n'; |
332 | if (O_ONLRET(tty)) | 332 | if (O_ONLRET(tty)) |
333 | tty->canon_column = tty->column = 0; | 333 | tty->canon_column = tty->column = 0; |
334 | break; | 334 | break; |
335 | } | 335 | } |
336 | tty->canon_column = tty->column = 0; | 336 | tty->canon_column = tty->column = 0; |
337 | break; | 337 | break; |
338 | case '\t': | 338 | case '\t': |
339 | spaces = 8 - (tty->column & 7); | 339 | spaces = 8 - (tty->column & 7); |
340 | if (O_TABDLY(tty) == XTABS) { | 340 | if (O_TABDLY(tty) == XTABS) { |
341 | if (space < spaces) | 341 | if (space < spaces) |
342 | return -1; | 342 | return -1; |
343 | tty->column += spaces; | 343 | tty->column += spaces; |
344 | tty->ops->write(tty, " ", spaces); | 344 | tty->ops->write(tty, " ", spaces); |
345 | return spaces; | 345 | return spaces; |
346 | } | 346 | } |
347 | tty->column += spaces; | 347 | tty->column += spaces; |
348 | break; | 348 | break; |
349 | case '\b': | 349 | case '\b': |
350 | if (tty->column > 0) | 350 | if (tty->column > 0) |
351 | tty->column--; | 351 | tty->column--; |
352 | break; | 352 | break; |
353 | default: | 353 | default: |
354 | if (!iscntrl(c)) { | 354 | if (!iscntrl(c)) { |
355 | if (O_OLCUC(tty)) | 355 | if (O_OLCUC(tty)) |
356 | c = toupper(c); | 356 | c = toupper(c); |
357 | if (!is_continuation(c, tty)) | 357 | if (!is_continuation(c, tty)) |
358 | tty->column++; | 358 | tty->column++; |
359 | } | 359 | } |
360 | break; | 360 | break; |
361 | } | 361 | } |
362 | 362 | ||
363 | tty_put_char(tty, c); | 363 | tty_put_char(tty, c); |
364 | return 1; | 364 | return 1; |
365 | } | 365 | } |
366 | 366 | ||
367 | /** | 367 | /** |
368 | * process_output - output post processor | 368 | * process_output - output post processor |
369 | * @c: character (or partial unicode symbol) | 369 | * @c: character (or partial unicode symbol) |
370 | * @tty: terminal device | 370 | * @tty: terminal device |
371 | * | 371 | * |
372 | * Perform OPOST processing. Returns -1 when the output device is | 372 | * Perform OPOST processing. Returns -1 when the output device is |
373 | * full and the character must be retried. | 373 | * full and the character must be retried. |
374 | * | 374 | * |
375 | * Locking: output_lock to protect column state and space left | 375 | * Locking: output_lock to protect column state and space left |
376 | * (also, this is called from n_tty_write under the | 376 | * (also, this is called from n_tty_write under the |
377 | * tty layer write lock) | 377 | * tty layer write lock) |
378 | */ | 378 | */ |
379 | 379 | ||
380 | static int process_output(unsigned char c, struct tty_struct *tty) | 380 | static int process_output(unsigned char c, struct tty_struct *tty) |
381 | { | 381 | { |
382 | int space, retval; | 382 | int space, retval; |
383 | 383 | ||
384 | mutex_lock(&tty->output_lock); | 384 | mutex_lock(&tty->output_lock); |
385 | 385 | ||
386 | space = tty_write_room(tty); | 386 | space = tty_write_room(tty); |
387 | retval = do_output_char(c, tty, space); | 387 | retval = do_output_char(c, tty, space); |
388 | 388 | ||
389 | mutex_unlock(&tty->output_lock); | 389 | mutex_unlock(&tty->output_lock); |
390 | if (retval < 0) | 390 | if (retval < 0) |
391 | return -1; | 391 | return -1; |
392 | else | 392 | else |
393 | return 0; | 393 | return 0; |
394 | } | 394 | } |
395 | 395 | ||
396 | /** | 396 | /** |
397 | * process_output_block - block post processor | 397 | * process_output_block - block post processor |
398 | * @tty: terminal device | 398 | * @tty: terminal device |
399 | * @inbuf: user buffer | 399 | * @inbuf: user buffer |
400 | * @nr: number of bytes | 400 | * @nr: number of bytes |
401 | * | 401 | * |
402 | * This path is used to speed up block console writes, among other | 402 | * This path is used to speed up block console writes, among other |
403 | * things when processing blocks of output data. It handles only | 403 | * things when processing blocks of output data. It handles only |
404 | * the simple cases normally found and helps to generate blocks of | 404 | * the simple cases normally found and helps to generate blocks of |
405 | * symbols for the console driver and thus improve performance. | 405 | * symbols for the console driver and thus improve performance. |
406 | * | 406 | * |
407 | * Locking: output_lock to protect column state and space left | 407 | * Locking: output_lock to protect column state and space left |
408 | * (also, this is called from n_tty_write under the | 408 | * (also, this is called from n_tty_write under the |
409 | * tty layer write lock) | 409 | * tty layer write lock) |
410 | */ | 410 | */ |
411 | 411 | ||
412 | static ssize_t process_output_block(struct tty_struct *tty, | 412 | static ssize_t process_output_block(struct tty_struct *tty, |
413 | const unsigned char *buf, unsigned int nr) | 413 | const unsigned char *buf, unsigned int nr) |
414 | { | 414 | { |
415 | int space; | 415 | int space; |
416 | int i; | 416 | int i; |
417 | const unsigned char *cp; | 417 | const unsigned char *cp; |
418 | 418 | ||
419 | mutex_lock(&tty->output_lock); | 419 | mutex_lock(&tty->output_lock); |
420 | 420 | ||
421 | space = tty_write_room(tty); | 421 | space = tty_write_room(tty); |
422 | if (!space) { | 422 | if (!space) { |
423 | mutex_unlock(&tty->output_lock); | 423 | mutex_unlock(&tty->output_lock); |
424 | return 0; | 424 | return 0; |
425 | } | 425 | } |
426 | if (nr > space) | 426 | if (nr > space) |
427 | nr = space; | 427 | nr = space; |
428 | 428 | ||
429 | for (i = 0, cp = buf; i < nr; i++, cp++) { | 429 | for (i = 0, cp = buf; i < nr; i++, cp++) { |
430 | unsigned char c = *cp; | 430 | unsigned char c = *cp; |
431 | 431 | ||
432 | switch (c) { | 432 | switch (c) { |
433 | case '\n': | 433 | case '\n': |
434 | if (O_ONLRET(tty)) | 434 | if (O_ONLRET(tty)) |
435 | tty->column = 0; | 435 | tty->column = 0; |
436 | if (O_ONLCR(tty)) | 436 | if (O_ONLCR(tty)) |
437 | goto break_out; | 437 | goto break_out; |
438 | tty->canon_column = tty->column; | 438 | tty->canon_column = tty->column; |
439 | break; | 439 | break; |
440 | case '\r': | 440 | case '\r': |
441 | if (O_ONOCR(tty) && tty->column == 0) | 441 | if (O_ONOCR(tty) && tty->column == 0) |
442 | goto break_out; | 442 | goto break_out; |
443 | if (O_OCRNL(tty)) | 443 | if (O_OCRNL(tty)) |
444 | goto break_out; | 444 | goto break_out; |
445 | tty->canon_column = tty->column = 0; | 445 | tty->canon_column = tty->column = 0; |
446 | break; | 446 | break; |
447 | case '\t': | 447 | case '\t': |
448 | goto break_out; | 448 | goto break_out; |
449 | case '\b': | 449 | case '\b': |
450 | if (tty->column > 0) | 450 | if (tty->column > 0) |
451 | tty->column--; | 451 | tty->column--; |
452 | break; | 452 | break; |
453 | default: | 453 | default: |
454 | if (!iscntrl(c)) { | 454 | if (!iscntrl(c)) { |
455 | if (O_OLCUC(tty)) | 455 | if (O_OLCUC(tty)) |
456 | goto break_out; | 456 | goto break_out; |
457 | if (!is_continuation(c, tty)) | 457 | if (!is_continuation(c, tty)) |
458 | tty->column++; | 458 | tty->column++; |
459 | } | 459 | } |
460 | break; | 460 | break; |
461 | } | 461 | } |
462 | } | 462 | } |
463 | break_out: | 463 | break_out: |
464 | i = tty->ops->write(tty, buf, i); | 464 | i = tty->ops->write(tty, buf, i); |
465 | 465 | ||
466 | mutex_unlock(&tty->output_lock); | 466 | mutex_unlock(&tty->output_lock); |
467 | return i; | 467 | return i; |
468 | } | 468 | } |
469 | 469 | ||
470 | /** | 470 | /** |
471 | * process_echoes - write pending echo characters | 471 | * process_echoes - write pending echo characters |
472 | * @tty: terminal device | 472 | * @tty: terminal device |
473 | * | 473 | * |
474 | * Write previously buffered echo (and other ldisc-generated) | 474 | * Write previously buffered echo (and other ldisc-generated) |
475 | * characters to the tty. | 475 | * characters to the tty. |
476 | * | 476 | * |
477 | * Characters generated by the ldisc (including echoes) need to | 477 | * Characters generated by the ldisc (including echoes) need to |
478 | * be buffered because the driver's write buffer can fill during | 478 | * be buffered because the driver's write buffer can fill during |
479 | * heavy program output. Echoing straight to the driver will | 479 | * heavy program output. Echoing straight to the driver will |
480 | * often fail under these conditions, causing lost characters and | 480 | * often fail under these conditions, causing lost characters and |
481 | * resulting mismatches of ldisc state information. | 481 | * resulting mismatches of ldisc state information. |
482 | * | 482 | * |
483 | * Since the ldisc state must represent the characters actually sent | 483 | * Since the ldisc state must represent the characters actually sent |
484 | * to the driver at the time of the write, operations like certain | 484 | * to the driver at the time of the write, operations like certain |
485 | * changes in column state are also saved in the buffer and executed | 485 | * changes in column state are also saved in the buffer and executed |
486 | * here. | 486 | * here. |
487 | * | 487 | * |
488 | * A circular fifo buffer is used so that the most recent characters | 488 | * A circular fifo buffer is used so that the most recent characters |
489 | * are prioritized. Also, when control characters are echoed with a | 489 | * are prioritized. Also, when control characters are echoed with a |
490 | * prefixed "^", the pair is treated atomically and thus not separated. | 490 | * prefixed "^", the pair is treated atomically and thus not separated. |
491 | * | 491 | * |
492 | * Locking: output_lock to protect column state and space left, | 492 | * Locking: output_lock to protect column state and space left, |
493 | * echo_lock to protect the echo buffer | 493 | * echo_lock to protect the echo buffer |
494 | */ | 494 | */ |
495 | 495 | ||
496 | static void process_echoes(struct tty_struct *tty) | 496 | static void process_echoes(struct tty_struct *tty) |
497 | { | 497 | { |
498 | int space, nr; | 498 | int space, nr; |
499 | unsigned char c; | 499 | unsigned char c; |
500 | unsigned char *cp, *buf_end; | 500 | unsigned char *cp, *buf_end; |
501 | 501 | ||
502 | if (!tty->echo_cnt) | 502 | if (!tty->echo_cnt) |
503 | return; | 503 | return; |
504 | 504 | ||
505 | mutex_lock(&tty->output_lock); | 505 | mutex_lock(&tty->output_lock); |
506 | mutex_lock(&tty->echo_lock); | 506 | mutex_lock(&tty->echo_lock); |
507 | 507 | ||
508 | space = tty_write_room(tty); | 508 | space = tty_write_room(tty); |
509 | 509 | ||
510 | buf_end = tty->echo_buf + N_TTY_BUF_SIZE; | 510 | buf_end = tty->echo_buf + N_TTY_BUF_SIZE; |
511 | cp = tty->echo_buf + tty->echo_pos; | 511 | cp = tty->echo_buf + tty->echo_pos; |
512 | nr = tty->echo_cnt; | 512 | nr = tty->echo_cnt; |
513 | while (nr > 0) { | 513 | while (nr > 0) { |
514 | c = *cp; | 514 | c = *cp; |
515 | if (c == ECHO_OP_START) { | 515 | if (c == ECHO_OP_START) { |
516 | unsigned char op; | 516 | unsigned char op; |
517 | unsigned char *opp; | 517 | unsigned char *opp; |
518 | int no_space_left = 0; | 518 | int no_space_left = 0; |
519 | 519 | ||
520 | /* | 520 | /* |
521 | * If the buffer byte is the start of a multi-byte | 521 | * If the buffer byte is the start of a multi-byte |
522 | * operation, get the next byte, which is either the | 522 | * operation, get the next byte, which is either the |
523 | * op code or a control character value. | 523 | * op code or a control character value. |
524 | */ | 524 | */ |
525 | opp = cp + 1; | 525 | opp = cp + 1; |
526 | if (opp == buf_end) | 526 | if (opp == buf_end) |
527 | opp -= N_TTY_BUF_SIZE; | 527 | opp -= N_TTY_BUF_SIZE; |
528 | op = *opp; | 528 | op = *opp; |
529 | 529 | ||
530 | switch (op) { | 530 | switch (op) { |
531 | unsigned int num_chars, num_bs; | 531 | unsigned int num_chars, num_bs; |
532 | 532 | ||
533 | case ECHO_OP_ERASE_TAB: | 533 | case ECHO_OP_ERASE_TAB: |
534 | if (++opp == buf_end) | 534 | if (++opp == buf_end) |
535 | opp -= N_TTY_BUF_SIZE; | 535 | opp -= N_TTY_BUF_SIZE; |
536 | num_chars = *opp; | 536 | num_chars = *opp; |
537 | 537 | ||
538 | /* | 538 | /* |
539 | * Determine how many columns to go back | 539 | * Determine how many columns to go back |
540 | * in order to erase the tab. | 540 | * in order to erase the tab. |
541 | * This depends on the number of columns | 541 | * This depends on the number of columns |
542 | * used by other characters within the tab | 542 | * used by other characters within the tab |
543 | * area. If this (modulo 8) count is from | 543 | * area. If this (modulo 8) count is from |
544 | * the start of input rather than from a | 544 | * the start of input rather than from a |
545 | * previous tab, we offset by canon column. | 545 | * previous tab, we offset by canon column. |
546 | * Otherwise, tab spacing is normal. | 546 | * Otherwise, tab spacing is normal. |
547 | */ | 547 | */ |
548 | if (!(num_chars & 0x80)) | 548 | if (!(num_chars & 0x80)) |
549 | num_chars += tty->canon_column; | 549 | num_chars += tty->canon_column; |
550 | num_bs = 8 - (num_chars & 7); | 550 | num_bs = 8 - (num_chars & 7); |
551 | 551 | ||
552 | if (num_bs > space) { | 552 | if (num_bs > space) { |
553 | no_space_left = 1; | 553 | no_space_left = 1; |
554 | break; | 554 | break; |
555 | } | 555 | } |
556 | space -= num_bs; | 556 | space -= num_bs; |
557 | while (num_bs--) { | 557 | while (num_bs--) { |
558 | tty_put_char(tty, '\b'); | 558 | tty_put_char(tty, '\b'); |
559 | if (tty->column > 0) | 559 | if (tty->column > 0) |
560 | tty->column--; | 560 | tty->column--; |
561 | } | 561 | } |
562 | cp += 3; | 562 | cp += 3; |
563 | nr -= 3; | 563 | nr -= 3; |
564 | break; | 564 | break; |
565 | 565 | ||
566 | case ECHO_OP_SET_CANON_COL: | 566 | case ECHO_OP_SET_CANON_COL: |
567 | tty->canon_column = tty->column; | 567 | tty->canon_column = tty->column; |
568 | cp += 2; | 568 | cp += 2; |
569 | nr -= 2; | 569 | nr -= 2; |
570 | break; | 570 | break; |
571 | 571 | ||
572 | case ECHO_OP_MOVE_BACK_COL: | 572 | case ECHO_OP_MOVE_BACK_COL: |
573 | if (tty->column > 0) | 573 | if (tty->column > 0) |
574 | tty->column--; | 574 | tty->column--; |
575 | cp += 2; | 575 | cp += 2; |
576 | nr -= 2; | 576 | nr -= 2; |
577 | break; | 577 | break; |
578 | 578 | ||
579 | case ECHO_OP_START: | 579 | case ECHO_OP_START: |
580 | /* This is an escaped echo op start code */ | 580 | /* This is an escaped echo op start code */ |
581 | if (!space) { | 581 | if (!space) { |
582 | no_space_left = 1; | 582 | no_space_left = 1; |
583 | break; | 583 | break; |
584 | } | 584 | } |
585 | tty_put_char(tty, ECHO_OP_START); | 585 | tty_put_char(tty, ECHO_OP_START); |
586 | tty->column++; | 586 | tty->column++; |
587 | space--; | 587 | space--; |
588 | cp += 2; | 588 | cp += 2; |
589 | nr -= 2; | 589 | nr -= 2; |
590 | break; | 590 | break; |
591 | 591 | ||
592 | default: | 592 | default: |
593 | if (iscntrl(op)) { | 593 | if (iscntrl(op)) { |
594 | if (L_ECHOCTL(tty)) { | 594 | if (L_ECHOCTL(tty)) { |
595 | /* | 595 | /* |
596 | * Ensure there is enough space | 596 | * Ensure there is enough space |
597 | * for the whole ctrl pair. | 597 | * for the whole ctrl pair. |
598 | */ | 598 | */ |
599 | if (space < 2) { | 599 | if (space < 2) { |
600 | no_space_left = 1; | 600 | no_space_left = 1; |
601 | break; | 601 | break; |
602 | } | 602 | } |
603 | tty_put_char(tty, '^'); | 603 | tty_put_char(tty, '^'); |
604 | tty_put_char(tty, op ^ 0100); | 604 | tty_put_char(tty, op ^ 0100); |
605 | tty->column += 2; | 605 | tty->column += 2; |
606 | space -= 2; | 606 | space -= 2; |
607 | } else { | 607 | } else { |
608 | if (!space) { | 608 | if (!space) { |
609 | no_space_left = 1; | 609 | no_space_left = 1; |
610 | break; | 610 | break; |
611 | } | 611 | } |
612 | tty_put_char(tty, op); | 612 | tty_put_char(tty, op); |
613 | space--; | 613 | space--; |
614 | } | 614 | } |
615 | } | 615 | } |
616 | /* | 616 | /* |
617 | * If above falls through, this was an | 617 | * If above falls through, this was an |
618 | * undefined op. | 618 | * undefined op. |
619 | */ | 619 | */ |
620 | cp += 2; | 620 | cp += 2; |
621 | nr -= 2; | 621 | nr -= 2; |
622 | } | 622 | } |
623 | 623 | ||
624 | if (no_space_left) | 624 | if (no_space_left) |
625 | break; | 625 | break; |
626 | } else { | 626 | } else { |
627 | int retval; | 627 | int retval; |
628 | 628 | ||
629 | retval = do_output_char(c, tty, space); | 629 | retval = do_output_char(c, tty, space); |
630 | if (retval < 0) | 630 | if (retval < 0) |
631 | break; | 631 | break; |
632 | space -= retval; | 632 | space -= retval; |
633 | cp += 1; | 633 | cp += 1; |
634 | nr -= 1; | 634 | nr -= 1; |
635 | } | 635 | } |
636 | 636 | ||
637 | /* When end of circular buffer reached, wrap around */ | 637 | /* When end of circular buffer reached, wrap around */ |
638 | if (cp >= buf_end) | 638 | if (cp >= buf_end) |
639 | cp -= N_TTY_BUF_SIZE; | 639 | cp -= N_TTY_BUF_SIZE; |
640 | } | 640 | } |
641 | 641 | ||
642 | if (nr == 0) { | 642 | if (nr == 0) { |
643 | tty->echo_pos = 0; | 643 | tty->echo_pos = 0; |
644 | tty->echo_cnt = 0; | 644 | tty->echo_cnt = 0; |
645 | tty->echo_overrun = 0; | 645 | tty->echo_overrun = 0; |
646 | } else { | 646 | } else { |
647 | int num_processed = tty->echo_cnt - nr; | 647 | int num_processed = tty->echo_cnt - nr; |
648 | tty->echo_pos += num_processed; | 648 | tty->echo_pos += num_processed; |
649 | tty->echo_pos &= N_TTY_BUF_SIZE - 1; | 649 | tty->echo_pos &= N_TTY_BUF_SIZE - 1; |
650 | tty->echo_cnt = nr; | 650 | tty->echo_cnt = nr; |
651 | if (num_processed > 0) | 651 | if (num_processed > 0) |
652 | tty->echo_overrun = 0; | 652 | tty->echo_overrun = 0; |
653 | } | 653 | } |
654 | 654 | ||
655 | mutex_unlock(&tty->echo_lock); | 655 | mutex_unlock(&tty->echo_lock); |
656 | mutex_unlock(&tty->output_lock); | 656 | mutex_unlock(&tty->output_lock); |
657 | 657 | ||
658 | if (tty->ops->flush_chars) | 658 | if (tty->ops->flush_chars) |
659 | tty->ops->flush_chars(tty); | 659 | tty->ops->flush_chars(tty); |
660 | } | 660 | } |
661 | 661 | ||
662 | /** | 662 | /** |
663 | * add_echo_byte - add a byte to the echo buffer | 663 | * add_echo_byte - add a byte to the echo buffer |
664 | * @c: unicode byte to echo | 664 | * @c: unicode byte to echo |
665 | * @tty: terminal device | 665 | * @tty: terminal device |
666 | * | 666 | * |
667 | * Add a character or operation byte to the echo buffer. | 667 | * Add a character or operation byte to the echo buffer. |
668 | * | 668 | * |
669 | * Should be called under the echo lock to protect the echo buffer. | 669 | * Should be called under the echo lock to protect the echo buffer. |
670 | */ | 670 | */ |
671 | 671 | ||
672 | static void add_echo_byte(unsigned char c, struct tty_struct *tty) | 672 | static void add_echo_byte(unsigned char c, struct tty_struct *tty) |
673 | { | 673 | { |
674 | int new_byte_pos; | 674 | int new_byte_pos; |
675 | 675 | ||
676 | if (tty->echo_cnt == N_TTY_BUF_SIZE) { | 676 | if (tty->echo_cnt == N_TTY_BUF_SIZE) { |
677 | /* Circular buffer is already at capacity */ | 677 | /* Circular buffer is already at capacity */ |
678 | new_byte_pos = tty->echo_pos; | 678 | new_byte_pos = tty->echo_pos; |
679 | 679 | ||
680 | /* | 680 | /* |
681 | * Since the buffer start position needs to be advanced, | 681 | * Since the buffer start position needs to be advanced, |
682 | * be sure to step by a whole operation byte group. | 682 | * be sure to step by a whole operation byte group. |
683 | */ | 683 | */ |
684 | if (tty->echo_buf[tty->echo_pos] == ECHO_OP_START) { | 684 | if (tty->echo_buf[tty->echo_pos] == ECHO_OP_START) { |
685 | if (tty->echo_buf[(tty->echo_pos + 1) & | 685 | if (tty->echo_buf[(tty->echo_pos + 1) & |
686 | (N_TTY_BUF_SIZE - 1)] == | 686 | (N_TTY_BUF_SIZE - 1)] == |
687 | ECHO_OP_ERASE_TAB) { | 687 | ECHO_OP_ERASE_TAB) { |
688 | tty->echo_pos += 3; | 688 | tty->echo_pos += 3; |
689 | tty->echo_cnt -= 2; | 689 | tty->echo_cnt -= 2; |
690 | } else { | 690 | } else { |
691 | tty->echo_pos += 2; | 691 | tty->echo_pos += 2; |
692 | tty->echo_cnt -= 1; | 692 | tty->echo_cnt -= 1; |
693 | } | 693 | } |
694 | } else { | 694 | } else { |
695 | tty->echo_pos++; | 695 | tty->echo_pos++; |
696 | } | 696 | } |
697 | tty->echo_pos &= N_TTY_BUF_SIZE - 1; | 697 | tty->echo_pos &= N_TTY_BUF_SIZE - 1; |
698 | 698 | ||
699 | tty->echo_overrun = 1; | 699 | tty->echo_overrun = 1; |
700 | } else { | 700 | } else { |
701 | new_byte_pos = tty->echo_pos + tty->echo_cnt; | 701 | new_byte_pos = tty->echo_pos + tty->echo_cnt; |
702 | new_byte_pos &= N_TTY_BUF_SIZE - 1; | 702 | new_byte_pos &= N_TTY_BUF_SIZE - 1; |
703 | tty->echo_cnt++; | 703 | tty->echo_cnt++; |
704 | } | 704 | } |
705 | 705 | ||
706 | tty->echo_buf[new_byte_pos] = c; | 706 | tty->echo_buf[new_byte_pos] = c; |
707 | } | 707 | } |
708 | 708 | ||
709 | /** | 709 | /** |
710 | * echo_move_back_col - add operation to move back a column | 710 | * echo_move_back_col - add operation to move back a column |
711 | * @tty: terminal device | 711 | * @tty: terminal device |
712 | * | 712 | * |
713 | * Add an operation to the echo buffer to move back one column. | 713 | * Add an operation to the echo buffer to move back one column. |
714 | * | 714 | * |
715 | * Locking: echo_lock to protect the echo buffer | 715 | * Locking: echo_lock to protect the echo buffer |
716 | */ | 716 | */ |
717 | 717 | ||
718 | static void echo_move_back_col(struct tty_struct *tty) | 718 | static void echo_move_back_col(struct tty_struct *tty) |
719 | { | 719 | { |
720 | mutex_lock(&tty->echo_lock); | 720 | mutex_lock(&tty->echo_lock); |
721 | 721 | ||
722 | add_echo_byte(ECHO_OP_START, tty); | 722 | add_echo_byte(ECHO_OP_START, tty); |
723 | add_echo_byte(ECHO_OP_MOVE_BACK_COL, tty); | 723 | add_echo_byte(ECHO_OP_MOVE_BACK_COL, tty); |
724 | 724 | ||
725 | mutex_unlock(&tty->echo_lock); | 725 | mutex_unlock(&tty->echo_lock); |
726 | } | 726 | } |
727 | 727 | ||
728 | /** | 728 | /** |
729 | * echo_set_canon_col - add operation to set the canon column | 729 | * echo_set_canon_col - add operation to set the canon column |
730 | * @tty: terminal device | 730 | * @tty: terminal device |
731 | * | 731 | * |
732 | * Add an operation to the echo buffer to set the canon column | 732 | * Add an operation to the echo buffer to set the canon column |
733 | * to the current column. | 733 | * to the current column. |
734 | * | 734 | * |
735 | * Locking: echo_lock to protect the echo buffer | 735 | * Locking: echo_lock to protect the echo buffer |
736 | */ | 736 | */ |
737 | 737 | ||
738 | static void echo_set_canon_col(struct tty_struct *tty) | 738 | static void echo_set_canon_col(struct tty_struct *tty) |
739 | { | 739 | { |
740 | mutex_lock(&tty->echo_lock); | 740 | mutex_lock(&tty->echo_lock); |
741 | 741 | ||
742 | add_echo_byte(ECHO_OP_START, tty); | 742 | add_echo_byte(ECHO_OP_START, tty); |
743 | add_echo_byte(ECHO_OP_SET_CANON_COL, tty); | 743 | add_echo_byte(ECHO_OP_SET_CANON_COL, tty); |
744 | 744 | ||
745 | mutex_unlock(&tty->echo_lock); | 745 | mutex_unlock(&tty->echo_lock); |
746 | } | 746 | } |
747 | 747 | ||
748 | /** | 748 | /** |
749 | * echo_erase_tab - add operation to erase a tab | 749 | * echo_erase_tab - add operation to erase a tab |
750 | * @num_chars: number of character columns already used | 750 | * @num_chars: number of character columns already used |
751 | * @after_tab: true if num_chars starts after a previous tab | 751 | * @after_tab: true if num_chars starts after a previous tab |
752 | * @tty: terminal device | 752 | * @tty: terminal device |
753 | * | 753 | * |
754 | * Add an operation to the echo buffer to erase a tab. | 754 | * Add an operation to the echo buffer to erase a tab. |
755 | * | 755 | * |
756 | * Called by the eraser function, which knows how many character | 756 | * Called by the eraser function, which knows how many character |
757 | * columns have been used since either a previous tab or the start | 757 | * columns have been used since either a previous tab or the start |
758 | * of input. This information will be used later, along with | 758 | * of input. This information will be used later, along with |
759 | * canon column (if applicable), to go back the correct number | 759 | * canon column (if applicable), to go back the correct number |
760 | * of columns. | 760 | * of columns. |
761 | * | 761 | * |
762 | * Locking: echo_lock to protect the echo buffer | 762 | * Locking: echo_lock to protect the echo buffer |
763 | */ | 763 | */ |
764 | 764 | ||
765 | static void echo_erase_tab(unsigned int num_chars, int after_tab, | 765 | static void echo_erase_tab(unsigned int num_chars, int after_tab, |
766 | struct tty_struct *tty) | 766 | struct tty_struct *tty) |
767 | { | 767 | { |
768 | mutex_lock(&tty->echo_lock); | 768 | mutex_lock(&tty->echo_lock); |
769 | 769 | ||
770 | add_echo_byte(ECHO_OP_START, tty); | 770 | add_echo_byte(ECHO_OP_START, tty); |
771 | add_echo_byte(ECHO_OP_ERASE_TAB, tty); | 771 | add_echo_byte(ECHO_OP_ERASE_TAB, tty); |
772 | 772 | ||
773 | /* We only need to know this modulo 8 (tab spacing) */ | 773 | /* We only need to know this modulo 8 (tab spacing) */ |
774 | num_chars &= 7; | 774 | num_chars &= 7; |
775 | 775 | ||
776 | /* Set the high bit as a flag if num_chars is after a previous tab */ | 776 | /* Set the high bit as a flag if num_chars is after a previous tab */ |
777 | if (after_tab) | 777 | if (after_tab) |
778 | num_chars |= 0x80; | 778 | num_chars |= 0x80; |
779 | 779 | ||
780 | add_echo_byte(num_chars, tty); | 780 | add_echo_byte(num_chars, tty); |
781 | 781 | ||
782 | mutex_unlock(&tty->echo_lock); | 782 | mutex_unlock(&tty->echo_lock); |
783 | } | 783 | } |
784 | 784 | ||
785 | /** | 785 | /** |
786 | * echo_char_raw - echo a character raw | 786 | * echo_char_raw - echo a character raw |
787 | * @c: unicode byte to echo | 787 | * @c: unicode byte to echo |
788 | * @tty: terminal device | 788 | * @tty: terminal device |
789 | * | 789 | * |
790 | * Echo user input back onto the screen. This must be called only when | 790 | * Echo user input back onto the screen. This must be called only when |
791 | * L_ECHO(tty) is true. Called from the driver receive_buf path. | 791 | * L_ECHO(tty) is true. Called from the driver receive_buf path. |
792 | * | 792 | * |
793 | * This variant does not treat control characters specially. | 793 | * This variant does not treat control characters specially. |
794 | * | 794 | * |
795 | * Locking: echo_lock to protect the echo buffer | 795 | * Locking: echo_lock to protect the echo buffer |
796 | */ | 796 | */ |
797 | 797 | ||
798 | static void echo_char_raw(unsigned char c, struct tty_struct *tty) | 798 | static void echo_char_raw(unsigned char c, struct tty_struct *tty) |
799 | { | 799 | { |
800 | mutex_lock(&tty->echo_lock); | 800 | mutex_lock(&tty->echo_lock); |
801 | 801 | ||
802 | if (c == ECHO_OP_START) { | 802 | if (c == ECHO_OP_START) { |
803 | add_echo_byte(ECHO_OP_START, tty); | 803 | add_echo_byte(ECHO_OP_START, tty); |
804 | add_echo_byte(ECHO_OP_START, tty); | 804 | add_echo_byte(ECHO_OP_START, tty); |
805 | } else { | 805 | } else { |
806 | add_echo_byte(c, tty); | 806 | add_echo_byte(c, tty); |
807 | } | 807 | } |
808 | 808 | ||
809 | mutex_unlock(&tty->echo_lock); | 809 | mutex_unlock(&tty->echo_lock); |
810 | } | 810 | } |
811 | 811 | ||
812 | /** | 812 | /** |
813 | * echo_char - echo a character | 813 | * echo_char - echo a character |
814 | * @c: unicode byte to echo | 814 | * @c: unicode byte to echo |
815 | * @tty: terminal device | 815 | * @tty: terminal device |
816 | * | 816 | * |
817 | * Echo user input back onto the screen. This must be called only when | 817 | * Echo user input back onto the screen. This must be called only when |
818 | * L_ECHO(tty) is true. Called from the driver receive_buf path. | 818 | * L_ECHO(tty) is true. Called from the driver receive_buf path. |
819 | * | 819 | * |
820 | * This variant tags control characters to be possibly echoed as | 820 | * This variant tags control characters to be possibly echoed as |
821 | * as "^X" (where X is the letter representing the control char). | 821 | * as "^X" (where X is the letter representing the control char). |
822 | * | 822 | * |
823 | * Locking: echo_lock to protect the echo buffer | 823 | * Locking: echo_lock to protect the echo buffer |
824 | */ | 824 | */ |
825 | 825 | ||
826 | static void echo_char(unsigned char c, struct tty_struct *tty) | 826 | static void echo_char(unsigned char c, struct tty_struct *tty) |
827 | { | 827 | { |
828 | mutex_lock(&tty->echo_lock); | 828 | mutex_lock(&tty->echo_lock); |
829 | 829 | ||
830 | if (c == ECHO_OP_START) { | 830 | if (c == ECHO_OP_START) { |
831 | add_echo_byte(ECHO_OP_START, tty); | 831 | add_echo_byte(ECHO_OP_START, tty); |
832 | add_echo_byte(ECHO_OP_START, tty); | 832 | add_echo_byte(ECHO_OP_START, tty); |
833 | } else { | 833 | } else { |
834 | if (iscntrl(c) && c != '\t') | 834 | if (iscntrl(c) && c != '\t') |
835 | add_echo_byte(ECHO_OP_START, tty); | 835 | add_echo_byte(ECHO_OP_START, tty); |
836 | add_echo_byte(c, tty); | 836 | add_echo_byte(c, tty); |
837 | } | 837 | } |
838 | 838 | ||
839 | mutex_unlock(&tty->echo_lock); | 839 | mutex_unlock(&tty->echo_lock); |
840 | } | 840 | } |
841 | 841 | ||
842 | /** | 842 | /** |
843 | * finish_erasing - complete erase | 843 | * finish_erasing - complete erase |
844 | * @tty: tty doing the erase | 844 | * @tty: tty doing the erase |
845 | */ | 845 | */ |
846 | 846 | ||
847 | static inline void finish_erasing(struct tty_struct *tty) | 847 | static inline void finish_erasing(struct tty_struct *tty) |
848 | { | 848 | { |
849 | if (tty->erasing) { | 849 | if (tty->erasing) { |
850 | echo_char_raw('/', tty); | 850 | echo_char_raw('/', tty); |
851 | tty->erasing = 0; | 851 | tty->erasing = 0; |
852 | } | 852 | } |
853 | } | 853 | } |
854 | 854 | ||
855 | /** | 855 | /** |
856 | * eraser - handle erase function | 856 | * eraser - handle erase function |
857 | * @c: character input | 857 | * @c: character input |
858 | * @tty: terminal device | 858 | * @tty: terminal device |
859 | * | 859 | * |
860 | * Perform erase and necessary output when an erase character is | 860 | * Perform erase and necessary output when an erase character is |
861 | * present in the stream from the driver layer. Handles the complexities | 861 | * present in the stream from the driver layer. Handles the complexities |
862 | * of UTF-8 multibyte symbols. | 862 | * of UTF-8 multibyte symbols. |
863 | * | 863 | * |
864 | * Locking: read_lock for tty buffers | 864 | * Locking: read_lock for tty buffers |
865 | */ | 865 | */ |
866 | 866 | ||
867 | static void eraser(unsigned char c, struct tty_struct *tty) | 867 | static void eraser(unsigned char c, struct tty_struct *tty) |
868 | { | 868 | { |
869 | enum { ERASE, WERASE, KILL } kill_type; | 869 | enum { ERASE, WERASE, KILL } kill_type; |
870 | int head, seen_alnums, cnt; | 870 | int head, seen_alnums, cnt; |
871 | unsigned long flags; | 871 | unsigned long flags; |
872 | 872 | ||
873 | /* FIXME: locking needed ? */ | 873 | /* FIXME: locking needed ? */ |
874 | if (tty->read_head == tty->canon_head) { | 874 | if (tty->read_head == tty->canon_head) { |
875 | /* process_output('\a', tty); */ /* what do you think? */ | 875 | /* process_output('\a', tty); */ /* what do you think? */ |
876 | return; | 876 | return; |
877 | } | 877 | } |
878 | if (c == ERASE_CHAR(tty)) | 878 | if (c == ERASE_CHAR(tty)) |
879 | kill_type = ERASE; | 879 | kill_type = ERASE; |
880 | else if (c == WERASE_CHAR(tty)) | 880 | else if (c == WERASE_CHAR(tty)) |
881 | kill_type = WERASE; | 881 | kill_type = WERASE; |
882 | else { | 882 | else { |
883 | if (!L_ECHO(tty)) { | 883 | if (!L_ECHO(tty)) { |
884 | spin_lock_irqsave(&tty->read_lock, flags); | 884 | spin_lock_irqsave(&tty->read_lock, flags); |
885 | tty->read_cnt -= ((tty->read_head - tty->canon_head) & | 885 | tty->read_cnt -= ((tty->read_head - tty->canon_head) & |
886 | (N_TTY_BUF_SIZE - 1)); | 886 | (N_TTY_BUF_SIZE - 1)); |
887 | tty->read_head = tty->canon_head; | 887 | tty->read_head = tty->canon_head; |
888 | spin_unlock_irqrestore(&tty->read_lock, flags); | 888 | spin_unlock_irqrestore(&tty->read_lock, flags); |
889 | return; | 889 | return; |
890 | } | 890 | } |
891 | if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) { | 891 | if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) { |
892 | spin_lock_irqsave(&tty->read_lock, flags); | 892 | spin_lock_irqsave(&tty->read_lock, flags); |
893 | tty->read_cnt -= ((tty->read_head - tty->canon_head) & | 893 | tty->read_cnt -= ((tty->read_head - tty->canon_head) & |
894 | (N_TTY_BUF_SIZE - 1)); | 894 | (N_TTY_BUF_SIZE - 1)); |
895 | tty->read_head = tty->canon_head; | 895 | tty->read_head = tty->canon_head; |
896 | spin_unlock_irqrestore(&tty->read_lock, flags); | 896 | spin_unlock_irqrestore(&tty->read_lock, flags); |
897 | finish_erasing(tty); | 897 | finish_erasing(tty); |
898 | echo_char(KILL_CHAR(tty), tty); | 898 | echo_char(KILL_CHAR(tty), tty); |
899 | /* Add a newline if ECHOK is on and ECHOKE is off. */ | 899 | /* Add a newline if ECHOK is on and ECHOKE is off. */ |
900 | if (L_ECHOK(tty)) | 900 | if (L_ECHOK(tty)) |
901 | echo_char_raw('\n', tty); | 901 | echo_char_raw('\n', tty); |
902 | return; | 902 | return; |
903 | } | 903 | } |
904 | kill_type = KILL; | 904 | kill_type = KILL; |
905 | } | 905 | } |
906 | 906 | ||
907 | seen_alnums = 0; | 907 | seen_alnums = 0; |
908 | /* FIXME: Locking ?? */ | 908 | /* FIXME: Locking ?? */ |
909 | while (tty->read_head != tty->canon_head) { | 909 | while (tty->read_head != tty->canon_head) { |
910 | head = tty->read_head; | 910 | head = tty->read_head; |
911 | 911 | ||
912 | /* erase a single possibly multibyte character */ | 912 | /* erase a single possibly multibyte character */ |
913 | do { | 913 | do { |
914 | head = (head - 1) & (N_TTY_BUF_SIZE-1); | 914 | head = (head - 1) & (N_TTY_BUF_SIZE-1); |
915 | c = tty->read_buf[head]; | 915 | c = tty->read_buf[head]; |
916 | } while (is_continuation(c, tty) && head != tty->canon_head); | 916 | } while (is_continuation(c, tty) && head != tty->canon_head); |
917 | 917 | ||
918 | /* do not partially erase */ | 918 | /* do not partially erase */ |
919 | if (is_continuation(c, tty)) | 919 | if (is_continuation(c, tty)) |
920 | break; | 920 | break; |
921 | 921 | ||
922 | if (kill_type == WERASE) { | 922 | if (kill_type == WERASE) { |
923 | /* Equivalent to BSD's ALTWERASE. */ | 923 | /* Equivalent to BSD's ALTWERASE. */ |
924 | if (isalnum(c) || c == '_') | 924 | if (isalnum(c) || c == '_') |
925 | seen_alnums++; | 925 | seen_alnums++; |
926 | else if (seen_alnums) | 926 | else if (seen_alnums) |
927 | break; | 927 | break; |
928 | } | 928 | } |
929 | cnt = (tty->read_head - head) & (N_TTY_BUF_SIZE-1); | 929 | cnt = (tty->read_head - head) & (N_TTY_BUF_SIZE-1); |
930 | spin_lock_irqsave(&tty->read_lock, flags); | 930 | spin_lock_irqsave(&tty->read_lock, flags); |
931 | tty->read_head = head; | 931 | tty->read_head = head; |
932 | tty->read_cnt -= cnt; | 932 | tty->read_cnt -= cnt; |
933 | spin_unlock_irqrestore(&tty->read_lock, flags); | 933 | spin_unlock_irqrestore(&tty->read_lock, flags); |
934 | if (L_ECHO(tty)) { | 934 | if (L_ECHO(tty)) { |
935 | if (L_ECHOPRT(tty)) { | 935 | if (L_ECHOPRT(tty)) { |
936 | if (!tty->erasing) { | 936 | if (!tty->erasing) { |
937 | echo_char_raw('\\', tty); | 937 | echo_char_raw('\\', tty); |
938 | tty->erasing = 1; | 938 | tty->erasing = 1; |
939 | } | 939 | } |
940 | /* if cnt > 1, output a multi-byte character */ | 940 | /* if cnt > 1, output a multi-byte character */ |
941 | echo_char(c, tty); | 941 | echo_char(c, tty); |
942 | while (--cnt > 0) { | 942 | while (--cnt > 0) { |
943 | head = (head+1) & (N_TTY_BUF_SIZE-1); | 943 | head = (head+1) & (N_TTY_BUF_SIZE-1); |
944 | echo_char_raw(tty->read_buf[head], tty); | 944 | echo_char_raw(tty->read_buf[head], tty); |
945 | echo_move_back_col(tty); | 945 | echo_move_back_col(tty); |
946 | } | 946 | } |
947 | } else if (kill_type == ERASE && !L_ECHOE(tty)) { | 947 | } else if (kill_type == ERASE && !L_ECHOE(tty)) { |
948 | echo_char(ERASE_CHAR(tty), tty); | 948 | echo_char(ERASE_CHAR(tty), tty); |
949 | } else if (c == '\t') { | 949 | } else if (c == '\t') { |
950 | unsigned int num_chars = 0; | 950 | unsigned int num_chars = 0; |
951 | int after_tab = 0; | 951 | int after_tab = 0; |
952 | unsigned long tail = tty->read_head; | 952 | unsigned long tail = tty->read_head; |
953 | 953 | ||
954 | /* | 954 | /* |
955 | * Count the columns used for characters | 955 | * Count the columns used for characters |
956 | * since the start of input or after a | 956 | * since the start of input or after a |
957 | * previous tab. | 957 | * previous tab. |
958 | * This info is used to go back the correct | 958 | * This info is used to go back the correct |
959 | * number of columns. | 959 | * number of columns. |
960 | */ | 960 | */ |
961 | while (tail != tty->canon_head) { | 961 | while (tail != tty->canon_head) { |
962 | tail = (tail-1) & (N_TTY_BUF_SIZE-1); | 962 | tail = (tail-1) & (N_TTY_BUF_SIZE-1); |
963 | c = tty->read_buf[tail]; | 963 | c = tty->read_buf[tail]; |
964 | if (c == '\t') { | 964 | if (c == '\t') { |
965 | after_tab = 1; | 965 | after_tab = 1; |
966 | break; | 966 | break; |
967 | } else if (iscntrl(c)) { | 967 | } else if (iscntrl(c)) { |
968 | if (L_ECHOCTL(tty)) | 968 | if (L_ECHOCTL(tty)) |
969 | num_chars += 2; | 969 | num_chars += 2; |
970 | } else if (!is_continuation(c, tty)) { | 970 | } else if (!is_continuation(c, tty)) { |
971 | num_chars++; | 971 | num_chars++; |
972 | } | 972 | } |
973 | } | 973 | } |
974 | echo_erase_tab(num_chars, after_tab, tty); | 974 | echo_erase_tab(num_chars, after_tab, tty); |
975 | } else { | 975 | } else { |
976 | if (iscntrl(c) && L_ECHOCTL(tty)) { | 976 | if (iscntrl(c) && L_ECHOCTL(tty)) { |
977 | echo_char_raw('\b', tty); | 977 | echo_char_raw('\b', tty); |
978 | echo_char_raw(' ', tty); | 978 | echo_char_raw(' ', tty); |
979 | echo_char_raw('\b', tty); | 979 | echo_char_raw('\b', tty); |
980 | } | 980 | } |
981 | if (!iscntrl(c) || L_ECHOCTL(tty)) { | 981 | if (!iscntrl(c) || L_ECHOCTL(tty)) { |
982 | echo_char_raw('\b', tty); | 982 | echo_char_raw('\b', tty); |
983 | echo_char_raw(' ', tty); | 983 | echo_char_raw(' ', tty); |
984 | echo_char_raw('\b', tty); | 984 | echo_char_raw('\b', tty); |
985 | } | 985 | } |
986 | } | 986 | } |
987 | } | 987 | } |
988 | if (kill_type == ERASE) | 988 | if (kill_type == ERASE) |
989 | break; | 989 | break; |
990 | } | 990 | } |
991 | if (tty->read_head == tty->canon_head && L_ECHO(tty)) | 991 | if (tty->read_head == tty->canon_head && L_ECHO(tty)) |
992 | finish_erasing(tty); | 992 | finish_erasing(tty); |
993 | } | 993 | } |
994 | 994 | ||
995 | /** | 995 | /** |
996 | * isig - handle the ISIG optio | 996 | * isig - handle the ISIG optio |
997 | * @sig: signal | 997 | * @sig: signal |
998 | * @tty: terminal | 998 | * @tty: terminal |
999 | * @flush: force flush | 999 | * @flush: force flush |
1000 | * | 1000 | * |
1001 | * Called when a signal is being sent due to terminal input. This | 1001 | * Called when a signal is being sent due to terminal input. This |
1002 | * may caus terminal flushing to take place according to the termios | 1002 | * may caus terminal flushing to take place according to the termios |
1003 | * settings and character used. Called from the driver receive_buf | 1003 | * settings and character used. Called from the driver receive_buf |
1004 | * path so serialized. | 1004 | * path so serialized. |
1005 | * | 1005 | * |
1006 | * Locking: ctrl_lock, read_lock (both via flush buffer) | 1006 | * Locking: ctrl_lock, read_lock (both via flush buffer) |
1007 | */ | 1007 | */ |
1008 | 1008 | ||
1009 | static inline void isig(int sig, struct tty_struct *tty, int flush) | 1009 | static inline void isig(int sig, struct tty_struct *tty, int flush) |
1010 | { | 1010 | { |
1011 | if (tty->pgrp) | 1011 | if (tty->pgrp) |
1012 | kill_pgrp(tty->pgrp, sig, 1); | 1012 | kill_pgrp(tty->pgrp, sig, 1); |
1013 | if (flush || !L_NOFLSH(tty)) { | 1013 | if (flush || !L_NOFLSH(tty)) { |
1014 | n_tty_flush_buffer(tty); | 1014 | n_tty_flush_buffer(tty); |
1015 | tty_driver_flush_buffer(tty); | 1015 | tty_driver_flush_buffer(tty); |
1016 | } | 1016 | } |
1017 | } | 1017 | } |
1018 | 1018 | ||
1019 | /** | 1019 | /** |
1020 | * n_tty_receive_break - handle break | 1020 | * n_tty_receive_break - handle break |
1021 | * @tty: terminal | 1021 | * @tty: terminal |
1022 | * | 1022 | * |
1023 | * An RS232 break event has been hit in the incoming bitstream. This | 1023 | * An RS232 break event has been hit in the incoming bitstream. This |
1024 | * can cause a variety of events depending upon the termios settings. | 1024 | * can cause a variety of events depending upon the termios settings. |
1025 | * | 1025 | * |
1026 | * Called from the receive_buf path so single threaded. | 1026 | * Called from the receive_buf path so single threaded. |
1027 | */ | 1027 | */ |
1028 | 1028 | ||
1029 | static inline void n_tty_receive_break(struct tty_struct *tty) | 1029 | static inline void n_tty_receive_break(struct tty_struct *tty) |
1030 | { | 1030 | { |
1031 | if (I_IGNBRK(tty)) | 1031 | if (I_IGNBRK(tty)) |
1032 | return; | 1032 | return; |
1033 | if (I_BRKINT(tty)) { | 1033 | if (I_BRKINT(tty)) { |
1034 | isig(SIGINT, tty, 1); | 1034 | isig(SIGINT, tty, 1); |
1035 | return; | 1035 | return; |
1036 | } | 1036 | } |
1037 | if (I_PARMRK(tty)) { | 1037 | if (I_PARMRK(tty)) { |
1038 | put_tty_queue('\377', tty); | 1038 | put_tty_queue('\377', tty); |
1039 | put_tty_queue('\0', tty); | 1039 | put_tty_queue('\0', tty); |
1040 | } | 1040 | } |
1041 | put_tty_queue('\0', tty); | 1041 | put_tty_queue('\0', tty); |
1042 | wake_up_interruptible(&tty->read_wait); | 1042 | wake_up_interruptible(&tty->read_wait); |
1043 | } | 1043 | } |
1044 | 1044 | ||
1045 | /** | 1045 | /** |
1046 | * n_tty_receive_overrun - handle overrun reporting | 1046 | * n_tty_receive_overrun - handle overrun reporting |
1047 | * @tty: terminal | 1047 | * @tty: terminal |
1048 | * | 1048 | * |
1049 | * Data arrived faster than we could process it. While the tty | 1049 | * Data arrived faster than we could process it. While the tty |
1050 | * driver has flagged this the bits that were missed are gone | 1050 | * driver has flagged this the bits that were missed are gone |
1051 | * forever. | 1051 | * forever. |
1052 | * | 1052 | * |
1053 | * Called from the receive_buf path so single threaded. Does not | 1053 | * Called from the receive_buf path so single threaded. Does not |
1054 | * need locking as num_overrun and overrun_time are function | 1054 | * need locking as num_overrun and overrun_time are function |
1055 | * private. | 1055 | * private. |
1056 | */ | 1056 | */ |
1057 | 1057 | ||
1058 | static inline void n_tty_receive_overrun(struct tty_struct *tty) | 1058 | static inline void n_tty_receive_overrun(struct tty_struct *tty) |
1059 | { | 1059 | { |
1060 | char buf[64]; | 1060 | char buf[64]; |
1061 | 1061 | ||
1062 | tty->num_overrun++; | 1062 | tty->num_overrun++; |
1063 | if (time_before(tty->overrun_time, jiffies - HZ) || | 1063 | if (time_before(tty->overrun_time, jiffies - HZ) || |
1064 | time_after(tty->overrun_time, jiffies)) { | 1064 | time_after(tty->overrun_time, jiffies)) { |
1065 | printk(KERN_WARNING "%s: %d input overrun(s)\n", | 1065 | printk(KERN_WARNING "%s: %d input overrun(s)\n", |
1066 | tty_name(tty, buf), | 1066 | tty_name(tty, buf), |
1067 | tty->num_overrun); | 1067 | tty->num_overrun); |
1068 | tty->overrun_time = jiffies; | 1068 | tty->overrun_time = jiffies; |
1069 | tty->num_overrun = 0; | 1069 | tty->num_overrun = 0; |
1070 | } | 1070 | } |
1071 | } | 1071 | } |
1072 | 1072 | ||
1073 | /** | 1073 | /** |
1074 | * n_tty_receive_parity_error - error notifier | 1074 | * n_tty_receive_parity_error - error notifier |
1075 | * @tty: terminal device | 1075 | * @tty: terminal device |
1076 | * @c: character | 1076 | * @c: character |
1077 | * | 1077 | * |
1078 | * Process a parity error and queue the right data to indicate | 1078 | * Process a parity error and queue the right data to indicate |
1079 | * the error case if necessary. Locking as per n_tty_receive_buf. | 1079 | * the error case if necessary. Locking as per n_tty_receive_buf. |
1080 | */ | 1080 | */ |
1081 | static inline void n_tty_receive_parity_error(struct tty_struct *tty, | 1081 | static inline void n_tty_receive_parity_error(struct tty_struct *tty, |
1082 | unsigned char c) | 1082 | unsigned char c) |
1083 | { | 1083 | { |
1084 | if (I_IGNPAR(tty)) | 1084 | if (I_IGNPAR(tty)) |
1085 | return; | 1085 | return; |
1086 | if (I_PARMRK(tty)) { | 1086 | if (I_PARMRK(tty)) { |
1087 | put_tty_queue('\377', tty); | 1087 | put_tty_queue('\377', tty); |
1088 | put_tty_queue('\0', tty); | 1088 | put_tty_queue('\0', tty); |
1089 | put_tty_queue(c, tty); | 1089 | put_tty_queue(c, tty); |
1090 | } else if (I_INPCK(tty)) | 1090 | } else if (I_INPCK(tty)) |
1091 | put_tty_queue('\0', tty); | 1091 | put_tty_queue('\0', tty); |
1092 | else | 1092 | else |
1093 | put_tty_queue(c, tty); | 1093 | put_tty_queue(c, tty); |
1094 | wake_up_interruptible(&tty->read_wait); | 1094 | wake_up_interruptible(&tty->read_wait); |
1095 | } | 1095 | } |
1096 | 1096 | ||
1097 | /** | 1097 | /** |
1098 | * n_tty_receive_char - perform processing | 1098 | * n_tty_receive_char - perform processing |
1099 | * @tty: terminal device | 1099 | * @tty: terminal device |
1100 | * @c: character | 1100 | * @c: character |
1101 | * | 1101 | * |
1102 | * Process an individual character of input received from the driver. | 1102 | * Process an individual character of input received from the driver. |
1103 | * This is serialized with respect to itself by the rules for the | 1103 | * This is serialized with respect to itself by the rules for the |
1104 | * driver above. | 1104 | * driver above. |
1105 | */ | 1105 | */ |
1106 | 1106 | ||
1107 | static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c) | 1107 | static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c) |
1108 | { | 1108 | { |
1109 | unsigned long flags; | 1109 | unsigned long flags; |
1110 | int parmrk; | 1110 | int parmrk; |
1111 | 1111 | ||
1112 | if (tty->raw) { | 1112 | if (tty->raw) { |
1113 | put_tty_queue(c, tty); | 1113 | put_tty_queue(c, tty); |
1114 | return; | 1114 | return; |
1115 | } | 1115 | } |
1116 | 1116 | ||
1117 | if (I_ISTRIP(tty)) | 1117 | if (I_ISTRIP(tty)) |
1118 | c &= 0x7f; | 1118 | c &= 0x7f; |
1119 | if (I_IUCLC(tty) && L_IEXTEN(tty)) | 1119 | if (I_IUCLC(tty) && L_IEXTEN(tty)) |
1120 | c = tolower(c); | 1120 | c = tolower(c); |
1121 | 1121 | ||
1122 | if (tty->stopped && !tty->flow_stopped && I_IXON(tty) && | 1122 | if (tty->stopped && !tty->flow_stopped && I_IXON(tty) && |
1123 | I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) && | 1123 | I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) && |
1124 | c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) { | 1124 | c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) { |
1125 | start_tty(tty); | 1125 | start_tty(tty); |
1126 | process_echoes(tty); | 1126 | process_echoes(tty); |
1127 | } | 1127 | } |
1128 | 1128 | ||
1129 | if (tty->closing) { | 1129 | if (tty->closing) { |
1130 | if (I_IXON(tty)) { | 1130 | if (I_IXON(tty)) { |
1131 | if (c == START_CHAR(tty)) { | 1131 | if (c == START_CHAR(tty)) { |
1132 | start_tty(tty); | 1132 | start_tty(tty); |
1133 | process_echoes(tty); | 1133 | process_echoes(tty); |
1134 | } else if (c == STOP_CHAR(tty)) | 1134 | } else if (c == STOP_CHAR(tty)) |
1135 | stop_tty(tty); | 1135 | stop_tty(tty); |
1136 | } | 1136 | } |
1137 | return; | 1137 | return; |
1138 | } | 1138 | } |
1139 | 1139 | ||
1140 | /* | 1140 | /* |
1141 | * If the previous character was LNEXT, or we know that this | 1141 | * If the previous character was LNEXT, or we know that this |
1142 | * character is not one of the characters that we'll have to | 1142 | * character is not one of the characters that we'll have to |
1143 | * handle specially, do shortcut processing to speed things | 1143 | * handle specially, do shortcut processing to speed things |
1144 | * up. | 1144 | * up. |
1145 | */ | 1145 | */ |
1146 | if (!test_bit(c, tty->process_char_map) || tty->lnext) { | 1146 | if (!test_bit(c, tty->process_char_map) || tty->lnext) { |
1147 | tty->lnext = 0; | 1147 | tty->lnext = 0; |
1148 | parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0; | 1148 | parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0; |
1149 | if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) { | 1149 | if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) { |
1150 | /* beep if no space */ | 1150 | /* beep if no space */ |
1151 | if (L_ECHO(tty)) | 1151 | if (L_ECHO(tty)) |
1152 | process_output('\a', tty); | 1152 | process_output('\a', tty); |
1153 | return; | 1153 | return; |
1154 | } | 1154 | } |
1155 | if (L_ECHO(tty)) { | 1155 | if (L_ECHO(tty)) { |
1156 | finish_erasing(tty); | 1156 | finish_erasing(tty); |
1157 | /* Record the column of first canon char. */ | 1157 | /* Record the column of first canon char. */ |
1158 | if (tty->canon_head == tty->read_head) | 1158 | if (tty->canon_head == tty->read_head) |
1159 | echo_set_canon_col(tty); | 1159 | echo_set_canon_col(tty); |
1160 | echo_char(c, tty); | 1160 | echo_char(c, tty); |
1161 | process_echoes(tty); | 1161 | process_echoes(tty); |
1162 | } | 1162 | } |
1163 | if (parmrk) | 1163 | if (parmrk) |
1164 | put_tty_queue(c, tty); | 1164 | put_tty_queue(c, tty); |
1165 | put_tty_queue(c, tty); | 1165 | put_tty_queue(c, tty); |
1166 | return; | 1166 | return; |
1167 | } | 1167 | } |
1168 | 1168 | ||
1169 | if (I_IXON(tty)) { | 1169 | if (I_IXON(tty)) { |
1170 | if (c == START_CHAR(tty)) { | 1170 | if (c == START_CHAR(tty)) { |
1171 | start_tty(tty); | 1171 | start_tty(tty); |
1172 | process_echoes(tty); | 1172 | process_echoes(tty); |
1173 | return; | 1173 | return; |
1174 | } | 1174 | } |
1175 | if (c == STOP_CHAR(tty)) { | 1175 | if (c == STOP_CHAR(tty)) { |
1176 | stop_tty(tty); | 1176 | stop_tty(tty); |
1177 | return; | 1177 | return; |
1178 | } | 1178 | } |
1179 | } | 1179 | } |
1180 | 1180 | ||
1181 | if (L_ISIG(tty)) { | 1181 | if (L_ISIG(tty)) { |
1182 | int signal; | 1182 | int signal; |
1183 | signal = SIGINT; | 1183 | signal = SIGINT; |
1184 | if (c == INTR_CHAR(tty)) | 1184 | if (c == INTR_CHAR(tty)) |
1185 | goto send_signal; | 1185 | goto send_signal; |
1186 | signal = SIGQUIT; | 1186 | signal = SIGQUIT; |
1187 | if (c == QUIT_CHAR(tty)) | 1187 | if (c == QUIT_CHAR(tty)) |
1188 | goto send_signal; | 1188 | goto send_signal; |
1189 | signal = SIGTSTP; | 1189 | signal = SIGTSTP; |
1190 | if (c == SUSP_CHAR(tty)) { | 1190 | if (c == SUSP_CHAR(tty)) { |
1191 | send_signal: | 1191 | send_signal: |
1192 | /* | 1192 | /* |
1193 | * Note that we do not use isig() here because we want | 1193 | * Note that we do not use isig() here because we want |
1194 | * the order to be: | 1194 | * the order to be: |
1195 | * 1) flush, 2) echo, 3) signal | 1195 | * 1) flush, 2) echo, 3) signal |
1196 | */ | 1196 | */ |
1197 | if (!L_NOFLSH(tty)) { | 1197 | if (!L_NOFLSH(tty)) { |
1198 | n_tty_flush_buffer(tty); | 1198 | n_tty_flush_buffer(tty); |
1199 | tty_driver_flush_buffer(tty); | 1199 | tty_driver_flush_buffer(tty); |
1200 | } | 1200 | } |
1201 | if (I_IXON(tty)) | 1201 | if (I_IXON(tty)) |
1202 | start_tty(tty); | 1202 | start_tty(tty); |
1203 | if (L_ECHO(tty)) { | 1203 | if (L_ECHO(tty)) { |
1204 | echo_char(c, tty); | 1204 | echo_char(c, tty); |
1205 | process_echoes(tty); | 1205 | process_echoes(tty); |
1206 | } | 1206 | } |
1207 | if (tty->pgrp) | 1207 | if (tty->pgrp) |
1208 | kill_pgrp(tty->pgrp, signal, 1); | 1208 | kill_pgrp(tty->pgrp, signal, 1); |
1209 | return; | 1209 | return; |
1210 | } | 1210 | } |
1211 | } | 1211 | } |
1212 | 1212 | ||
1213 | if (c == '\r') { | 1213 | if (c == '\r') { |
1214 | if (I_IGNCR(tty)) | 1214 | if (I_IGNCR(tty)) |
1215 | return; | 1215 | return; |
1216 | if (I_ICRNL(tty)) | 1216 | if (I_ICRNL(tty)) |
1217 | c = '\n'; | 1217 | c = '\n'; |
1218 | } else if (c == '\n' && I_INLCR(tty)) | 1218 | } else if (c == '\n' && I_INLCR(tty)) |
1219 | c = '\r'; | 1219 | c = '\r'; |
1220 | 1220 | ||
1221 | if (tty->icanon) { | 1221 | if (tty->icanon) { |
1222 | if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) || | 1222 | if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) || |
1223 | (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) { | 1223 | (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) { |
1224 | eraser(c, tty); | 1224 | eraser(c, tty); |
1225 | process_echoes(tty); | 1225 | process_echoes(tty); |
1226 | return; | 1226 | return; |
1227 | } | 1227 | } |
1228 | if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) { | 1228 | if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) { |
1229 | tty->lnext = 1; | 1229 | tty->lnext = 1; |
1230 | if (L_ECHO(tty)) { | 1230 | if (L_ECHO(tty)) { |
1231 | finish_erasing(tty); | 1231 | finish_erasing(tty); |
1232 | if (L_ECHOCTL(tty)) { | 1232 | if (L_ECHOCTL(tty)) { |
1233 | echo_char_raw('^', tty); | 1233 | echo_char_raw('^', tty); |
1234 | echo_char_raw('\b', tty); | 1234 | echo_char_raw('\b', tty); |
1235 | process_echoes(tty); | 1235 | process_echoes(tty); |
1236 | } | 1236 | } |
1237 | } | 1237 | } |
1238 | return; | 1238 | return; |
1239 | } | 1239 | } |
1240 | if (c == REPRINT_CHAR(tty) && L_ECHO(tty) && | 1240 | if (c == REPRINT_CHAR(tty) && L_ECHO(tty) && |
1241 | L_IEXTEN(tty)) { | 1241 | L_IEXTEN(tty)) { |
1242 | unsigned long tail = tty->canon_head; | 1242 | unsigned long tail = tty->canon_head; |
1243 | 1243 | ||
1244 | finish_erasing(tty); | 1244 | finish_erasing(tty); |
1245 | echo_char(c, tty); | 1245 | echo_char(c, tty); |
1246 | echo_char_raw('\n', tty); | 1246 | echo_char_raw('\n', tty); |
1247 | while (tail != tty->read_head) { | 1247 | while (tail != tty->read_head) { |
1248 | echo_char(tty->read_buf[tail], tty); | 1248 | echo_char(tty->read_buf[tail], tty); |
1249 | tail = (tail+1) & (N_TTY_BUF_SIZE-1); | 1249 | tail = (tail+1) & (N_TTY_BUF_SIZE-1); |
1250 | } | 1250 | } |
1251 | process_echoes(tty); | 1251 | process_echoes(tty); |
1252 | return; | 1252 | return; |
1253 | } | 1253 | } |
1254 | if (c == '\n') { | 1254 | if (c == '\n') { |
1255 | if (tty->read_cnt >= N_TTY_BUF_SIZE) { | 1255 | if (tty->read_cnt >= N_TTY_BUF_SIZE) { |
1256 | if (L_ECHO(tty)) | 1256 | if (L_ECHO(tty)) |
1257 | process_output('\a', tty); | 1257 | process_output('\a', tty); |
1258 | return; | 1258 | return; |
1259 | } | 1259 | } |
1260 | if (L_ECHO(tty) || L_ECHONL(tty)) { | 1260 | if (L_ECHO(tty) || L_ECHONL(tty)) { |
1261 | echo_char_raw('\n', tty); | 1261 | echo_char_raw('\n', tty); |
1262 | process_echoes(tty); | 1262 | process_echoes(tty); |
1263 | } | 1263 | } |
1264 | goto handle_newline; | 1264 | goto handle_newline; |
1265 | } | 1265 | } |
1266 | if (c == EOF_CHAR(tty)) { | 1266 | if (c == EOF_CHAR(tty)) { |
1267 | if (tty->read_cnt >= N_TTY_BUF_SIZE) | 1267 | if (tty->read_cnt >= N_TTY_BUF_SIZE) |
1268 | return; | 1268 | return; |
1269 | if (tty->canon_head != tty->read_head) | 1269 | if (tty->canon_head != tty->read_head) |
1270 | set_bit(TTY_PUSH, &tty->flags); | 1270 | set_bit(TTY_PUSH, &tty->flags); |
1271 | c = __DISABLED_CHAR; | 1271 | c = __DISABLED_CHAR; |
1272 | goto handle_newline; | 1272 | goto handle_newline; |
1273 | } | 1273 | } |
1274 | if ((c == EOL_CHAR(tty)) || | 1274 | if ((c == EOL_CHAR(tty)) || |
1275 | (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) { | 1275 | (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) { |
1276 | parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) | 1276 | parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) |
1277 | ? 1 : 0; | 1277 | ? 1 : 0; |
1278 | if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk)) { | 1278 | if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk)) { |
1279 | if (L_ECHO(tty)) | 1279 | if (L_ECHO(tty)) |
1280 | process_output('\a', tty); | 1280 | process_output('\a', tty); |
1281 | return; | 1281 | return; |
1282 | } | 1282 | } |
1283 | /* | 1283 | /* |
1284 | * XXX are EOL_CHAR and EOL2_CHAR echoed?!? | 1284 | * XXX are EOL_CHAR and EOL2_CHAR echoed?!? |
1285 | */ | 1285 | */ |
1286 | if (L_ECHO(tty)) { | 1286 | if (L_ECHO(tty)) { |
1287 | /* Record the column of first canon char. */ | 1287 | /* Record the column of first canon char. */ |
1288 | if (tty->canon_head == tty->read_head) | 1288 | if (tty->canon_head == tty->read_head) |
1289 | echo_set_canon_col(tty); | 1289 | echo_set_canon_col(tty); |
1290 | echo_char(c, tty); | 1290 | echo_char(c, tty); |
1291 | process_echoes(tty); | 1291 | process_echoes(tty); |
1292 | } | 1292 | } |
1293 | /* | 1293 | /* |
1294 | * XXX does PARMRK doubling happen for | 1294 | * XXX does PARMRK doubling happen for |
1295 | * EOL_CHAR and EOL2_CHAR? | 1295 | * EOL_CHAR and EOL2_CHAR? |
1296 | */ | 1296 | */ |
1297 | if (parmrk) | 1297 | if (parmrk) |
1298 | put_tty_queue(c, tty); | 1298 | put_tty_queue(c, tty); |
1299 | 1299 | ||
1300 | handle_newline: | 1300 | handle_newline: |
1301 | spin_lock_irqsave(&tty->read_lock, flags); | 1301 | spin_lock_irqsave(&tty->read_lock, flags); |
1302 | set_bit(tty->read_head, tty->read_flags); | 1302 | set_bit(tty->read_head, tty->read_flags); |
1303 | put_tty_queue_nolock(c, tty); | 1303 | put_tty_queue_nolock(c, tty); |
1304 | tty->canon_head = tty->read_head; | 1304 | tty->canon_head = tty->read_head; |
1305 | tty->canon_data++; | 1305 | tty->canon_data++; |
1306 | spin_unlock_irqrestore(&tty->read_lock, flags); | 1306 | spin_unlock_irqrestore(&tty->read_lock, flags); |
1307 | kill_fasync(&tty->fasync, SIGIO, POLL_IN); | 1307 | kill_fasync(&tty->fasync, SIGIO, POLL_IN); |
1308 | if (waitqueue_active(&tty->read_wait)) | 1308 | if (waitqueue_active(&tty->read_wait)) |
1309 | wake_up_interruptible(&tty->read_wait); | 1309 | wake_up_interruptible(&tty->read_wait); |
1310 | return; | 1310 | return; |
1311 | } | 1311 | } |
1312 | } | 1312 | } |
1313 | 1313 | ||
1314 | parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0; | 1314 | parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0; |
1315 | if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) { | 1315 | if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) { |
1316 | /* beep if no space */ | 1316 | /* beep if no space */ |
1317 | if (L_ECHO(tty)) | 1317 | if (L_ECHO(tty)) |
1318 | process_output('\a', tty); | 1318 | process_output('\a', tty); |
1319 | return; | 1319 | return; |
1320 | } | 1320 | } |
1321 | if (L_ECHO(tty)) { | 1321 | if (L_ECHO(tty)) { |
1322 | finish_erasing(tty); | 1322 | finish_erasing(tty); |
1323 | if (c == '\n') | 1323 | if (c == '\n') |
1324 | echo_char_raw('\n', tty); | 1324 | echo_char_raw('\n', tty); |
1325 | else { | 1325 | else { |
1326 | /* Record the column of first canon char. */ | 1326 | /* Record the column of first canon char. */ |
1327 | if (tty->canon_head == tty->read_head) | 1327 | if (tty->canon_head == tty->read_head) |
1328 | echo_set_canon_col(tty); | 1328 | echo_set_canon_col(tty); |
1329 | echo_char(c, tty); | 1329 | echo_char(c, tty); |
1330 | } | 1330 | } |
1331 | process_echoes(tty); | 1331 | process_echoes(tty); |
1332 | } | 1332 | } |
1333 | 1333 | ||
1334 | if (parmrk) | 1334 | if (parmrk) |
1335 | put_tty_queue(c, tty); | 1335 | put_tty_queue(c, tty); |
1336 | 1336 | ||
1337 | put_tty_queue(c, tty); | 1337 | put_tty_queue(c, tty); |
1338 | } | 1338 | } |
1339 | 1339 | ||
1340 | 1340 | ||
1341 | /** | 1341 | /** |
1342 | * n_tty_write_wakeup - asynchronous I/O notifier | 1342 | * n_tty_write_wakeup - asynchronous I/O notifier |
1343 | * @tty: tty device | 1343 | * @tty: tty device |
1344 | * | 1344 | * |
1345 | * Required for the ptys, serial driver etc. since processes | 1345 | * Required for the ptys, serial driver etc. since processes |
1346 | * that attach themselves to the master and rely on ASYNC | 1346 | * that attach themselves to the master and rely on ASYNC |
1347 | * IO must be woken up | 1347 | * IO must be woken up |
1348 | */ | 1348 | */ |
1349 | 1349 | ||
1350 | static void n_tty_write_wakeup(struct tty_struct *tty) | 1350 | static void n_tty_write_wakeup(struct tty_struct *tty) |
1351 | { | 1351 | { |
1352 | /* Write out any echoed characters that are still pending */ | 1352 | /* Write out any echoed characters that are still pending */ |
1353 | process_echoes(tty); | 1353 | process_echoes(tty); |
1354 | 1354 | ||
1355 | if (tty->fasync) { | 1355 | if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) |
1356 | set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); | ||
1357 | kill_fasync(&tty->fasync, SIGIO, POLL_OUT); | 1356 | kill_fasync(&tty->fasync, SIGIO, POLL_OUT); |
1358 | } | ||
1359 | } | 1357 | } |
1360 | 1358 | ||
1361 | /** | 1359 | /** |
1362 | * n_tty_receive_buf - data receive | 1360 | * n_tty_receive_buf - data receive |
1363 | * @tty: terminal device | 1361 | * @tty: terminal device |
1364 | * @cp: buffer | 1362 | * @cp: buffer |
1365 | * @fp: flag buffer | 1363 | * @fp: flag buffer |
1366 | * @count: characters | 1364 | * @count: characters |
1367 | * | 1365 | * |
1368 | * Called by the terminal driver when a block of characters has | 1366 | * Called by the terminal driver when a block of characters has |
1369 | * been received. This function must be called from soft contexts | 1367 | * been received. This function must be called from soft contexts |
1370 | * not from interrupt context. The driver is responsible for making | 1368 | * not from interrupt context. The driver is responsible for making |
1371 | * calls one at a time and in order (or using flush_to_ldisc) | 1369 | * calls one at a time and in order (or using flush_to_ldisc) |
1372 | */ | 1370 | */ |
1373 | 1371 | ||
1374 | static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, | 1372 | static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, |
1375 | char *fp, int count) | 1373 | char *fp, int count) |
1376 | { | 1374 | { |
1377 | const unsigned char *p; | 1375 | const unsigned char *p; |
1378 | char *f, flags = TTY_NORMAL; | 1376 | char *f, flags = TTY_NORMAL; |
1379 | int i; | 1377 | int i; |
1380 | char buf[64]; | 1378 | char buf[64]; |
1381 | unsigned long cpuflags; | 1379 | unsigned long cpuflags; |
1382 | 1380 | ||
1383 | if (!tty->read_buf) | 1381 | if (!tty->read_buf) |
1384 | return; | 1382 | return; |
1385 | 1383 | ||
1386 | if (tty->real_raw) { | 1384 | if (tty->real_raw) { |
1387 | spin_lock_irqsave(&tty->read_lock, cpuflags); | 1385 | spin_lock_irqsave(&tty->read_lock, cpuflags); |
1388 | i = min(N_TTY_BUF_SIZE - tty->read_cnt, | 1386 | i = min(N_TTY_BUF_SIZE - tty->read_cnt, |
1389 | N_TTY_BUF_SIZE - tty->read_head); | 1387 | N_TTY_BUF_SIZE - tty->read_head); |
1390 | i = min(count, i); | 1388 | i = min(count, i); |
1391 | memcpy(tty->read_buf + tty->read_head, cp, i); | 1389 | memcpy(tty->read_buf + tty->read_head, cp, i); |
1392 | tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1); | 1390 | tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1); |
1393 | tty->read_cnt += i; | 1391 | tty->read_cnt += i; |
1394 | cp += i; | 1392 | cp += i; |
1395 | count -= i; | 1393 | count -= i; |
1396 | 1394 | ||
1397 | i = min(N_TTY_BUF_SIZE - tty->read_cnt, | 1395 | i = min(N_TTY_BUF_SIZE - tty->read_cnt, |
1398 | N_TTY_BUF_SIZE - tty->read_head); | 1396 | N_TTY_BUF_SIZE - tty->read_head); |
1399 | i = min(count, i); | 1397 | i = min(count, i); |
1400 | memcpy(tty->read_buf + tty->read_head, cp, i); | 1398 | memcpy(tty->read_buf + tty->read_head, cp, i); |
1401 | tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1); | 1399 | tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1); |
1402 | tty->read_cnt += i; | 1400 | tty->read_cnt += i; |
1403 | spin_unlock_irqrestore(&tty->read_lock, cpuflags); | 1401 | spin_unlock_irqrestore(&tty->read_lock, cpuflags); |
1404 | } else { | 1402 | } else { |
1405 | for (i = count, p = cp, f = fp; i; i--, p++) { | 1403 | for (i = count, p = cp, f = fp; i; i--, p++) { |
1406 | if (f) | 1404 | if (f) |
1407 | flags = *f++; | 1405 | flags = *f++; |
1408 | switch (flags) { | 1406 | switch (flags) { |
1409 | case TTY_NORMAL: | 1407 | case TTY_NORMAL: |
1410 | n_tty_receive_char(tty, *p); | 1408 | n_tty_receive_char(tty, *p); |
1411 | break; | 1409 | break; |
1412 | case TTY_BREAK: | 1410 | case TTY_BREAK: |
1413 | n_tty_receive_break(tty); | 1411 | n_tty_receive_break(tty); |
1414 | break; | 1412 | break; |
1415 | case TTY_PARITY: | 1413 | case TTY_PARITY: |
1416 | case TTY_FRAME: | 1414 | case TTY_FRAME: |
1417 | n_tty_receive_parity_error(tty, *p); | 1415 | n_tty_receive_parity_error(tty, *p); |
1418 | break; | 1416 | break; |
1419 | case TTY_OVERRUN: | 1417 | case TTY_OVERRUN: |
1420 | n_tty_receive_overrun(tty); | 1418 | n_tty_receive_overrun(tty); |
1421 | break; | 1419 | break; |
1422 | default: | 1420 | default: |
1423 | printk(KERN_ERR "%s: unknown flag %d\n", | 1421 | printk(KERN_ERR "%s: unknown flag %d\n", |
1424 | tty_name(tty, buf), flags); | 1422 | tty_name(tty, buf), flags); |
1425 | break; | 1423 | break; |
1426 | } | 1424 | } |
1427 | } | 1425 | } |
1428 | if (tty->ops->flush_chars) | 1426 | if (tty->ops->flush_chars) |
1429 | tty->ops->flush_chars(tty); | 1427 | tty->ops->flush_chars(tty); |
1430 | } | 1428 | } |
1431 | 1429 | ||
1432 | n_tty_set_room(tty); | 1430 | n_tty_set_room(tty); |
1433 | 1431 | ||
1434 | if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) { | 1432 | if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) { |
1435 | kill_fasync(&tty->fasync, SIGIO, POLL_IN); | 1433 | kill_fasync(&tty->fasync, SIGIO, POLL_IN); |
1436 | if (waitqueue_active(&tty->read_wait)) | 1434 | if (waitqueue_active(&tty->read_wait)) |
1437 | wake_up_interruptible(&tty->read_wait); | 1435 | wake_up_interruptible(&tty->read_wait); |
1438 | } | 1436 | } |
1439 | 1437 | ||
1440 | /* | 1438 | /* |
1441 | * Check the remaining room for the input canonicalization | 1439 | * Check the remaining room for the input canonicalization |
1442 | * mode. We don't want to throttle the driver if we're in | 1440 | * mode. We don't want to throttle the driver if we're in |
1443 | * canonical mode and don't have a newline yet! | 1441 | * canonical mode and don't have a newline yet! |
1444 | */ | 1442 | */ |
1445 | if (tty->receive_room < TTY_THRESHOLD_THROTTLE) | 1443 | if (tty->receive_room < TTY_THRESHOLD_THROTTLE) |
1446 | tty_throttle(tty); | 1444 | tty_throttle(tty); |
1447 | } | 1445 | } |
1448 | 1446 | ||
1449 | int is_ignored(int sig) | 1447 | int is_ignored(int sig) |
1450 | { | 1448 | { |
1451 | return (sigismember(¤t->blocked, sig) || | 1449 | return (sigismember(¤t->blocked, sig) || |
1452 | current->sighand->action[sig-1].sa.sa_handler == SIG_IGN); | 1450 | current->sighand->action[sig-1].sa.sa_handler == SIG_IGN); |
1453 | } | 1451 | } |
1454 | 1452 | ||
1455 | /** | 1453 | /** |
1456 | * n_tty_set_termios - termios data changed | 1454 | * n_tty_set_termios - termios data changed |
1457 | * @tty: terminal | 1455 | * @tty: terminal |
1458 | * @old: previous data | 1456 | * @old: previous data |
1459 | * | 1457 | * |
1460 | * Called by the tty layer when the user changes termios flags so | 1458 | * Called by the tty layer when the user changes termios flags so |
1461 | * that the line discipline can plan ahead. This function cannot sleep | 1459 | * that the line discipline can plan ahead. This function cannot sleep |
1462 | * and is protected from re-entry by the tty layer. The user is | 1460 | * and is protected from re-entry by the tty layer. The user is |
1463 | * guaranteed that this function will not be re-entered or in progress | 1461 | * guaranteed that this function will not be re-entered or in progress |
1464 | * when the ldisc is closed. | 1462 | * when the ldisc is closed. |
1465 | * | 1463 | * |
1466 | * Locking: Caller holds tty->termios_mutex | 1464 | * Locking: Caller holds tty->termios_mutex |
1467 | */ | 1465 | */ |
1468 | 1466 | ||
1469 | static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) | 1467 | static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) |
1470 | { | 1468 | { |
1471 | int canon_change = 1; | 1469 | int canon_change = 1; |
1472 | BUG_ON(!tty); | 1470 | BUG_ON(!tty); |
1473 | 1471 | ||
1474 | if (old) | 1472 | if (old) |
1475 | canon_change = (old->c_lflag ^ tty->termios->c_lflag) & ICANON; | 1473 | canon_change = (old->c_lflag ^ tty->termios->c_lflag) & ICANON; |
1476 | if (canon_change) { | 1474 | if (canon_change) { |
1477 | memset(&tty->read_flags, 0, sizeof tty->read_flags); | 1475 | memset(&tty->read_flags, 0, sizeof tty->read_flags); |
1478 | tty->canon_head = tty->read_tail; | 1476 | tty->canon_head = tty->read_tail; |
1479 | tty->canon_data = 0; | 1477 | tty->canon_data = 0; |
1480 | tty->erasing = 0; | 1478 | tty->erasing = 0; |
1481 | } | 1479 | } |
1482 | 1480 | ||
1483 | if (canon_change && !L_ICANON(tty) && tty->read_cnt) | 1481 | if (canon_change && !L_ICANON(tty) && tty->read_cnt) |
1484 | wake_up_interruptible(&tty->read_wait); | 1482 | wake_up_interruptible(&tty->read_wait); |
1485 | 1483 | ||
1486 | tty->icanon = (L_ICANON(tty) != 0); | 1484 | tty->icanon = (L_ICANON(tty) != 0); |
1487 | if (test_bit(TTY_HW_COOK_IN, &tty->flags)) { | 1485 | if (test_bit(TTY_HW_COOK_IN, &tty->flags)) { |
1488 | tty->raw = 1; | 1486 | tty->raw = 1; |
1489 | tty->real_raw = 1; | 1487 | tty->real_raw = 1; |
1490 | n_tty_set_room(tty); | 1488 | n_tty_set_room(tty); |
1491 | return; | 1489 | return; |
1492 | } | 1490 | } |
1493 | if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) || | 1491 | if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) || |
1494 | I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) || | 1492 | I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) || |
1495 | I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) || | 1493 | I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) || |
1496 | I_PARMRK(tty)) { | 1494 | I_PARMRK(tty)) { |
1497 | memset(tty->process_char_map, 0, 256/8); | 1495 | memset(tty->process_char_map, 0, 256/8); |
1498 | 1496 | ||
1499 | if (I_IGNCR(tty) || I_ICRNL(tty)) | 1497 | if (I_IGNCR(tty) || I_ICRNL(tty)) |
1500 | set_bit('\r', tty->process_char_map); | 1498 | set_bit('\r', tty->process_char_map); |
1501 | if (I_INLCR(tty)) | 1499 | if (I_INLCR(tty)) |
1502 | set_bit('\n', tty->process_char_map); | 1500 | set_bit('\n', tty->process_char_map); |
1503 | 1501 | ||
1504 | if (L_ICANON(tty)) { | 1502 | if (L_ICANON(tty)) { |
1505 | set_bit(ERASE_CHAR(tty), tty->process_char_map); | 1503 | set_bit(ERASE_CHAR(tty), tty->process_char_map); |
1506 | set_bit(KILL_CHAR(tty), tty->process_char_map); | 1504 | set_bit(KILL_CHAR(tty), tty->process_char_map); |
1507 | set_bit(EOF_CHAR(tty), tty->process_char_map); | 1505 | set_bit(EOF_CHAR(tty), tty->process_char_map); |
1508 | set_bit('\n', tty->process_char_map); | 1506 | set_bit('\n', tty->process_char_map); |
1509 | set_bit(EOL_CHAR(tty), tty->process_char_map); | 1507 | set_bit(EOL_CHAR(tty), tty->process_char_map); |
1510 | if (L_IEXTEN(tty)) { | 1508 | if (L_IEXTEN(tty)) { |
1511 | set_bit(WERASE_CHAR(tty), | 1509 | set_bit(WERASE_CHAR(tty), |
1512 | tty->process_char_map); | 1510 | tty->process_char_map); |
1513 | set_bit(LNEXT_CHAR(tty), | 1511 | set_bit(LNEXT_CHAR(tty), |
1514 | tty->process_char_map); | 1512 | tty->process_char_map); |
1515 | set_bit(EOL2_CHAR(tty), | 1513 | set_bit(EOL2_CHAR(tty), |
1516 | tty->process_char_map); | 1514 | tty->process_char_map); |
1517 | if (L_ECHO(tty)) | 1515 | if (L_ECHO(tty)) |
1518 | set_bit(REPRINT_CHAR(tty), | 1516 | set_bit(REPRINT_CHAR(tty), |
1519 | tty->process_char_map); | 1517 | tty->process_char_map); |
1520 | } | 1518 | } |
1521 | } | 1519 | } |
1522 | if (I_IXON(tty)) { | 1520 | if (I_IXON(tty)) { |
1523 | set_bit(START_CHAR(tty), tty->process_char_map); | 1521 | set_bit(START_CHAR(tty), tty->process_char_map); |
1524 | set_bit(STOP_CHAR(tty), tty->process_char_map); | 1522 | set_bit(STOP_CHAR(tty), tty->process_char_map); |
1525 | } | 1523 | } |
1526 | if (L_ISIG(tty)) { | 1524 | if (L_ISIG(tty)) { |
1527 | set_bit(INTR_CHAR(tty), tty->process_char_map); | 1525 | set_bit(INTR_CHAR(tty), tty->process_char_map); |
1528 | set_bit(QUIT_CHAR(tty), tty->process_char_map); | 1526 | set_bit(QUIT_CHAR(tty), tty->process_char_map); |
1529 | set_bit(SUSP_CHAR(tty), tty->process_char_map); | 1527 | set_bit(SUSP_CHAR(tty), tty->process_char_map); |
1530 | } | 1528 | } |
1531 | clear_bit(__DISABLED_CHAR, tty->process_char_map); | 1529 | clear_bit(__DISABLED_CHAR, tty->process_char_map); |
1532 | tty->raw = 0; | 1530 | tty->raw = 0; |
1533 | tty->real_raw = 0; | 1531 | tty->real_raw = 0; |
1534 | } else { | 1532 | } else { |
1535 | tty->raw = 1; | 1533 | tty->raw = 1; |
1536 | if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) && | 1534 | if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) && |
1537 | (I_IGNPAR(tty) || !I_INPCK(tty)) && | 1535 | (I_IGNPAR(tty) || !I_INPCK(tty)) && |
1538 | (tty->driver->flags & TTY_DRIVER_REAL_RAW)) | 1536 | (tty->driver->flags & TTY_DRIVER_REAL_RAW)) |
1539 | tty->real_raw = 1; | 1537 | tty->real_raw = 1; |
1540 | else | 1538 | else |
1541 | tty->real_raw = 0; | 1539 | tty->real_raw = 0; |
1542 | } | 1540 | } |
1543 | n_tty_set_room(tty); | 1541 | n_tty_set_room(tty); |
1544 | /* The termios change make the tty ready for I/O */ | 1542 | /* The termios change make the tty ready for I/O */ |
1545 | wake_up_interruptible(&tty->write_wait); | 1543 | wake_up_interruptible(&tty->write_wait); |
1546 | wake_up_interruptible(&tty->read_wait); | 1544 | wake_up_interruptible(&tty->read_wait); |
1547 | } | 1545 | } |
1548 | 1546 | ||
1549 | /** | 1547 | /** |
1550 | * n_tty_close - close the ldisc for this tty | 1548 | * n_tty_close - close the ldisc for this tty |
1551 | * @tty: device | 1549 | * @tty: device |
1552 | * | 1550 | * |
1553 | * Called from the terminal layer when this line discipline is | 1551 | * Called from the terminal layer when this line discipline is |
1554 | * being shut down, either because of a close or becsuse of a | 1552 | * being shut down, either because of a close or becsuse of a |
1555 | * discipline change. The function will not be called while other | 1553 | * discipline change. The function will not be called while other |
1556 | * ldisc methods are in progress. | 1554 | * ldisc methods are in progress. |
1557 | */ | 1555 | */ |
1558 | 1556 | ||
1559 | static void n_tty_close(struct tty_struct *tty) | 1557 | static void n_tty_close(struct tty_struct *tty) |
1560 | { | 1558 | { |
1561 | n_tty_flush_buffer(tty); | 1559 | n_tty_flush_buffer(tty); |
1562 | if (tty->read_buf) { | 1560 | if (tty->read_buf) { |
1563 | free_buf(tty->read_buf); | 1561 | free_buf(tty->read_buf); |
1564 | tty->read_buf = NULL; | 1562 | tty->read_buf = NULL; |
1565 | } | 1563 | } |
1566 | if (tty->echo_buf) { | 1564 | if (tty->echo_buf) { |
1567 | free_buf(tty->echo_buf); | 1565 | free_buf(tty->echo_buf); |
1568 | tty->echo_buf = NULL; | 1566 | tty->echo_buf = NULL; |
1569 | } | 1567 | } |
1570 | } | 1568 | } |
1571 | 1569 | ||
1572 | /** | 1570 | /** |
1573 | * n_tty_open - open an ldisc | 1571 | * n_tty_open - open an ldisc |
1574 | * @tty: terminal to open | 1572 | * @tty: terminal to open |
1575 | * | 1573 | * |
1576 | * Called when this line discipline is being attached to the | 1574 | * Called when this line discipline is being attached to the |
1577 | * terminal device. Can sleep. Called serialized so that no | 1575 | * terminal device. Can sleep. Called serialized so that no |
1578 | * other events will occur in parallel. No further open will occur | 1576 | * other events will occur in parallel. No further open will occur |
1579 | * until a close. | 1577 | * until a close. |
1580 | */ | 1578 | */ |
1581 | 1579 | ||
1582 | static int n_tty_open(struct tty_struct *tty) | 1580 | static int n_tty_open(struct tty_struct *tty) |
1583 | { | 1581 | { |
1584 | if (!tty) | 1582 | if (!tty) |
1585 | return -EINVAL; | 1583 | return -EINVAL; |
1586 | 1584 | ||
1587 | /* These are ugly. Currently a malloc failure here can panic */ | 1585 | /* These are ugly. Currently a malloc failure here can panic */ |
1588 | if (!tty->read_buf) { | 1586 | if (!tty->read_buf) { |
1589 | tty->read_buf = alloc_buf(); | 1587 | tty->read_buf = alloc_buf(); |
1590 | if (!tty->read_buf) | 1588 | if (!tty->read_buf) |
1591 | return -ENOMEM; | 1589 | return -ENOMEM; |
1592 | } | 1590 | } |
1593 | if (!tty->echo_buf) { | 1591 | if (!tty->echo_buf) { |
1594 | tty->echo_buf = alloc_buf(); | 1592 | tty->echo_buf = alloc_buf(); |
1595 | if (!tty->echo_buf) | 1593 | if (!tty->echo_buf) |
1596 | return -ENOMEM; | 1594 | return -ENOMEM; |
1597 | } | 1595 | } |
1598 | memset(tty->read_buf, 0, N_TTY_BUF_SIZE); | 1596 | memset(tty->read_buf, 0, N_TTY_BUF_SIZE); |
1599 | memset(tty->echo_buf, 0, N_TTY_BUF_SIZE); | 1597 | memset(tty->echo_buf, 0, N_TTY_BUF_SIZE); |
1600 | reset_buffer_flags(tty); | 1598 | reset_buffer_flags(tty); |
1601 | tty->column = 0; | 1599 | tty->column = 0; |
1602 | n_tty_set_termios(tty, NULL); | 1600 | n_tty_set_termios(tty, NULL); |
1603 | tty->minimum_to_wake = 1; | 1601 | tty->minimum_to_wake = 1; |
1604 | tty->closing = 0; | 1602 | tty->closing = 0; |
1605 | return 0; | 1603 | return 0; |
1606 | } | 1604 | } |
1607 | 1605 | ||
1608 | static inline int input_available_p(struct tty_struct *tty, int amt) | 1606 | static inline int input_available_p(struct tty_struct *tty, int amt) |
1609 | { | 1607 | { |
1610 | if (tty->icanon) { | 1608 | if (tty->icanon) { |
1611 | if (tty->canon_data) | 1609 | if (tty->canon_data) |
1612 | return 1; | 1610 | return 1; |
1613 | } else if (tty->read_cnt >= (amt ? amt : 1)) | 1611 | } else if (tty->read_cnt >= (amt ? amt : 1)) |
1614 | return 1; | 1612 | return 1; |
1615 | 1613 | ||
1616 | return 0; | 1614 | return 0; |
1617 | } | 1615 | } |
1618 | 1616 | ||
1619 | /** | 1617 | /** |
1620 | * copy_from_read_buf - copy read data directly | 1618 | * copy_from_read_buf - copy read data directly |
1621 | * @tty: terminal device | 1619 | * @tty: terminal device |
1622 | * @b: user data | 1620 | * @b: user data |
1623 | * @nr: size of data | 1621 | * @nr: size of data |
1624 | * | 1622 | * |
1625 | * Helper function to speed up n_tty_read. It is only called when | 1623 | * Helper function to speed up n_tty_read. It is only called when |
1626 | * ICANON is off; it copies characters straight from the tty queue to | 1624 | * ICANON is off; it copies characters straight from the tty queue to |
1627 | * user space directly. It can be profitably called twice; once to | 1625 | * user space directly. It can be profitably called twice; once to |
1628 | * drain the space from the tail pointer to the (physical) end of the | 1626 | * drain the space from the tail pointer to the (physical) end of the |
1629 | * buffer, and once to drain the space from the (physical) beginning of | 1627 | * buffer, and once to drain the space from the (physical) beginning of |
1630 | * the buffer to head pointer. | 1628 | * the buffer to head pointer. |
1631 | * | 1629 | * |
1632 | * Called under the tty->atomic_read_lock sem | 1630 | * Called under the tty->atomic_read_lock sem |
1633 | * | 1631 | * |
1634 | */ | 1632 | */ |
1635 | 1633 | ||
1636 | static int copy_from_read_buf(struct tty_struct *tty, | 1634 | static int copy_from_read_buf(struct tty_struct *tty, |
1637 | unsigned char __user **b, | 1635 | unsigned char __user **b, |
1638 | size_t *nr) | 1636 | size_t *nr) |
1639 | 1637 | ||
1640 | { | 1638 | { |
1641 | int retval; | 1639 | int retval; |
1642 | size_t n; | 1640 | size_t n; |
1643 | unsigned long flags; | 1641 | unsigned long flags; |
1644 | 1642 | ||
1645 | retval = 0; | 1643 | retval = 0; |
1646 | spin_lock_irqsave(&tty->read_lock, flags); | 1644 | spin_lock_irqsave(&tty->read_lock, flags); |
1647 | n = min(tty->read_cnt, N_TTY_BUF_SIZE - tty->read_tail); | 1645 | n = min(tty->read_cnt, N_TTY_BUF_SIZE - tty->read_tail); |
1648 | n = min(*nr, n); | 1646 | n = min(*nr, n); |
1649 | spin_unlock_irqrestore(&tty->read_lock, flags); | 1647 | spin_unlock_irqrestore(&tty->read_lock, flags); |
1650 | if (n) { | 1648 | if (n) { |
1651 | retval = copy_to_user(*b, &tty->read_buf[tty->read_tail], n); | 1649 | retval = copy_to_user(*b, &tty->read_buf[tty->read_tail], n); |
1652 | n -= retval; | 1650 | n -= retval; |
1653 | tty_audit_add_data(tty, &tty->read_buf[tty->read_tail], n); | 1651 | tty_audit_add_data(tty, &tty->read_buf[tty->read_tail], n); |
1654 | spin_lock_irqsave(&tty->read_lock, flags); | 1652 | spin_lock_irqsave(&tty->read_lock, flags); |
1655 | tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1); | 1653 | tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1); |
1656 | tty->read_cnt -= n; | 1654 | tty->read_cnt -= n; |
1657 | spin_unlock_irqrestore(&tty->read_lock, flags); | 1655 | spin_unlock_irqrestore(&tty->read_lock, flags); |
1658 | *b += n; | 1656 | *b += n; |
1659 | *nr -= n; | 1657 | *nr -= n; |
1660 | } | 1658 | } |
1661 | return retval; | 1659 | return retval; |
1662 | } | 1660 | } |
1663 | 1661 | ||
1664 | extern ssize_t redirected_tty_write(struct file *, const char __user *, | 1662 | extern ssize_t redirected_tty_write(struct file *, const char __user *, |
1665 | size_t, loff_t *); | 1663 | size_t, loff_t *); |
1666 | 1664 | ||
1667 | /** | 1665 | /** |
1668 | * job_control - check job control | 1666 | * job_control - check job control |
1669 | * @tty: tty | 1667 | * @tty: tty |
1670 | * @file: file handle | 1668 | * @file: file handle |
1671 | * | 1669 | * |
1672 | * Perform job control management checks on this file/tty descriptor | 1670 | * Perform job control management checks on this file/tty descriptor |
1673 | * and if appropriate send any needed signals and return a negative | 1671 | * and if appropriate send any needed signals and return a negative |
1674 | * error code if action should be taken. | 1672 | * error code if action should be taken. |
1675 | * | 1673 | * |
1676 | * FIXME: | 1674 | * FIXME: |
1677 | * Locking: None - redirected write test is safe, testing | 1675 | * Locking: None - redirected write test is safe, testing |
1678 | * current->signal should possibly lock current->sighand | 1676 | * current->signal should possibly lock current->sighand |
1679 | * pgrp locking ? | 1677 | * pgrp locking ? |
1680 | */ | 1678 | */ |
1681 | 1679 | ||
1682 | static int job_control(struct tty_struct *tty, struct file *file) | 1680 | static int job_control(struct tty_struct *tty, struct file *file) |
1683 | { | 1681 | { |
1684 | /* Job control check -- must be done at start and after | 1682 | /* Job control check -- must be done at start and after |
1685 | every sleep (POSIX.1 7.1.1.4). */ | 1683 | every sleep (POSIX.1 7.1.1.4). */ |
1686 | /* NOTE: not yet done after every sleep pending a thorough | 1684 | /* NOTE: not yet done after every sleep pending a thorough |
1687 | check of the logic of this change. -- jlc */ | 1685 | check of the logic of this change. -- jlc */ |
1688 | /* don't stop on /dev/console */ | 1686 | /* don't stop on /dev/console */ |
1689 | if (file->f_op->write != redirected_tty_write && | 1687 | if (file->f_op->write != redirected_tty_write && |
1690 | current->signal->tty == tty) { | 1688 | current->signal->tty == tty) { |
1691 | if (!tty->pgrp) | 1689 | if (!tty->pgrp) |
1692 | printk(KERN_ERR "n_tty_read: no tty->pgrp!\n"); | 1690 | printk(KERN_ERR "n_tty_read: no tty->pgrp!\n"); |
1693 | else if (task_pgrp(current) != tty->pgrp) { | 1691 | else if (task_pgrp(current) != tty->pgrp) { |
1694 | if (is_ignored(SIGTTIN) || | 1692 | if (is_ignored(SIGTTIN) || |
1695 | is_current_pgrp_orphaned()) | 1693 | is_current_pgrp_orphaned()) |
1696 | return -EIO; | 1694 | return -EIO; |
1697 | kill_pgrp(task_pgrp(current), SIGTTIN, 1); | 1695 | kill_pgrp(task_pgrp(current), SIGTTIN, 1); |
1698 | set_thread_flag(TIF_SIGPENDING); | 1696 | set_thread_flag(TIF_SIGPENDING); |
1699 | return -ERESTARTSYS; | 1697 | return -ERESTARTSYS; |
1700 | } | 1698 | } |
1701 | } | 1699 | } |
1702 | return 0; | 1700 | return 0; |
1703 | } | 1701 | } |
1704 | 1702 | ||
1705 | 1703 | ||
1706 | /** | 1704 | /** |
1707 | * n_tty_read - read function for tty | 1705 | * n_tty_read - read function for tty |
1708 | * @tty: tty device | 1706 | * @tty: tty device |
1709 | * @file: file object | 1707 | * @file: file object |
1710 | * @buf: userspace buffer pointer | 1708 | * @buf: userspace buffer pointer |
1711 | * @nr: size of I/O | 1709 | * @nr: size of I/O |
1712 | * | 1710 | * |
1713 | * Perform reads for the line discipline. We are guaranteed that the | 1711 | * Perform reads for the line discipline. We are guaranteed that the |
1714 | * line discipline will not be closed under us but we may get multiple | 1712 | * line discipline will not be closed under us but we may get multiple |
1715 | * parallel readers and must handle this ourselves. We may also get | 1713 | * parallel readers and must handle this ourselves. We may also get |
1716 | * a hangup. Always called in user context, may sleep. | 1714 | * a hangup. Always called in user context, may sleep. |
1717 | * | 1715 | * |
1718 | * This code must be sure never to sleep through a hangup. | 1716 | * This code must be sure never to sleep through a hangup. |
1719 | */ | 1717 | */ |
1720 | 1718 | ||
1721 | static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, | 1719 | static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, |
1722 | unsigned char __user *buf, size_t nr) | 1720 | unsigned char __user *buf, size_t nr) |
1723 | { | 1721 | { |
1724 | unsigned char __user *b = buf; | 1722 | unsigned char __user *b = buf; |
1725 | DECLARE_WAITQUEUE(wait, current); | 1723 | DECLARE_WAITQUEUE(wait, current); |
1726 | int c; | 1724 | int c; |
1727 | int minimum, time; | 1725 | int minimum, time; |
1728 | ssize_t retval = 0; | 1726 | ssize_t retval = 0; |
1729 | ssize_t size; | 1727 | ssize_t size; |
1730 | long timeout; | 1728 | long timeout; |
1731 | unsigned long flags; | 1729 | unsigned long flags; |
1732 | int packet; | 1730 | int packet; |
1733 | 1731 | ||
1734 | do_it_again: | 1732 | do_it_again: |
1735 | 1733 | ||
1736 | BUG_ON(!tty->read_buf); | 1734 | BUG_ON(!tty->read_buf); |
1737 | 1735 | ||
1738 | c = job_control(tty, file); | 1736 | c = job_control(tty, file); |
1739 | if (c < 0) | 1737 | if (c < 0) |
1740 | return c; | 1738 | return c; |
1741 | 1739 | ||
1742 | minimum = time = 0; | 1740 | minimum = time = 0; |
1743 | timeout = MAX_SCHEDULE_TIMEOUT; | 1741 | timeout = MAX_SCHEDULE_TIMEOUT; |
1744 | if (!tty->icanon) { | 1742 | if (!tty->icanon) { |
1745 | time = (HZ / 10) * TIME_CHAR(tty); | 1743 | time = (HZ / 10) * TIME_CHAR(tty); |
1746 | minimum = MIN_CHAR(tty); | 1744 | minimum = MIN_CHAR(tty); |
1747 | if (minimum) { | 1745 | if (minimum) { |
1748 | if (time) | 1746 | if (time) |
1749 | tty->minimum_to_wake = 1; | 1747 | tty->minimum_to_wake = 1; |
1750 | else if (!waitqueue_active(&tty->read_wait) || | 1748 | else if (!waitqueue_active(&tty->read_wait) || |
1751 | (tty->minimum_to_wake > minimum)) | 1749 | (tty->minimum_to_wake > minimum)) |
1752 | tty->minimum_to_wake = minimum; | 1750 | tty->minimum_to_wake = minimum; |
1753 | } else { | 1751 | } else { |
1754 | timeout = 0; | 1752 | timeout = 0; |
1755 | if (time) { | 1753 | if (time) { |
1756 | timeout = time; | 1754 | timeout = time; |
1757 | time = 0; | 1755 | time = 0; |
1758 | } | 1756 | } |
1759 | tty->minimum_to_wake = minimum = 1; | 1757 | tty->minimum_to_wake = minimum = 1; |
1760 | } | 1758 | } |
1761 | } | 1759 | } |
1762 | 1760 | ||
1763 | /* | 1761 | /* |
1764 | * Internal serialization of reads. | 1762 | * Internal serialization of reads. |
1765 | */ | 1763 | */ |
1766 | if (file->f_flags & O_NONBLOCK) { | 1764 | if (file->f_flags & O_NONBLOCK) { |
1767 | if (!mutex_trylock(&tty->atomic_read_lock)) | 1765 | if (!mutex_trylock(&tty->atomic_read_lock)) |
1768 | return -EAGAIN; | 1766 | return -EAGAIN; |
1769 | } else { | 1767 | } else { |
1770 | if (mutex_lock_interruptible(&tty->atomic_read_lock)) | 1768 | if (mutex_lock_interruptible(&tty->atomic_read_lock)) |
1771 | return -ERESTARTSYS; | 1769 | return -ERESTARTSYS; |
1772 | } | 1770 | } |
1773 | packet = tty->packet; | 1771 | packet = tty->packet; |
1774 | 1772 | ||
1775 | add_wait_queue(&tty->read_wait, &wait); | 1773 | add_wait_queue(&tty->read_wait, &wait); |
1776 | while (nr) { | 1774 | while (nr) { |
1777 | /* First test for status change. */ | 1775 | /* First test for status change. */ |
1778 | if (packet && tty->link->ctrl_status) { | 1776 | if (packet && tty->link->ctrl_status) { |
1779 | unsigned char cs; | 1777 | unsigned char cs; |
1780 | if (b != buf) | 1778 | if (b != buf) |
1781 | break; | 1779 | break; |
1782 | spin_lock_irqsave(&tty->link->ctrl_lock, flags); | 1780 | spin_lock_irqsave(&tty->link->ctrl_lock, flags); |
1783 | cs = tty->link->ctrl_status; | 1781 | cs = tty->link->ctrl_status; |
1784 | tty->link->ctrl_status = 0; | 1782 | tty->link->ctrl_status = 0; |
1785 | spin_unlock_irqrestore(&tty->link->ctrl_lock, flags); | 1783 | spin_unlock_irqrestore(&tty->link->ctrl_lock, flags); |
1786 | if (tty_put_user(tty, cs, b++)) { | 1784 | if (tty_put_user(tty, cs, b++)) { |
1787 | retval = -EFAULT; | 1785 | retval = -EFAULT; |
1788 | b--; | 1786 | b--; |
1789 | break; | 1787 | break; |
1790 | } | 1788 | } |
1791 | nr--; | 1789 | nr--; |
1792 | break; | 1790 | break; |
1793 | } | 1791 | } |
1794 | /* This statement must be first before checking for input | 1792 | /* This statement must be first before checking for input |
1795 | so that any interrupt will set the state back to | 1793 | so that any interrupt will set the state back to |
1796 | TASK_RUNNING. */ | 1794 | TASK_RUNNING. */ |
1797 | set_current_state(TASK_INTERRUPTIBLE); | 1795 | set_current_state(TASK_INTERRUPTIBLE); |
1798 | 1796 | ||
1799 | if (((minimum - (b - buf)) < tty->minimum_to_wake) && | 1797 | if (((minimum - (b - buf)) < tty->minimum_to_wake) && |
1800 | ((minimum - (b - buf)) >= 1)) | 1798 | ((minimum - (b - buf)) >= 1)) |
1801 | tty->minimum_to_wake = (minimum - (b - buf)); | 1799 | tty->minimum_to_wake = (minimum - (b - buf)); |
1802 | 1800 | ||
1803 | if (!input_available_p(tty, 0)) { | 1801 | if (!input_available_p(tty, 0)) { |
1804 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) { | 1802 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) { |
1805 | retval = -EIO; | 1803 | retval = -EIO; |
1806 | break; | 1804 | break; |
1807 | } | 1805 | } |
1808 | if (tty_hung_up_p(file)) | 1806 | if (tty_hung_up_p(file)) |
1809 | break; | 1807 | break; |
1810 | if (!timeout) | 1808 | if (!timeout) |
1811 | break; | 1809 | break; |
1812 | if (file->f_flags & O_NONBLOCK) { | 1810 | if (file->f_flags & O_NONBLOCK) { |
1813 | retval = -EAGAIN; | 1811 | retval = -EAGAIN; |
1814 | break; | 1812 | break; |
1815 | } | 1813 | } |
1816 | if (signal_pending(current)) { | 1814 | if (signal_pending(current)) { |
1817 | retval = -ERESTARTSYS; | 1815 | retval = -ERESTARTSYS; |
1818 | break; | 1816 | break; |
1819 | } | 1817 | } |
1820 | /* FIXME: does n_tty_set_room need locking ? */ | 1818 | /* FIXME: does n_tty_set_room need locking ? */ |
1821 | n_tty_set_room(tty); | 1819 | n_tty_set_room(tty); |
1822 | timeout = schedule_timeout(timeout); | 1820 | timeout = schedule_timeout(timeout); |
1823 | continue; | 1821 | continue; |
1824 | } | 1822 | } |
1825 | __set_current_state(TASK_RUNNING); | 1823 | __set_current_state(TASK_RUNNING); |
1826 | 1824 | ||
1827 | /* Deal with packet mode. */ | 1825 | /* Deal with packet mode. */ |
1828 | if (packet && b == buf) { | 1826 | if (packet && b == buf) { |
1829 | if (tty_put_user(tty, TIOCPKT_DATA, b++)) { | 1827 | if (tty_put_user(tty, TIOCPKT_DATA, b++)) { |
1830 | retval = -EFAULT; | 1828 | retval = -EFAULT; |
1831 | b--; | 1829 | b--; |
1832 | break; | 1830 | break; |
1833 | } | 1831 | } |
1834 | nr--; | 1832 | nr--; |
1835 | } | 1833 | } |
1836 | 1834 | ||
1837 | if (tty->icanon) { | 1835 | if (tty->icanon) { |
1838 | /* N.B. avoid overrun if nr == 0 */ | 1836 | /* N.B. avoid overrun if nr == 0 */ |
1839 | while (nr && tty->read_cnt) { | 1837 | while (nr && tty->read_cnt) { |
1840 | int eol; | 1838 | int eol; |
1841 | 1839 | ||
1842 | eol = test_and_clear_bit(tty->read_tail, | 1840 | eol = test_and_clear_bit(tty->read_tail, |
1843 | tty->read_flags); | 1841 | tty->read_flags); |
1844 | c = tty->read_buf[tty->read_tail]; | 1842 | c = tty->read_buf[tty->read_tail]; |
1845 | spin_lock_irqsave(&tty->read_lock, flags); | 1843 | spin_lock_irqsave(&tty->read_lock, flags); |
1846 | tty->read_tail = ((tty->read_tail+1) & | 1844 | tty->read_tail = ((tty->read_tail+1) & |
1847 | (N_TTY_BUF_SIZE-1)); | 1845 | (N_TTY_BUF_SIZE-1)); |
1848 | tty->read_cnt--; | 1846 | tty->read_cnt--; |
1849 | if (eol) { | 1847 | if (eol) { |
1850 | /* this test should be redundant: | 1848 | /* this test should be redundant: |
1851 | * we shouldn't be reading data if | 1849 | * we shouldn't be reading data if |
1852 | * canon_data is 0 | 1850 | * canon_data is 0 |
1853 | */ | 1851 | */ |
1854 | if (--tty->canon_data < 0) | 1852 | if (--tty->canon_data < 0) |
1855 | tty->canon_data = 0; | 1853 | tty->canon_data = 0; |
1856 | } | 1854 | } |
1857 | spin_unlock_irqrestore(&tty->read_lock, flags); | 1855 | spin_unlock_irqrestore(&tty->read_lock, flags); |
1858 | 1856 | ||
1859 | if (!eol || (c != __DISABLED_CHAR)) { | 1857 | if (!eol || (c != __DISABLED_CHAR)) { |
1860 | if (tty_put_user(tty, c, b++)) { | 1858 | if (tty_put_user(tty, c, b++)) { |
1861 | retval = -EFAULT; | 1859 | retval = -EFAULT; |
1862 | b--; | 1860 | b--; |
1863 | break; | 1861 | break; |
1864 | } | 1862 | } |
1865 | nr--; | 1863 | nr--; |
1866 | } | 1864 | } |
1867 | if (eol) { | 1865 | if (eol) { |
1868 | tty_audit_push(tty); | 1866 | tty_audit_push(tty); |
1869 | break; | 1867 | break; |
1870 | } | 1868 | } |
1871 | } | 1869 | } |
1872 | if (retval) | 1870 | if (retval) |
1873 | break; | 1871 | break; |
1874 | } else { | 1872 | } else { |
1875 | int uncopied; | 1873 | int uncopied; |
1876 | /* The copy function takes the read lock and handles | 1874 | /* The copy function takes the read lock and handles |
1877 | locking internally for this case */ | 1875 | locking internally for this case */ |
1878 | uncopied = copy_from_read_buf(tty, &b, &nr); | 1876 | uncopied = copy_from_read_buf(tty, &b, &nr); |
1879 | uncopied += copy_from_read_buf(tty, &b, &nr); | 1877 | uncopied += copy_from_read_buf(tty, &b, &nr); |
1880 | if (uncopied) { | 1878 | if (uncopied) { |
1881 | retval = -EFAULT; | 1879 | retval = -EFAULT; |
1882 | break; | 1880 | break; |
1883 | } | 1881 | } |
1884 | } | 1882 | } |
1885 | 1883 | ||
1886 | /* If there is enough space in the read buffer now, let the | 1884 | /* If there is enough space in the read buffer now, let the |
1887 | * low-level driver know. We use n_tty_chars_in_buffer() to | 1885 | * low-level driver know. We use n_tty_chars_in_buffer() to |
1888 | * check the buffer, as it now knows about canonical mode. | 1886 | * check the buffer, as it now knows about canonical mode. |
1889 | * Otherwise, if the driver is throttled and the line is | 1887 | * Otherwise, if the driver is throttled and the line is |
1890 | * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode, | 1888 | * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode, |
1891 | * we won't get any more characters. | 1889 | * we won't get any more characters. |
1892 | */ | 1890 | */ |
1893 | if (n_tty_chars_in_buffer(tty) <= TTY_THRESHOLD_UNTHROTTLE) { | 1891 | if (n_tty_chars_in_buffer(tty) <= TTY_THRESHOLD_UNTHROTTLE) { |
1894 | n_tty_set_room(tty); | 1892 | n_tty_set_room(tty); |
1895 | check_unthrottle(tty); | 1893 | check_unthrottle(tty); |
1896 | } | 1894 | } |
1897 | 1895 | ||
1898 | if (b - buf >= minimum) | 1896 | if (b - buf >= minimum) |
1899 | break; | 1897 | break; |
1900 | if (time) | 1898 | if (time) |
1901 | timeout = time; | 1899 | timeout = time; |
1902 | } | 1900 | } |
1903 | mutex_unlock(&tty->atomic_read_lock); | 1901 | mutex_unlock(&tty->atomic_read_lock); |
1904 | remove_wait_queue(&tty->read_wait, &wait); | 1902 | remove_wait_queue(&tty->read_wait, &wait); |
1905 | 1903 | ||
1906 | if (!waitqueue_active(&tty->read_wait)) | 1904 | if (!waitqueue_active(&tty->read_wait)) |
1907 | tty->minimum_to_wake = minimum; | 1905 | tty->minimum_to_wake = minimum; |
1908 | 1906 | ||
1909 | __set_current_state(TASK_RUNNING); | 1907 | __set_current_state(TASK_RUNNING); |
1910 | size = b - buf; | 1908 | size = b - buf; |
1911 | if (size) { | 1909 | if (size) { |
1912 | retval = size; | 1910 | retval = size; |
1913 | if (nr) | 1911 | if (nr) |
1914 | clear_bit(TTY_PUSH, &tty->flags); | 1912 | clear_bit(TTY_PUSH, &tty->flags); |
1915 | } else if (test_and_clear_bit(TTY_PUSH, &tty->flags)) | 1913 | } else if (test_and_clear_bit(TTY_PUSH, &tty->flags)) |
1916 | goto do_it_again; | 1914 | goto do_it_again; |
1917 | 1915 | ||
1918 | n_tty_set_room(tty); | 1916 | n_tty_set_room(tty); |
1919 | return retval; | 1917 | return retval; |
1920 | } | 1918 | } |
1921 | 1919 | ||
1922 | /** | 1920 | /** |
1923 | * n_tty_write - write function for tty | 1921 | * n_tty_write - write function for tty |
1924 | * @tty: tty device | 1922 | * @tty: tty device |
1925 | * @file: file object | 1923 | * @file: file object |
1926 | * @buf: userspace buffer pointer | 1924 | * @buf: userspace buffer pointer |
1927 | * @nr: size of I/O | 1925 | * @nr: size of I/O |
1928 | * | 1926 | * |
1929 | * Write function of the terminal device. This is serialized with | 1927 | * Write function of the terminal device. This is serialized with |
1930 | * respect to other write callers but not to termios changes, reads | 1928 | * respect to other write callers but not to termios changes, reads |
1931 | * and other such events. Since the receive code will echo characters, | 1929 | * and other such events. Since the receive code will echo characters, |
1932 | * thus calling driver write methods, the output_lock is used in | 1930 | * thus calling driver write methods, the output_lock is used in |
1933 | * the output processing functions called here as well as in the | 1931 | * the output processing functions called here as well as in the |
1934 | * echo processing function to protect the column state and space | 1932 | * echo processing function to protect the column state and space |
1935 | * left in the buffer. | 1933 | * left in the buffer. |
1936 | * | 1934 | * |
1937 | * This code must be sure never to sleep through a hangup. | 1935 | * This code must be sure never to sleep through a hangup. |
1938 | * | 1936 | * |
1939 | * Locking: output_lock to protect column state and space left | 1937 | * Locking: output_lock to protect column state and space left |
1940 | * (note that the process_output*() functions take this | 1938 | * (note that the process_output*() functions take this |
1941 | * lock themselves) | 1939 | * lock themselves) |
1942 | */ | 1940 | */ |
1943 | 1941 | ||
1944 | static ssize_t n_tty_write(struct tty_struct *tty, struct file *file, | 1942 | static ssize_t n_tty_write(struct tty_struct *tty, struct file *file, |
1945 | const unsigned char *buf, size_t nr) | 1943 | const unsigned char *buf, size_t nr) |
1946 | { | 1944 | { |
1947 | const unsigned char *b = buf; | 1945 | const unsigned char *b = buf; |
1948 | DECLARE_WAITQUEUE(wait, current); | 1946 | DECLARE_WAITQUEUE(wait, current); |
1949 | int c; | 1947 | int c; |
1950 | ssize_t retval = 0; | 1948 | ssize_t retval = 0; |
1951 | 1949 | ||
1952 | /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */ | 1950 | /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */ |
1953 | if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) { | 1951 | if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) { |
1954 | retval = tty_check_change(tty); | 1952 | retval = tty_check_change(tty); |
1955 | if (retval) | 1953 | if (retval) |
1956 | return retval; | 1954 | return retval; |
1957 | } | 1955 | } |
1958 | 1956 | ||
1959 | /* Write out any echoed characters that are still pending */ | 1957 | /* Write out any echoed characters that are still pending */ |
1960 | process_echoes(tty); | 1958 | process_echoes(tty); |
1961 | 1959 | ||
1962 | add_wait_queue(&tty->write_wait, &wait); | 1960 | add_wait_queue(&tty->write_wait, &wait); |
1963 | while (1) { | 1961 | while (1) { |
1964 | set_current_state(TASK_INTERRUPTIBLE); | 1962 | set_current_state(TASK_INTERRUPTIBLE); |
1965 | if (signal_pending(current)) { | 1963 | if (signal_pending(current)) { |
1966 | retval = -ERESTARTSYS; | 1964 | retval = -ERESTARTSYS; |
1967 | break; | 1965 | break; |
1968 | } | 1966 | } |
1969 | if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) { | 1967 | if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) { |
1970 | retval = -EIO; | 1968 | retval = -EIO; |
1971 | break; | 1969 | break; |
1972 | } | 1970 | } |
1973 | if (O_OPOST(tty) && !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) { | 1971 | if (O_OPOST(tty) && !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) { |
1974 | while (nr > 0) { | 1972 | while (nr > 0) { |
1975 | ssize_t num = process_output_block(tty, b, nr); | 1973 | ssize_t num = process_output_block(tty, b, nr); |
1976 | if (num < 0) { | 1974 | if (num < 0) { |
1977 | if (num == -EAGAIN) | 1975 | if (num == -EAGAIN) |
1978 | break; | 1976 | break; |
1979 | retval = num; | 1977 | retval = num; |
1980 | goto break_out; | 1978 | goto break_out; |
1981 | } | 1979 | } |
1982 | b += num; | 1980 | b += num; |
1983 | nr -= num; | 1981 | nr -= num; |
1984 | if (nr == 0) | 1982 | if (nr == 0) |
1985 | break; | 1983 | break; |
1986 | c = *b; | 1984 | c = *b; |
1987 | if (process_output(c, tty) < 0) | 1985 | if (process_output(c, tty) < 0) |
1988 | break; | 1986 | break; |
1989 | b++; nr--; | 1987 | b++; nr--; |
1990 | } | 1988 | } |
1991 | if (tty->ops->flush_chars) | 1989 | if (tty->ops->flush_chars) |
1992 | tty->ops->flush_chars(tty); | 1990 | tty->ops->flush_chars(tty); |
1993 | } else { | 1991 | } else { |
1994 | while (nr > 0) { | 1992 | while (nr > 0) { |
1995 | c = tty->ops->write(tty, b, nr); | 1993 | c = tty->ops->write(tty, b, nr); |
1996 | if (c < 0) { | 1994 | if (c < 0) { |
1997 | retval = c; | 1995 | retval = c; |
1998 | goto break_out; | 1996 | goto break_out; |
1999 | } | 1997 | } |
2000 | if (!c) | 1998 | if (!c) |
2001 | break; | 1999 | break; |
2002 | b += c; | 2000 | b += c; |
2003 | nr -= c; | 2001 | nr -= c; |
2004 | } | 2002 | } |
2005 | } | 2003 | } |
2006 | if (!nr) | 2004 | if (!nr) |
2007 | break; | 2005 | break; |
2008 | if (file->f_flags & O_NONBLOCK) { | 2006 | if (file->f_flags & O_NONBLOCK) { |
2009 | retval = -EAGAIN; | 2007 | retval = -EAGAIN; |
2010 | break; | 2008 | break; |
2011 | } | 2009 | } |
2012 | schedule(); | 2010 | schedule(); |
2013 | } | 2011 | } |
2014 | break_out: | 2012 | break_out: |
2015 | __set_current_state(TASK_RUNNING); | 2013 | __set_current_state(TASK_RUNNING); |
2016 | remove_wait_queue(&tty->write_wait, &wait); | 2014 | remove_wait_queue(&tty->write_wait, &wait); |
2015 | if (b - buf != nr && tty->fasync) | ||
2016 | set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); | ||
2017 | return (b - buf) ? b - buf : retval; | 2017 | return (b - buf) ? b - buf : retval; |
2018 | } | 2018 | } |
2019 | 2019 | ||
2020 | /** | 2020 | /** |
2021 | * n_tty_poll - poll method for N_TTY | 2021 | * n_tty_poll - poll method for N_TTY |
2022 | * @tty: terminal device | 2022 | * @tty: terminal device |
2023 | * @file: file accessing it | 2023 | * @file: file accessing it |
2024 | * @wait: poll table | 2024 | * @wait: poll table |
2025 | * | 2025 | * |
2026 | * Called when the line discipline is asked to poll() for data or | 2026 | * Called when the line discipline is asked to poll() for data or |
2027 | * for special events. This code is not serialized with respect to | 2027 | * for special events. This code is not serialized with respect to |
2028 | * other events save open/close. | 2028 | * other events save open/close. |
2029 | * | 2029 | * |
2030 | * This code must be sure never to sleep through a hangup. | 2030 | * This code must be sure never to sleep through a hangup. |
2031 | * Called without the kernel lock held - fine | 2031 | * Called without the kernel lock held - fine |
2032 | */ | 2032 | */ |
2033 | 2033 | ||
2034 | static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file, | 2034 | static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file, |
2035 | poll_table *wait) | 2035 | poll_table *wait) |
2036 | { | 2036 | { |
2037 | unsigned int mask = 0; | 2037 | unsigned int mask = 0; |
2038 | 2038 | ||
2039 | poll_wait(file, &tty->read_wait, wait); | 2039 | poll_wait(file, &tty->read_wait, wait); |
2040 | poll_wait(file, &tty->write_wait, wait); | 2040 | poll_wait(file, &tty->write_wait, wait); |
2041 | if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty))) | 2041 | if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty))) |
2042 | mask |= POLLIN | POLLRDNORM; | 2042 | mask |= POLLIN | POLLRDNORM; |
2043 | if (tty->packet && tty->link->ctrl_status) | 2043 | if (tty->packet && tty->link->ctrl_status) |
2044 | mask |= POLLPRI | POLLIN | POLLRDNORM; | 2044 | mask |= POLLPRI | POLLIN | POLLRDNORM; |
2045 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) | 2045 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) |
2046 | mask |= POLLHUP; | 2046 | mask |= POLLHUP; |
2047 | if (tty_hung_up_p(file)) | 2047 | if (tty_hung_up_p(file)) |
2048 | mask |= POLLHUP; | 2048 | mask |= POLLHUP; |
2049 | if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) { | 2049 | if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) { |
2050 | if (MIN_CHAR(tty) && !TIME_CHAR(tty)) | 2050 | if (MIN_CHAR(tty) && !TIME_CHAR(tty)) |
2051 | tty->minimum_to_wake = MIN_CHAR(tty); | 2051 | tty->minimum_to_wake = MIN_CHAR(tty); |
2052 | else | 2052 | else |
2053 | tty->minimum_to_wake = 1; | 2053 | tty->minimum_to_wake = 1; |
2054 | } | 2054 | } |
2055 | if (tty->ops->write && !tty_is_writelocked(tty) && | 2055 | if (tty->ops->write && !tty_is_writelocked(tty) && |
2056 | tty_chars_in_buffer(tty) < WAKEUP_CHARS && | 2056 | tty_chars_in_buffer(tty) < WAKEUP_CHARS && |
2057 | tty_write_room(tty) > 0) | 2057 | tty_write_room(tty) > 0) |
2058 | mask |= POLLOUT | POLLWRNORM; | 2058 | mask |= POLLOUT | POLLWRNORM; |
2059 | return mask; | 2059 | return mask; |
2060 | } | 2060 | } |
2061 | 2061 | ||
2062 | static unsigned long inq_canon(struct tty_struct *tty) | 2062 | static unsigned long inq_canon(struct tty_struct *tty) |
2063 | { | 2063 | { |
2064 | int nr, head, tail; | 2064 | int nr, head, tail; |
2065 | 2065 | ||
2066 | if (!tty->canon_data) | 2066 | if (!tty->canon_data) |
2067 | return 0; | 2067 | return 0; |
2068 | head = tty->canon_head; | 2068 | head = tty->canon_head; |
2069 | tail = tty->read_tail; | 2069 | tail = tty->read_tail; |
2070 | nr = (head - tail) & (N_TTY_BUF_SIZE-1); | 2070 | nr = (head - tail) & (N_TTY_BUF_SIZE-1); |
2071 | /* Skip EOF-chars.. */ | 2071 | /* Skip EOF-chars.. */ |
2072 | while (head != tail) { | 2072 | while (head != tail) { |
2073 | if (test_bit(tail, tty->read_flags) && | 2073 | if (test_bit(tail, tty->read_flags) && |
2074 | tty->read_buf[tail] == __DISABLED_CHAR) | 2074 | tty->read_buf[tail] == __DISABLED_CHAR) |
2075 | nr--; | 2075 | nr--; |
2076 | tail = (tail+1) & (N_TTY_BUF_SIZE-1); | 2076 | tail = (tail+1) & (N_TTY_BUF_SIZE-1); |
2077 | } | 2077 | } |
2078 | return nr; | 2078 | return nr; |
2079 | } | 2079 | } |
2080 | 2080 | ||
2081 | static int n_tty_ioctl(struct tty_struct *tty, struct file *file, | 2081 | static int n_tty_ioctl(struct tty_struct *tty, struct file *file, |
2082 | unsigned int cmd, unsigned long arg) | 2082 | unsigned int cmd, unsigned long arg) |
2083 | { | 2083 | { |
2084 | int retval; | 2084 | int retval; |
2085 | 2085 | ||
2086 | switch (cmd) { | 2086 | switch (cmd) { |
2087 | case TIOCOUTQ: | 2087 | case TIOCOUTQ: |
2088 | return put_user(tty_chars_in_buffer(tty), (int __user *) arg); | 2088 | return put_user(tty_chars_in_buffer(tty), (int __user *) arg); |
2089 | case TIOCINQ: | 2089 | case TIOCINQ: |
2090 | /* FIXME: Locking */ | 2090 | /* FIXME: Locking */ |
2091 | retval = tty->read_cnt; | 2091 | retval = tty->read_cnt; |
2092 | if (L_ICANON(tty)) | 2092 | if (L_ICANON(tty)) |
2093 | retval = inq_canon(tty); | 2093 | retval = inq_canon(tty); |
2094 | return put_user(retval, (unsigned int __user *) arg); | 2094 | return put_user(retval, (unsigned int __user *) arg); |
2095 | default: | 2095 | default: |
2096 | return n_tty_ioctl_helper(tty, file, cmd, arg); | 2096 | return n_tty_ioctl_helper(tty, file, cmd, arg); |
2097 | } | 2097 | } |
2098 | } | 2098 | } |
2099 | 2099 | ||
2100 | struct tty_ldisc_ops tty_ldisc_N_TTY = { | 2100 | struct tty_ldisc_ops tty_ldisc_N_TTY = { |
2101 | .magic = TTY_LDISC_MAGIC, | 2101 | .magic = TTY_LDISC_MAGIC, |
2102 | .name = "n_tty", | 2102 | .name = "n_tty", |
2103 | .open = n_tty_open, | 2103 | .open = n_tty_open, |
2104 | .close = n_tty_close, | 2104 | .close = n_tty_close, |
2105 | .flush_buffer = n_tty_flush_buffer, | 2105 | .flush_buffer = n_tty_flush_buffer, |
2106 | .chars_in_buffer = n_tty_chars_in_buffer, | 2106 | .chars_in_buffer = n_tty_chars_in_buffer, |
2107 | .read = n_tty_read, | 2107 | .read = n_tty_read, |
2108 | .write = n_tty_write, | 2108 | .write = n_tty_write, |
2109 | .ioctl = n_tty_ioctl, | 2109 | .ioctl = n_tty_ioctl, |
2110 | .set_termios = n_tty_set_termios, | 2110 | .set_termios = n_tty_set_termios, |
2111 | .poll = n_tty_poll, | 2111 | .poll = n_tty_poll, |
2112 | .receive_buf = n_tty_receive_buf, | 2112 | .receive_buf = n_tty_receive_buf, |
2113 | .write_wakeup = n_tty_write_wakeup | 2113 | .write_wakeup = n_tty_write_wakeup |