n_tty.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:30k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * n_tty.c --- implements the N_TTY line discipline.
  3.  * 
  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
  6.  * processing has changed so much that it's hardly recognizable,
  7.  * anyway...)
  8.  *
  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
  11.  * to N_TTY if it can not switch to any other line discipline.  
  12.  *
  13.  * Written by Theodore Ts'o, Copyright 1994.
  14.  * 
  15.  * This file also contains code originally written by Linus Torvalds,
  16.  * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994.
  17.  * 
  18.  * This file may be redistributed under the terms of the GNU General Public
  19.  * License.
  20.  *
  21.  * Reduced memory usage for older ARM systems  - Russell King.
  22.  *
  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>
  25.  * who actually finally proved there really was a race.
  26.  *
  27.  * 2002/03/18   Implemented n_tty_wakeup to send SIGIO POLL_OUTs to
  28.  * waiting writing processes-Sapan Bhatia <sapan@corewars.org>.
  29.  * Also fixed a bug in BLOCKING mode where write_chan returns
  30.  * EAGAIN
  31.  */
  32. #include <linux/types.h>
  33. #include <linux/major.h>
  34. #include <linux/errno.h>
  35. #include <linux/signal.h>
  36. #include <linux/fcntl.h>
  37. #include <linux/sched.h>
  38. #include <linux/interrupt.h>
  39. #include <linux/tty.h>
  40. #include <linux/timer.h>
  41. #include <linux/ctype.h>
  42. #include <linux/kd.h>
  43. #include <linux/mm.h>
  44. #include <linux/string.h>
  45. #include <linux/slab.h>
  46. #include <linux/poll.h>
  47. #include <asm/uaccess.h>
  48. #include <asm/system.h>
  49. #include <asm/bitops.h>
  50. #define CONSOLE_DEV MKDEV(TTY_MAJOR,0)
  51. #define SYSCONS_DEV  MKDEV(TTYAUX_MAJOR,1)
  52. #ifndef MIN
  53. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  54. #endif
  55. /* number of characters left in xmit buffer before select has we have room */
  56. #define WAKEUP_CHARS 256
  57. /*
  58.  * This defines the low- and high-watermarks for throttling and
  59.  * unthrottling the TTY driver.  These watermarks are used for
  60.  * controlling the space in the read buffer.
  61.  */
  62. #define TTY_THRESHOLD_THROTTLE 128 /* now based on remaining room */
  63. #define TTY_THRESHOLD_UNTHROTTLE  128
  64. static inline unsigned char *alloc_buf(void)
  65. {
  66. unsigned char *p;
  67. int prio = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;
  68. if (PAGE_SIZE != N_TTY_BUF_SIZE) {
  69. p = kmalloc(N_TTY_BUF_SIZE, prio);
  70. if (p)
  71. memset(p, 0, N_TTY_BUF_SIZE);
  72. } else
  73. p = (unsigned char *)get_zeroed_page(prio);
  74. return p;
  75. }
  76. static inline void free_buf(unsigned char *buf)
  77. {
  78. if (PAGE_SIZE != N_TTY_BUF_SIZE)
  79. kfree(buf);
  80. else
  81. free_page((unsigned long) buf);
  82. }
  83. static inline void put_tty_queue_nolock(unsigned char c, struct tty_struct *tty)
  84. {
  85. if (tty->read_cnt < N_TTY_BUF_SIZE) {
  86. tty->read_buf[tty->read_head] = c;
  87. tty->read_head = (tty->read_head + 1) & (N_TTY_BUF_SIZE-1);
  88. tty->read_cnt++;
  89. }
  90. }
  91. static inline void put_tty_queue(unsigned char c, struct tty_struct *tty)
  92. {
  93. unsigned long flags;
  94. /*
  95.  * The problem of stomping on the buffers ends here.
  96.  * Why didn't anyone see this one coming? --AJK
  97. */
  98. spin_lock_irqsave(&tty->read_lock, flags);
  99. put_tty_queue_nolock(c, tty);
  100. spin_unlock_irqrestore(&tty->read_lock, flags);
  101. }
  102. /* 
  103.  * Check whether to call the driver.unthrottle function.
  104.  * We test the TTY_THROTTLED bit first so that it always
  105.  * indicates the current state.
  106.  */
  107. static void check_unthrottle(struct tty_struct * tty)
  108. {
  109. if (tty->count &&
  110.     test_and_clear_bit(TTY_THROTTLED, &tty->flags) && 
  111.     tty->driver.unthrottle)
  112. tty->driver.unthrottle(tty);
  113. }
  114. /*
  115.  * Reset the read buffer counters, clear the flags, 
  116.  * and make sure the driver is unthrottled. Called
  117.  * from n_tty_open() and n_tty_flush_buffer().
  118.  */
  119. static void reset_buffer_flags(struct tty_struct *tty)
  120. {
  121. unsigned long flags;
  122. spin_lock_irqsave(&tty->read_lock, flags);
  123. tty->read_head = tty->read_tail = tty->read_cnt = 0;
  124. spin_unlock_irqrestore(&tty->read_lock, flags);
  125. tty->canon_head = tty->canon_data = tty->erasing = 0;
  126. memset(&tty->read_flags, 0, sizeof tty->read_flags);
  127. check_unthrottle(tty);
  128. }
  129. /*
  130.  * Flush the input buffer
  131.  */
  132. void n_tty_flush_buffer(struct tty_struct * tty)
  133. {
  134. /* clear everything and unthrottle the driver */
  135. reset_buffer_flags(tty);
  136. if (!tty->link)
  137. return;
  138. if (tty->link->packet) {
  139. tty->ctrl_status |= TIOCPKT_FLUSHREAD;
  140. wake_up_interruptible(&tty->link->read_wait);
  141. }
  142. }
  143. /*
  144.  * Return number of characters buffered to be delivered to user
  145.  */
  146. ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
  147. {
  148. unsigned long flags;
  149. ssize_t n = 0;
  150. spin_lock_irqsave(&tty->read_lock, flags);
  151. if (!tty->icanon) {
  152. n = tty->read_cnt;
  153. } else if (tty->canon_data) {
  154. n = (tty->canon_head > tty->read_tail) ?
  155. tty->canon_head - tty->read_tail :
  156. tty->canon_head + (N_TTY_BUF_SIZE - tty->read_tail);
  157. }
  158. spin_unlock_irqrestore(&tty->read_lock, flags);
  159. return n;
  160. }
  161. /*
  162.  * Perform OPOST processing.  Returns -1 when the output device is
  163.  * full and the character must be retried.
  164.  */
  165. static int opost(unsigned char c, struct tty_struct *tty)
  166. {
  167. int space, spaces;
  168. space = tty->driver.write_room(tty);
  169. if (!space)
  170. return -1;
  171. if (O_OPOST(tty)) {
  172. switch (c) {
  173. case 'n':
  174. if (O_ONLRET(tty))
  175. tty->column = 0;
  176. if (O_ONLCR(tty)) {
  177. if (space < 2)
  178. return -1;
  179. tty->driver.put_char(tty, 'r');
  180. tty->column = 0;
  181. }
  182. tty->canon_column = tty->column;
  183. break;
  184. case 'r':
  185. if (O_ONOCR(tty) && tty->column == 0)
  186. return 0;
  187. if (O_OCRNL(tty)) {
  188. c = 'n';
  189. if (O_ONLRET(tty))
  190. tty->canon_column = tty->column = 0;
  191. break;
  192. }
  193. tty->canon_column = tty->column = 0;
  194. break;
  195. case 't':
  196. spaces = 8 - (tty->column & 7);
  197. if (O_TABDLY(tty) == XTABS) {
  198. if (space < spaces)
  199. return -1;
  200. tty->column += spaces;
  201. tty->driver.write(tty, 0, "        ", spaces);
  202. return 0;
  203. }
  204. tty->column += spaces;
  205. break;
  206. case 'b':
  207. if (tty->column > 0)
  208. tty->column--;
  209. break;
  210. default:
  211. if (O_OLCUC(tty))
  212. c = toupper(c);
  213. if (!iscntrl(c))
  214. tty->column++;
  215. break;
  216. }
  217. }
  218. tty->driver.put_char(tty, c);
  219. return 0;
  220. }
  221. /*
  222.  * opost_block --- to speed up block console writes, among other
  223.  * things.
  224.  */
  225. static ssize_t opost_block(struct tty_struct * tty,
  226.        const unsigned char * inbuf, unsigned int nr)
  227. {
  228. char buf[80];
  229. int space;
  230. int  i;
  231. char *cp;
  232. space = tty->driver.write_room(tty);
  233. if (!space)
  234. return 0;
  235. if (nr > space)
  236. nr = space;
  237. if (nr > sizeof(buf))
  238.     nr = sizeof(buf);
  239. if (copy_from_user(buf, inbuf, nr))
  240. return -EFAULT;
  241. for (i = 0, cp = buf; i < nr; i++, cp++) {
  242. switch (*cp) {
  243. case 'n':
  244. if (O_ONLRET(tty))
  245. tty->column = 0;
  246. if (O_ONLCR(tty))
  247. goto break_out;
  248. tty->canon_column = tty->column;
  249. break;
  250. case 'r':
  251. if (O_ONOCR(tty) && tty->column == 0)
  252. goto break_out;
  253. if (O_OCRNL(tty)) {
  254. *cp = 'n';
  255. if (O_ONLRET(tty))
  256. tty->canon_column = tty->column = 0;
  257. break;
  258. }
  259. tty->canon_column = tty->column = 0;
  260. break;
  261. case 't':
  262. goto break_out;
  263. case 'b':
  264. if (tty->column > 0)
  265. tty->column--;
  266. break;
  267. default:
  268. if (O_OLCUC(tty))
  269. *cp = toupper(*cp);
  270. if (!iscntrl(*cp))
  271. tty->column++;
  272. break;
  273. }
  274. }
  275. break_out:
  276. if (tty->driver.flush_chars)
  277. tty->driver.flush_chars(tty);
  278. i = tty->driver.write(tty, 0, buf, i);
  279. return i;
  280. }
  281. static inline void put_char(unsigned char c, struct tty_struct *tty)
  282. {
  283. tty->driver.put_char(tty, c);
  284. }
  285. /* Must be called only when L_ECHO(tty) is true. */
  286. static void echo_char(unsigned char c, struct tty_struct *tty)
  287. {
  288. if (L_ECHOCTL(tty) && iscntrl(c) && c != 't') {
  289. put_char('^', tty);
  290. put_char(c ^ 0100, tty);
  291. tty->column += 2;
  292. } else
  293. opost(c, tty);
  294. }
  295. static inline void finish_erasing(struct tty_struct *tty)
  296. {
  297. if (tty->erasing) {
  298. put_char('/', tty);
  299. tty->column += 2;
  300. tty->erasing = 0;
  301. }
  302. }
  303. static void eraser(unsigned char c, struct tty_struct *tty)
  304. {
  305. enum { ERASE, WERASE, KILL } kill_type;
  306. int head, seen_alnums;
  307. unsigned long flags;
  308. if (tty->read_head == tty->canon_head) {
  309. /* opost('a', tty); */ /* what do you think? */
  310. return;
  311. }
  312. if (c == ERASE_CHAR(tty))
  313. kill_type = ERASE;
  314. else if (c == WERASE_CHAR(tty))
  315. kill_type = WERASE;
  316. else {
  317. if (!L_ECHO(tty)) {
  318. spin_lock_irqsave(&tty->read_lock, flags);
  319. tty->read_cnt -= ((tty->read_head - tty->canon_head) &
  320.   (N_TTY_BUF_SIZE - 1));
  321. tty->read_head = tty->canon_head;
  322. spin_unlock_irqrestore(&tty->read_lock, flags);
  323. return;
  324. }
  325. if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
  326. spin_lock_irqsave(&tty->read_lock, flags);
  327. tty->read_cnt -= ((tty->read_head - tty->canon_head) &
  328.   (N_TTY_BUF_SIZE - 1));
  329. tty->read_head = tty->canon_head;
  330. spin_unlock_irqrestore(&tty->read_lock, flags);
  331. finish_erasing(tty);
  332. echo_char(KILL_CHAR(tty), tty);
  333. /* Add a newline if ECHOK is on and ECHOKE is off. */
  334. if (L_ECHOK(tty))
  335. opost('n', tty);
  336. return;
  337. }
  338. kill_type = KILL;
  339. }
  340. seen_alnums = 0;
  341. while (tty->read_head != tty->canon_head) {
  342. head = (tty->read_head - 1) & (N_TTY_BUF_SIZE-1);
  343. c = tty->read_buf[head];
  344. if (kill_type == WERASE) {
  345. /* Equivalent to BSD's ALTWERASE. */
  346. if (isalnum(c) || c == '_')
  347. seen_alnums++;
  348. else if (seen_alnums)
  349. break;
  350. }
  351. spin_lock_irqsave(&tty->read_lock, flags);
  352. tty->read_head = head;
  353. tty->read_cnt--;
  354. spin_unlock_irqrestore(&tty->read_lock, flags);
  355. if (L_ECHO(tty)) {
  356. if (L_ECHOPRT(tty)) {
  357. if (!tty->erasing) {
  358. put_char('\', tty);
  359. tty->column++;
  360. tty->erasing = 1;
  361. }
  362. echo_char(c, tty);
  363. } else if (kill_type == ERASE && !L_ECHOE(tty)) {
  364. echo_char(ERASE_CHAR(tty), tty);
  365. } else if (c == 't') {
  366. unsigned int col = tty->canon_column;
  367. unsigned long tail = tty->canon_head;
  368. /* Find the column of the last char. */
  369. while (tail != tty->read_head) {
  370. c = tty->read_buf[tail];
  371. if (c == 't')
  372. col = (col | 7) + 1;
  373. else if (iscntrl(c)) {
  374. if (L_ECHOCTL(tty))
  375. col += 2;
  376. } else
  377. col++;
  378. tail = (tail+1) & (N_TTY_BUF_SIZE-1);
  379. }
  380. /* should never happen */
  381. if (tty->column > 0x80000000)
  382. tty->column = 0; 
  383. /* Now backup to that column. */
  384. while (tty->column > col) {
  385. /* Can't use opost here. */
  386. put_char('b', tty);
  387. if (tty->column > 0)
  388. tty->column--;
  389. }
  390. } else {
  391. if (iscntrl(c) && L_ECHOCTL(tty)) {
  392. put_char('b', tty);
  393. put_char(' ', tty);
  394. put_char('b', tty);
  395. if (tty->column > 0)
  396. tty->column--;
  397. }
  398. if (!iscntrl(c) || L_ECHOCTL(tty)) {
  399. put_char('b', tty);
  400. put_char(' ', tty);
  401. put_char('b', tty);
  402. if (tty->column > 0)
  403. tty->column--;
  404. }
  405. }
  406. }
  407. if (kill_type == ERASE)
  408. break;
  409. }
  410. if (tty->read_head == tty->canon_head)
  411. finish_erasing(tty);
  412. }
  413. static inline void isig(int sig, struct tty_struct *tty, int flush)
  414. {
  415. if (tty->pgrp > 0)
  416. kill_pg(tty->pgrp, sig, 1);
  417. if (flush || !L_NOFLSH(tty)) {
  418. n_tty_flush_buffer(tty);
  419. if (tty->driver.flush_buffer)
  420. tty->driver.flush_buffer(tty);
  421. }
  422. }
  423. static inline void n_tty_receive_break(struct tty_struct *tty)
  424. {
  425. if (I_IGNBRK(tty))
  426. return;
  427. if (I_BRKINT(tty)) {
  428. isig(SIGINT, tty, 1);
  429. return;
  430. }
  431. if (I_PARMRK(tty)) {
  432. put_tty_queue('377', tty);
  433. put_tty_queue('', tty);
  434. }
  435. put_tty_queue('', tty);
  436. wake_up_interruptible(&tty->read_wait);
  437. }
  438. static inline void n_tty_receive_overrun(struct tty_struct *tty)
  439. {
  440. char buf[64];
  441. tty->num_overrun++;
  442. if (time_before(tty->overrun_time, jiffies - HZ)) {
  443. printk("%s: %d input overrun(s)n", tty_name(tty, buf),
  444.        tty->num_overrun);
  445. tty->overrun_time = jiffies;
  446. tty->num_overrun = 0;
  447. }
  448. }
  449. static inline void n_tty_receive_parity_error(struct tty_struct *tty,
  450.       unsigned char c)
  451. {
  452. if (I_IGNPAR(tty)) {
  453. return;
  454. }
  455. if (I_PARMRK(tty)) {
  456. put_tty_queue('377', tty);
  457. put_tty_queue('', tty);
  458. put_tty_queue(c, tty);
  459. } else if (I_INPCK(tty))
  460. put_tty_queue('', tty);
  461. else
  462. put_tty_queue(c, tty);
  463. wake_up_interruptible(&tty->read_wait);
  464. }
  465. static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
  466. {
  467. unsigned long flags;
  468. if (tty->raw) {
  469. put_tty_queue(c, tty);
  470. return;
  471. }
  472. if (tty->stopped && !tty->flow_stopped &&
  473.     I_IXON(tty) && I_IXANY(tty)) {
  474. start_tty(tty);
  475. return;
  476. }
  477. if (I_ISTRIP(tty))
  478. c &= 0x7f;
  479. if (I_IUCLC(tty) && L_IEXTEN(tty))
  480. c=tolower(c);
  481. if (tty->closing) {
  482. if (I_IXON(tty)) {
  483. if (c == START_CHAR(tty))
  484. start_tty(tty);
  485. else if (c == STOP_CHAR(tty))
  486. stop_tty(tty);
  487. }
  488. return;
  489. }
  490. /*
  491.  * If the previous character was LNEXT, or we know that this
  492.  * character is not one of the characters that we'll have to
  493.  * handle specially, do shortcut processing to speed things
  494.  * up.
  495.  */
  496. if (!test_bit(c, &tty->process_char_map) || tty->lnext) {
  497. finish_erasing(tty);
  498. tty->lnext = 0;
  499. if (L_ECHO(tty)) {
  500. if (tty->read_cnt >= N_TTY_BUF_SIZE-1) {
  501. put_char('a', tty); /* beep if no space */
  502. return;
  503. }
  504. /* Record the column of first canon char. */
  505. if (tty->canon_head == tty->read_head)
  506. tty->canon_column = tty->column;
  507. echo_char(c, tty);
  508. }
  509. if (I_PARMRK(tty) && c == (unsigned char) '377')
  510. put_tty_queue(c, tty);
  511. put_tty_queue(c, tty);
  512. return;
  513. }
  514. if (c == 'r') {
  515. if (I_IGNCR(tty))
  516. return;
  517. if (I_ICRNL(tty))
  518. c = 'n';
  519. } else if (c == 'n' && I_INLCR(tty))
  520. c = 'r';
  521. if (I_IXON(tty)) {
  522. if (c == START_CHAR(tty)) {
  523. start_tty(tty);
  524. return;
  525. }
  526. if (c == STOP_CHAR(tty)) {
  527. stop_tty(tty);
  528. return;
  529. }
  530. }
  531. if (L_ISIG(tty)) {
  532. int signal;
  533. signal = SIGINT;
  534. if (c == INTR_CHAR(tty))
  535. goto send_signal;
  536. signal = SIGQUIT;
  537. if (c == QUIT_CHAR(tty))
  538. goto send_signal;
  539. signal = SIGTSTP;
  540. if (c == SUSP_CHAR(tty)) {
  541. send_signal:
  542. isig(signal, tty, 0);
  543. return;
  544. }
  545. }
  546. if (tty->icanon) {
  547. if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
  548.     (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
  549. eraser(c, tty);
  550. return;
  551. }
  552. if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
  553. tty->lnext = 1;
  554. if (L_ECHO(tty)) {
  555. finish_erasing(tty);
  556. if (L_ECHOCTL(tty)) {
  557. put_char('^', tty);
  558. put_char('b', tty);
  559. }
  560. }
  561. return;
  562. }
  563. if (c == REPRINT_CHAR(tty) && L_ECHO(tty) &&
  564.     L_IEXTEN(tty)) {
  565. unsigned long tail = tty->canon_head;
  566. finish_erasing(tty);
  567. echo_char(c, tty);
  568. opost('n', tty);
  569. while (tail != tty->read_head) {
  570. echo_char(tty->read_buf[tail], tty);
  571. tail = (tail+1) & (N_TTY_BUF_SIZE-1);
  572. }
  573. return;
  574. }
  575. if (c == 'n') {
  576. if (L_ECHO(tty) || L_ECHONL(tty)) {
  577. if (tty->read_cnt >= N_TTY_BUF_SIZE-1) {
  578. put_char('a', tty);
  579. return;
  580. }
  581. opost('n', tty);
  582. }
  583. goto handle_newline;
  584. }
  585. if (c == EOF_CHAR(tty)) {
  586.         if (tty->canon_head != tty->read_head)
  587.         set_bit(TTY_PUSH, &tty->flags);
  588. c = __DISABLED_CHAR;
  589. goto handle_newline;
  590. }
  591. if ((c == EOL_CHAR(tty)) ||
  592.     (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
  593. /*
  594.  * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
  595.  */
  596. if (L_ECHO(tty)) {
  597. if (tty->read_cnt >= N_TTY_BUF_SIZE-1) {
  598. put_char('a', tty);
  599. return;
  600. }
  601. /* Record the column of first canon char. */
  602. if (tty->canon_head == tty->read_head)
  603. tty->canon_column = tty->column;
  604. echo_char(c, tty);
  605. }
  606. /*
  607.  * XXX does PARMRK doubling happen for
  608.  * EOL_CHAR and EOL2_CHAR?
  609.  */
  610. if (I_PARMRK(tty) && c == (unsigned char) '377')
  611. put_tty_queue(c, tty);
  612. handle_newline:
  613. spin_lock_irqsave(&tty->read_lock, flags);
  614. set_bit(tty->read_head, &tty->read_flags);
  615. put_tty_queue_nolock(c, tty);
  616. tty->canon_head = tty->read_head;
  617. tty->canon_data++;
  618. spin_unlock_irqrestore(&tty->read_lock, flags);
  619. kill_fasync(&tty->fasync, SIGIO, POLL_IN);
  620. if (waitqueue_active(&tty->read_wait))
  621. wake_up_interruptible(&tty->read_wait);
  622. return;
  623. }
  624. }
  625. finish_erasing(tty);
  626. if (L_ECHO(tty)) {
  627. if (tty->read_cnt >= N_TTY_BUF_SIZE-1) {
  628. put_char('a', tty); /* beep if no space */
  629. return;
  630. }
  631. if (c == 'n')
  632. opost('n', tty);
  633. else {
  634. /* Record the column of first canon char. */
  635. if (tty->canon_head == tty->read_head)
  636. tty->canon_column = tty->column;
  637. echo_char(c, tty);
  638. }
  639. }
  640. if (I_PARMRK(tty) && c == (unsigned char) '377')
  641. put_tty_queue(c, tty);
  642. put_tty_queue(c, tty);
  643. }
  644. static int n_tty_receive_room(struct tty_struct *tty)
  645. {
  646. int left = N_TTY_BUF_SIZE - tty->read_cnt - 1;
  647. /*
  648.  * If we are doing input canonicalization, and there are no
  649.  * pending newlines, let characters through without limit, so
  650.  * that erase characters will be handled.  Other excess
  651.  * characters will be beeped.
  652.  */
  653. if (tty->icanon && !tty->canon_data)
  654. return N_TTY_BUF_SIZE;
  655. if (left > 0)
  656. return left;
  657. return 0;
  658. }
  659. /*
  660.  * Required for the ptys, serial driver etc. since processes
  661.  * that attach themselves to the master and rely on ASYNC
  662.  * IO must be woken up
  663.  */
  664. static void n_tty_write_wakeup(struct tty_struct *tty)
  665. {
  666. if (tty->fasync)
  667. {
  668.   set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
  669. kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
  670. }
  671. return;
  672. }
  673. static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
  674.       char *fp, int count)
  675. {
  676. const unsigned char *p;
  677. char *f, flags = TTY_NORMAL;
  678. int i;
  679. char buf[64];
  680. unsigned long cpuflags;
  681. if (!tty->read_buf)
  682. return;
  683. if (tty->real_raw) {
  684. spin_lock_irqsave(&tty->read_lock, cpuflags);
  685. i = MIN(count, MIN(N_TTY_BUF_SIZE - tty->read_cnt,
  686.    N_TTY_BUF_SIZE - tty->read_head));
  687. memcpy(tty->read_buf + tty->read_head, cp, i);
  688. tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1);
  689. tty->read_cnt += i;
  690. cp += i;
  691. count -= i;
  692. i = MIN(count, MIN(N_TTY_BUF_SIZE - tty->read_cnt,
  693.        N_TTY_BUF_SIZE - tty->read_head));
  694. memcpy(tty->read_buf + tty->read_head, cp, i);
  695. tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1);
  696. tty->read_cnt += i;
  697. spin_unlock_irqrestore(&tty->read_lock, cpuflags);
  698. } else {
  699. for (i=count, p = cp, f = fp; i; i--, p++) {
  700. if (f)
  701. flags = *f++;
  702. switch (flags) {
  703. case TTY_NORMAL:
  704. n_tty_receive_char(tty, *p);
  705. break;
  706. case TTY_BREAK:
  707. n_tty_receive_break(tty);
  708. break;
  709. case TTY_PARITY:
  710. case TTY_FRAME:
  711. n_tty_receive_parity_error(tty, *p);
  712. break;
  713. case TTY_OVERRUN:
  714. n_tty_receive_overrun(tty);
  715. break;
  716. default:
  717. printk("%s: unknown flag %dn",
  718.        tty_name(tty, buf), flags);
  719. break;
  720. }
  721. }
  722. if (tty->driver.flush_chars)
  723. tty->driver.flush_chars(tty);
  724. }
  725. if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) {
  726. kill_fasync(&tty->fasync, SIGIO, POLL_IN);
  727. if (waitqueue_active(&tty->read_wait))
  728. wake_up_interruptible(&tty->read_wait);
  729. }
  730. /*
  731.  * Check the remaining room for the input canonicalization
  732.  * mode.  We don't want to throttle the driver if we're in
  733.  * canonical mode and don't have a newline yet!
  734.  */
  735. if (n_tty_receive_room(tty) < TTY_THRESHOLD_THROTTLE) {
  736. /* check TTY_THROTTLED first so it indicates our state */
  737. if (!test_and_set_bit(TTY_THROTTLED, &tty->flags) &&
  738.     tty->driver.throttle)
  739. tty->driver.throttle(tty);
  740. }
  741. }
  742. int is_ignored(int sig)
  743. {
  744. return (sigismember(&current->blocked, sig) ||
  745.         current->sig->action[sig-1].sa.sa_handler == SIG_IGN);
  746. }
  747. static void n_tty_set_termios(struct tty_struct *tty, struct termios * old)
  748. {
  749. if (!tty)
  750. return;
  751. tty->icanon = (L_ICANON(tty) != 0);
  752. if (test_bit(TTY_HW_COOK_IN, &tty->flags)) {
  753. tty->raw = 1;
  754. tty->real_raw = 1;
  755. return;
  756. }
  757. if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
  758.     I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
  759.     I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
  760.     I_PARMRK(tty)) {
  761. cli();
  762. memset(tty->process_char_map, 0, 256/8);
  763. if (I_IGNCR(tty) || I_ICRNL(tty))
  764. set_bit('r', &tty->process_char_map);
  765. if (I_INLCR(tty))
  766. set_bit('n', &tty->process_char_map);
  767. if (L_ICANON(tty)) {
  768. set_bit(ERASE_CHAR(tty), &tty->process_char_map);
  769. set_bit(KILL_CHAR(tty), &tty->process_char_map);
  770. set_bit(EOF_CHAR(tty), &tty->process_char_map);
  771. set_bit('n', &tty->process_char_map);
  772. set_bit(EOL_CHAR(tty), &tty->process_char_map);
  773. if (L_IEXTEN(tty)) {
  774. set_bit(WERASE_CHAR(tty),
  775. &tty->process_char_map);
  776. set_bit(LNEXT_CHAR(tty),
  777. &tty->process_char_map);
  778. set_bit(EOL2_CHAR(tty),
  779. &tty->process_char_map);
  780. if (L_ECHO(tty))
  781. set_bit(REPRINT_CHAR(tty),
  782. &tty->process_char_map);
  783. }
  784. }
  785. if (I_IXON(tty)) {
  786. set_bit(START_CHAR(tty), &tty->process_char_map);
  787. set_bit(STOP_CHAR(tty), &tty->process_char_map);
  788. }
  789. if (L_ISIG(tty)) {
  790. set_bit(INTR_CHAR(tty), &tty->process_char_map);
  791. set_bit(QUIT_CHAR(tty), &tty->process_char_map);
  792. set_bit(SUSP_CHAR(tty), &tty->process_char_map);
  793. }
  794. clear_bit(__DISABLED_CHAR, &tty->process_char_map);
  795. sti();
  796. tty->raw = 0;
  797. tty->real_raw = 0;
  798. } else {
  799. tty->raw = 1;
  800. if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
  801.     (I_IGNPAR(tty) || !I_INPCK(tty)) &&
  802.     (tty->driver.flags & TTY_DRIVER_REAL_RAW))
  803. tty->real_raw = 1;
  804. else
  805. tty->real_raw = 0;
  806. }
  807. }
  808. static void n_tty_close(struct tty_struct *tty)
  809. {
  810. n_tty_flush_buffer(tty);
  811. if (tty->read_buf) {
  812. free_buf(tty->read_buf);
  813. tty->read_buf = 0;
  814. }
  815. }
  816. static int n_tty_open(struct tty_struct *tty)
  817. {
  818. if (!tty)
  819. return -EINVAL;
  820. if (!tty->read_buf) {
  821. tty->read_buf = alloc_buf();
  822. if (!tty->read_buf)
  823. return -ENOMEM;
  824. }
  825. memset(tty->read_buf, 0, N_TTY_BUF_SIZE);
  826. reset_buffer_flags(tty);
  827. tty->column = 0;
  828. n_tty_set_termios(tty, 0);
  829. tty->minimum_to_wake = 1;
  830. tty->closing = 0;
  831. return 0;
  832. }
  833. static inline int input_available_p(struct tty_struct *tty, int amt)
  834. {
  835. if (tty->icanon) {
  836. if (tty->canon_data)
  837. return 1;
  838. } else if (tty->read_cnt >= (amt ? amt : 1))
  839. return 1;
  840. return 0;
  841. }
  842. /*
  843.  * Helper function to speed up read_chan.  It is only called when
  844.  * ICANON is off; it copies characters straight from the tty queue to
  845.  * user space directly.  It can be profitably called twice; once to
  846.  * drain the space from the tail pointer to the (physical) end of the
  847.  * buffer, and once to drain the space from the (physical) beginning of
  848.  * the buffer to head pointer.
  849.  */
  850. static inline int copy_from_read_buf(struct tty_struct *tty,
  851.       unsigned char **b,
  852.       size_t *nr)
  853. {
  854. int retval;
  855. ssize_t n;
  856. unsigned long flags;
  857. retval = 0;
  858. spin_lock_irqsave(&tty->read_lock, flags);
  859. n = MIN(*nr, MIN(tty->read_cnt, N_TTY_BUF_SIZE - tty->read_tail));
  860. spin_unlock_irqrestore(&tty->read_lock, flags);
  861. if (n) {
  862. mb();
  863. retval = copy_to_user(*b, &tty->read_buf[tty->read_tail], n);
  864. n -= retval;
  865. spin_lock_irqsave(&tty->read_lock, flags);
  866. tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
  867. tty->read_cnt -= n;
  868. spin_unlock_irqrestore(&tty->read_lock, flags);
  869. *b += n;
  870. *nr -= n;
  871. }
  872. return retval;
  873. }
  874. static ssize_t read_chan(struct tty_struct *tty, struct file *file,
  875.  unsigned char *buf, size_t nr)
  876. {
  877. unsigned char *b = buf;
  878. DECLARE_WAITQUEUE(wait, current);
  879. int c;
  880. int minimum, time;
  881. ssize_t retval = 0;
  882. ssize_t size;
  883. long timeout;
  884. unsigned long flags;
  885. do_it_again:
  886. if (!tty->read_buf) {
  887. printk("n_tty_read_chan: called with read_buf == NULL?!?n");
  888. return -EIO;
  889. }
  890. /* Job control check -- must be done at start and after
  891.    every sleep (POSIX.1 7.1.1.4). */
  892. /* NOTE: not yet done after every sleep pending a thorough
  893.    check of the logic of this change. -- jlc */
  894. /* don't stop on /dev/console */
  895. if (file->f_dentry->d_inode->i_rdev != CONSOLE_DEV &&
  896.     file->f_dentry->d_inode->i_rdev != SYSCONS_DEV &&
  897.     current->tty == tty) {
  898. if (tty->pgrp <= 0)
  899. printk("read_chan: tty->pgrp <= 0!n");
  900. else if (current->pgrp != tty->pgrp) {
  901. if (is_ignored(SIGTTIN) ||
  902.     is_orphaned_pgrp(current->pgrp))
  903. return -EIO;
  904. kill_pg(current->pgrp, SIGTTIN, 1);
  905. return -ERESTARTSYS;
  906. }
  907. }
  908. minimum = time = 0;
  909. timeout = MAX_SCHEDULE_TIMEOUT;
  910. if (!tty->icanon) {
  911. time = (HZ / 10) * TIME_CHAR(tty);
  912. minimum = MIN_CHAR(tty);
  913. if (minimum) {
  914. if (time)
  915. tty->minimum_to_wake = 1;
  916. else if (!waitqueue_active(&tty->read_wait) ||
  917.  (tty->minimum_to_wake > minimum))
  918. tty->minimum_to_wake = minimum;
  919. } else {
  920. timeout = 0;
  921. if (time) {
  922. timeout = time;
  923. time = 0;
  924. }
  925. tty->minimum_to_wake = minimum = 1;
  926. }
  927. }
  928. if (file->f_flags & O_NONBLOCK) {
  929. if (down_trylock(&tty->atomic_read))
  930. return -EAGAIN;
  931. }
  932. else {
  933. if (down_interruptible(&tty->atomic_read))
  934. return -ERESTARTSYS;
  935. }
  936. add_wait_queue(&tty->read_wait, &wait);
  937. set_bit(TTY_DONT_FLIP, &tty->flags);
  938. while (nr) {
  939. /* First test for status change. */
  940. if (tty->packet && tty->link->ctrl_status) {
  941. unsigned char cs;
  942. if (b != buf)
  943. break;
  944. cs = tty->link->ctrl_status;
  945. tty->link->ctrl_status = 0;
  946. put_user(cs, b++);
  947. nr--;
  948. break;
  949. }
  950. /* This statement must be first before checking for input
  951.    so that any interrupt will set the state back to
  952.    TASK_RUNNING. */
  953. set_current_state(TASK_INTERRUPTIBLE);
  954. if (((minimum - (b - buf)) < tty->minimum_to_wake) &&
  955.     ((minimum - (b - buf)) >= 1))
  956. tty->minimum_to_wake = (minimum - (b - buf));
  957. if (!input_available_p(tty, 0)) {
  958. if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
  959. retval = -EIO;
  960. break;
  961. }
  962. if (tty_hung_up_p(file))
  963. break;
  964. if (!timeout)
  965. break;
  966. if (file->f_flags & O_NONBLOCK) {
  967. retval = -EAGAIN;
  968. break;
  969. }
  970. if (signal_pending(current)) {
  971. retval = -ERESTARTSYS;
  972. break;
  973. }
  974. clear_bit(TTY_DONT_FLIP, &tty->flags);
  975. timeout = schedule_timeout(timeout);
  976. set_bit(TTY_DONT_FLIP, &tty->flags);
  977. continue;
  978. }
  979. current->state = TASK_RUNNING;
  980. /* Deal with packet mode. */
  981. if (tty->packet && b == buf) {
  982. put_user(TIOCPKT_DATA, b++);
  983. nr--;
  984. }
  985. if (tty->icanon) {
  986. /* N.B. avoid overrun if nr == 0 */
  987. while (nr && tty->read_cnt) {
  988.   int eol;
  989. eol = test_and_clear_bit(tty->read_tail,
  990. &tty->read_flags);
  991. c = tty->read_buf[tty->read_tail];
  992. spin_lock_irqsave(&tty->read_lock, flags);
  993. tty->read_tail = ((tty->read_tail+1) &
  994.   (N_TTY_BUF_SIZE-1));
  995. tty->read_cnt--;
  996. if (eol) {
  997. /* this test should be redundant:
  998.  * we shouldn't be reading data if
  999.  * canon_data is 0
  1000.  */
  1001. if (--tty->canon_data < 0)
  1002. tty->canon_data = 0;
  1003. }
  1004. spin_unlock_irqrestore(&tty->read_lock, flags);
  1005. if (!eol || (c != __DISABLED_CHAR)) {
  1006. put_user(c, b++);
  1007. nr--;
  1008. }
  1009. if (eol)
  1010. break;
  1011. }
  1012. } else {
  1013. int uncopied;
  1014. uncopied = copy_from_read_buf(tty, &b, &nr);
  1015. uncopied += copy_from_read_buf(tty, &b, &nr);
  1016. if (uncopied) {
  1017. retval = -EFAULT;
  1018. break;
  1019. }
  1020. }
  1021. /* If there is enough space in the read buffer now, let the
  1022.  * low-level driver know. We use n_tty_chars_in_buffer() to
  1023.  * check the buffer, as it now knows about canonical mode.
  1024.  * Otherwise, if the driver is throttled and the line is
  1025.  * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
  1026.  * we won't get any more characters.
  1027.  */
  1028. if (n_tty_chars_in_buffer(tty) <= TTY_THRESHOLD_UNTHROTTLE)
  1029. check_unthrottle(tty);
  1030. if (b - buf >= minimum)
  1031. break;
  1032. if (time)
  1033. timeout = time;
  1034. }
  1035. clear_bit(TTY_DONT_FLIP, &tty->flags);
  1036. up(&tty->atomic_read);
  1037. remove_wait_queue(&tty->read_wait, &wait);
  1038. if (!waitqueue_active(&tty->read_wait))
  1039. tty->minimum_to_wake = minimum;
  1040. current->state = TASK_RUNNING;
  1041. size = b - buf;
  1042. if (size) {
  1043. retval = size;
  1044. if (nr)
  1045.         clear_bit(TTY_PUSH, &tty->flags);
  1046. } else if (test_and_clear_bit(TTY_PUSH, &tty->flags))
  1047.  goto do_it_again;
  1048. return retval;
  1049. }
  1050. static ssize_t write_chan(struct tty_struct * tty, struct file * file,
  1051.   const unsigned char * buf, size_t nr)
  1052. {
  1053. const unsigned char *b = buf;
  1054. DECLARE_WAITQUEUE(wait, current);
  1055. int c;
  1056. ssize_t retval = 0;
  1057. /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
  1058. if (L_TOSTOP(tty) && 
  1059.     file->f_dentry->d_inode->i_rdev != CONSOLE_DEV &&
  1060.     file->f_dentry->d_inode->i_rdev != SYSCONS_DEV) {
  1061. retval = tty_check_change(tty);
  1062. if (retval)
  1063. return retval;
  1064. }
  1065. add_wait_queue(&tty->write_wait, &wait);
  1066. while (1) {
  1067. set_current_state(TASK_INTERRUPTIBLE);
  1068. if (signal_pending(current)) {
  1069. retval = -ERESTARTSYS;
  1070. break;
  1071. }
  1072. if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
  1073. retval = -EIO;
  1074. break;
  1075. }
  1076. if (O_OPOST(tty) && !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) {
  1077. while (nr > 0) {
  1078. ssize_t num = opost_block(tty, b, nr);
  1079. if (num < 0) {
  1080. if (num == -EAGAIN)
  1081. break;
  1082. retval = num;
  1083. goto break_out;
  1084. }
  1085. b += num;
  1086. nr -= num;
  1087. if (nr == 0)
  1088. break;
  1089. get_user(c, b);
  1090. if (opost(c, tty) < 0)
  1091. break;
  1092. b++; nr--;
  1093. }
  1094. if (tty->driver.flush_chars)
  1095. tty->driver.flush_chars(tty);
  1096. } else {
  1097. c = tty->driver.write(tty, 1, b, nr);
  1098. if (c < 0) {
  1099. retval = c;
  1100. goto break_out;
  1101. }
  1102. b += c;
  1103. nr -= c;
  1104. }
  1105. if (!nr)
  1106. break;
  1107. if (file->f_flags & O_NONBLOCK) {
  1108. retval = -EAGAIN;
  1109. break;
  1110. }
  1111. schedule();
  1112. }
  1113. break_out:
  1114. current->state = TASK_RUNNING;
  1115. remove_wait_queue(&tty->write_wait, &wait);
  1116. return (b - buf) ? b - buf : retval;
  1117. }
  1118. /* Called without the kernel lock held - fine */
  1119. static unsigned int normal_poll(struct tty_struct * tty, struct file * file, poll_table *wait)
  1120. {
  1121. unsigned int mask = 0;
  1122. poll_wait(file, &tty->read_wait, wait);
  1123. poll_wait(file, &tty->write_wait, wait);
  1124. if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))
  1125. mask |= POLLIN | POLLRDNORM;
  1126. if (tty->packet && tty->link->ctrl_status)
  1127. mask |= POLLPRI | POLLIN | POLLRDNORM;
  1128. if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
  1129. mask |= POLLHUP;
  1130. if (tty_hung_up_p(file))
  1131. mask |= POLLHUP;
  1132. if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
  1133. if (MIN_CHAR(tty) && !TIME_CHAR(tty))
  1134. tty->minimum_to_wake = MIN_CHAR(tty);
  1135. else
  1136. tty->minimum_to_wake = 1;
  1137. }
  1138. if (tty->driver.chars_in_buffer(tty) < WAKEUP_CHARS)
  1139. mask |= POLLOUT | POLLWRNORM;
  1140. return mask;
  1141. }
  1142. struct tty_ldisc tty_ldisc_N_TTY = {
  1143. TTY_LDISC_MAGIC, /* magic */
  1144. "n_tty", /* name */
  1145. 0, /* num */
  1146. 0, /* flags */
  1147. n_tty_open, /* open */
  1148. n_tty_close, /* close */
  1149. n_tty_flush_buffer, /* flush_buffer */
  1150. n_tty_chars_in_buffer, /* chars_in_buffer */
  1151. read_chan, /* read */
  1152. write_chan, /* write */
  1153. n_tty_ioctl, /* ioctl */
  1154. n_tty_set_termios, /* set_termios */
  1155. normal_poll, /* poll */
  1156. n_tty_receive_buf, /* receive_buf */
  1157. n_tty_receive_room, /* receive_room */
  1158. n_tty_write_wakeup /* write_wakeup */
  1159. };