0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 #include <linux/types.h>
0032 #include <linux/major.h>
0033 #include <linux/errno.h>
0034 #include <linux/signal.h>
0035 #include <linux/fcntl.h>
0036 #include <linux/sched.h>
0037 #include <linux/interrupt.h>
0038 #include <linux/tty.h>
0039 #include <linux/timer.h>
0040 #include <linux/ctype.h>
0041 #include <linux/mm.h>
0042 #include <linux/string.h>
0043 #include <linux/slab.h>
0044 #include <linux/poll.h>
0045 #include <linux/bitops.h>
0046 #include <linux/audit.h>
0047 #include <linux/file.h>
0048 #include <linux/uaccess.h>
0049 #include <linux/module.h>
0050 #include <linux/ratelimit.h>
0051 #include <linux/vmalloc.h>
0052 #include "tty.h"
0053
0054
0055
0056
0057
0058 #define WAKEUP_CHARS 256
0059
0060
0061
0062
0063
0064
0065 #define TTY_THRESHOLD_THROTTLE 128
0066 #define TTY_THRESHOLD_UNTHROTTLE 128
0067
0068
0069
0070
0071
0072
0073
0074 #define ECHO_OP_START 0xff
0075 #define ECHO_OP_MOVE_BACK_COL 0x80
0076 #define ECHO_OP_SET_CANON_COL 0x81
0077 #define ECHO_OP_ERASE_TAB 0x82
0078
0079 #define ECHO_COMMIT_WATERMARK 256
0080 #define ECHO_BLOCK 256
0081 #define ECHO_DISCARD_WATERMARK N_TTY_BUF_SIZE - (ECHO_BLOCK + 32)
0082
0083
0084 #undef N_TTY_TRACE
0085 #ifdef N_TTY_TRACE
0086 # define n_tty_trace(f, args...) trace_printk(f, ##args)
0087 #else
0088 # define n_tty_trace(f, args...) no_printk(f, ##args)
0089 #endif
0090
0091 struct n_tty_data {
0092
0093 size_t read_head;
0094 size_t commit_head;
0095 size_t canon_head;
0096 size_t echo_head;
0097 size_t echo_commit;
0098 size_t echo_mark;
0099 DECLARE_BITMAP(char_map, 256);
0100
0101
0102 unsigned long overrun_time;
0103 int num_overrun;
0104
0105
0106 bool no_room;
0107
0108
0109 unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
0110 unsigned char push:1;
0111
0112
0113 char read_buf[N_TTY_BUF_SIZE];
0114 DECLARE_BITMAP(read_flags, N_TTY_BUF_SIZE);
0115 unsigned char echo_buf[N_TTY_BUF_SIZE];
0116
0117
0118 size_t read_tail;
0119 size_t line_start;
0120
0121
0122 size_t lookahead_count;
0123
0124
0125 unsigned int column;
0126 unsigned int canon_column;
0127 size_t echo_tail;
0128
0129 struct mutex atomic_read_lock;
0130 struct mutex output_lock;
0131 };
0132
0133 #define MASK(x) ((x) & (N_TTY_BUF_SIZE - 1))
0134
0135 static inline size_t read_cnt(struct n_tty_data *ldata)
0136 {
0137 return ldata->read_head - ldata->read_tail;
0138 }
0139
0140 static inline unsigned char read_buf(struct n_tty_data *ldata, size_t i)
0141 {
0142 return ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
0143 }
0144
0145 static inline unsigned char *read_buf_addr(struct n_tty_data *ldata, size_t i)
0146 {
0147 return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
0148 }
0149
0150 static inline unsigned char echo_buf(struct n_tty_data *ldata, size_t i)
0151 {
0152 smp_rmb();
0153 return ldata->echo_buf[i & (N_TTY_BUF_SIZE - 1)];
0154 }
0155
0156 static inline unsigned char *echo_buf_addr(struct n_tty_data *ldata, size_t i)
0157 {
0158 return &ldata->echo_buf[i & (N_TTY_BUF_SIZE - 1)];
0159 }
0160
0161
0162 static void zero_buffer(struct tty_struct *tty, u8 *buffer, int size)
0163 {
0164 bool icanon = !!L_ICANON(tty);
0165 bool no_echo = !L_ECHO(tty);
0166
0167 if (icanon && no_echo)
0168 memset(buffer, 0x00, size);
0169 }
0170
0171 static void tty_copy(struct tty_struct *tty, void *to, size_t tail, size_t n)
0172 {
0173 struct n_tty_data *ldata = tty->disc_data;
0174 size_t size = N_TTY_BUF_SIZE - tail;
0175 void *from = read_buf_addr(ldata, tail);
0176
0177 if (n > size) {
0178 tty_audit_add_data(tty, from, size);
0179 memcpy(to, from, size);
0180 zero_buffer(tty, from, size);
0181 to += size;
0182 n -= size;
0183 from = ldata->read_buf;
0184 }
0185
0186 tty_audit_add_data(tty, from, n);
0187 memcpy(to, from, n);
0188 zero_buffer(tty, from, n);
0189 }
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202 static void n_tty_kick_worker(struct tty_struct *tty)
0203 {
0204 struct n_tty_data *ldata = tty->disc_data;
0205
0206
0207 if (unlikely(ldata->no_room)) {
0208 ldata->no_room = 0;
0209
0210 WARN_RATELIMIT(tty->port->itty == NULL,
0211 "scheduling with invalid itty\n");
0212
0213
0214
0215
0216 WARN_RATELIMIT(test_bit(TTY_LDISC_HALTED, &tty->flags),
0217 "scheduling buffer work for halted ldisc\n");
0218 tty_buffer_restart_work(tty->port);
0219 }
0220 }
0221
0222 static ssize_t chars_in_buffer(struct tty_struct *tty)
0223 {
0224 struct n_tty_data *ldata = tty->disc_data;
0225 ssize_t n = 0;
0226
0227 if (!ldata->icanon)
0228 n = ldata->commit_head - ldata->read_tail;
0229 else
0230 n = ldata->canon_head - ldata->read_tail;
0231 return n;
0232 }
0233
0234
0235
0236
0237
0238
0239
0240
0241 static void n_tty_write_wakeup(struct tty_struct *tty)
0242 {
0243 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
0244 kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
0245 }
0246
0247 static void n_tty_check_throttle(struct tty_struct *tty)
0248 {
0249 struct n_tty_data *ldata = tty->disc_data;
0250
0251
0252
0253
0254
0255
0256 if (ldata->icanon && ldata->canon_head == ldata->read_tail)
0257 return;
0258
0259 while (1) {
0260 int throttled;
0261 tty_set_flow_change(tty, TTY_THROTTLE_SAFE);
0262 if (N_TTY_BUF_SIZE - read_cnt(ldata) >= TTY_THRESHOLD_THROTTLE)
0263 break;
0264 throttled = tty_throttle_safe(tty);
0265 if (!throttled)
0266 break;
0267 }
0268 __tty_set_flow_change(tty, 0);
0269 }
0270
0271 static void n_tty_check_unthrottle(struct tty_struct *tty)
0272 {
0273 if (tty->driver->type == TTY_DRIVER_TYPE_PTY) {
0274 if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
0275 return;
0276 n_tty_kick_worker(tty);
0277 tty_wakeup(tty->link);
0278 return;
0279 }
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289 while (1) {
0290 int unthrottled;
0291 tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
0292 if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
0293 break;
0294 n_tty_kick_worker(tty);
0295 unthrottled = tty_unthrottle_safe(tty);
0296 if (!unthrottled)
0297 break;
0298 }
0299 __tty_set_flow_change(tty, 0);
0300 }
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313 static inline void put_tty_queue(unsigned char c, struct n_tty_data *ldata)
0314 {
0315 *read_buf_addr(ldata, ldata->read_head) = c;
0316 ldata->read_head++;
0317 }
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330 static void reset_buffer_flags(struct n_tty_data *ldata)
0331 {
0332 ldata->read_head = ldata->canon_head = ldata->read_tail = 0;
0333 ldata->commit_head = 0;
0334 ldata->line_start = 0;
0335
0336 ldata->erasing = 0;
0337 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
0338 ldata->push = 0;
0339
0340 ldata->lookahead_count = 0;
0341 }
0342
0343 static void n_tty_packet_mode_flush(struct tty_struct *tty)
0344 {
0345 unsigned long flags;
0346
0347 if (tty->link->ctrl.packet) {
0348 spin_lock_irqsave(&tty->ctrl.lock, flags);
0349 tty->ctrl.pktstatus |= TIOCPKT_FLUSHREAD;
0350 spin_unlock_irqrestore(&tty->ctrl.lock, flags);
0351 wake_up_interruptible(&tty->link->read_wait);
0352 }
0353 }
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368 static void n_tty_flush_buffer(struct tty_struct *tty)
0369 {
0370 down_write(&tty->termios_rwsem);
0371 reset_buffer_flags(tty->disc_data);
0372 n_tty_kick_worker(tty);
0373
0374 if (tty->link)
0375 n_tty_packet_mode_flush(tty);
0376 up_write(&tty->termios_rwsem);
0377 }
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387 static inline int is_utf8_continuation(unsigned char c)
0388 {
0389 return (c & 0xc0) == 0x80;
0390 }
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400 static inline int is_continuation(unsigned char c, struct tty_struct *tty)
0401 {
0402 return I_IUTF8(tty) && is_utf8_continuation(c);
0403 }
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424 static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
0425 {
0426 struct n_tty_data *ldata = tty->disc_data;
0427 int spaces;
0428
0429 if (!space)
0430 return -1;
0431
0432 switch (c) {
0433 case '\n':
0434 if (O_ONLRET(tty))
0435 ldata->column = 0;
0436 if (O_ONLCR(tty)) {
0437 if (space < 2)
0438 return -1;
0439 ldata->canon_column = ldata->column = 0;
0440 tty->ops->write(tty, "\r\n", 2);
0441 return 2;
0442 }
0443 ldata->canon_column = ldata->column;
0444 break;
0445 case '\r':
0446 if (O_ONOCR(tty) && ldata->column == 0)
0447 return 0;
0448 if (O_OCRNL(tty)) {
0449 c = '\n';
0450 if (O_ONLRET(tty))
0451 ldata->canon_column = ldata->column = 0;
0452 break;
0453 }
0454 ldata->canon_column = ldata->column = 0;
0455 break;
0456 case '\t':
0457 spaces = 8 - (ldata->column & 7);
0458 if (O_TABDLY(tty) == XTABS) {
0459 if (space < spaces)
0460 return -1;
0461 ldata->column += spaces;
0462 tty->ops->write(tty, " ", spaces);
0463 return spaces;
0464 }
0465 ldata->column += spaces;
0466 break;
0467 case '\b':
0468 if (ldata->column > 0)
0469 ldata->column--;
0470 break;
0471 default:
0472 if (!iscntrl(c)) {
0473 if (O_OLCUC(tty))
0474 c = toupper(c);
0475 if (!is_continuation(c, tty))
0476 ldata->column++;
0477 }
0478 break;
0479 }
0480
0481 tty_put_char(tty, c);
0482 return 1;
0483 }
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498 static int process_output(unsigned char c, struct tty_struct *tty)
0499 {
0500 struct n_tty_data *ldata = tty->disc_data;
0501 int space, retval;
0502
0503 mutex_lock(&ldata->output_lock);
0504
0505 space = tty_write_room(tty);
0506 retval = do_output_char(c, tty, space);
0507
0508 mutex_unlock(&ldata->output_lock);
0509 if (retval < 0)
0510 return -1;
0511 else
0512 return 0;
0513 }
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533 static ssize_t process_output_block(struct tty_struct *tty,
0534 const unsigned char *buf, unsigned int nr)
0535 {
0536 struct n_tty_data *ldata = tty->disc_data;
0537 int space;
0538 int i;
0539 const unsigned char *cp;
0540
0541 mutex_lock(&ldata->output_lock);
0542
0543 space = tty_write_room(tty);
0544 if (space <= 0) {
0545 mutex_unlock(&ldata->output_lock);
0546 return space;
0547 }
0548 if (nr > space)
0549 nr = space;
0550
0551 for (i = 0, cp = buf; i < nr; i++, cp++) {
0552 unsigned char c = *cp;
0553
0554 switch (c) {
0555 case '\n':
0556 if (O_ONLRET(tty))
0557 ldata->column = 0;
0558 if (O_ONLCR(tty))
0559 goto break_out;
0560 ldata->canon_column = ldata->column;
0561 break;
0562 case '\r':
0563 if (O_ONOCR(tty) && ldata->column == 0)
0564 goto break_out;
0565 if (O_OCRNL(tty))
0566 goto break_out;
0567 ldata->canon_column = ldata->column = 0;
0568 break;
0569 case '\t':
0570 goto break_out;
0571 case '\b':
0572 if (ldata->column > 0)
0573 ldata->column--;
0574 break;
0575 default:
0576 if (!iscntrl(c)) {
0577 if (O_OLCUC(tty))
0578 goto break_out;
0579 if (!is_continuation(c, tty))
0580 ldata->column++;
0581 }
0582 break;
0583 }
0584 }
0585 break_out:
0586 i = tty->ops->write(tty, buf, i);
0587
0588 mutex_unlock(&ldata->output_lock);
0589 return i;
0590 }
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614 static size_t __process_echoes(struct tty_struct *tty)
0615 {
0616 struct n_tty_data *ldata = tty->disc_data;
0617 int space, old_space;
0618 size_t tail;
0619 unsigned char c;
0620
0621 old_space = space = tty_write_room(tty);
0622
0623 tail = ldata->echo_tail;
0624 while (MASK(ldata->echo_commit) != MASK(tail)) {
0625 c = echo_buf(ldata, tail);
0626 if (c == ECHO_OP_START) {
0627 unsigned char op;
0628 int no_space_left = 0;
0629
0630
0631
0632
0633
0634
0635 if (MASK(ldata->echo_commit) == MASK(tail + 1))
0636 goto not_yet_stored;
0637
0638
0639
0640
0641
0642 op = echo_buf(ldata, tail + 1);
0643
0644 switch (op) {
0645 case ECHO_OP_ERASE_TAB: {
0646 unsigned int num_chars, num_bs;
0647
0648 if (MASK(ldata->echo_commit) == MASK(tail + 2))
0649 goto not_yet_stored;
0650 num_chars = echo_buf(ldata, tail + 2);
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662 if (!(num_chars & 0x80))
0663 num_chars += ldata->canon_column;
0664 num_bs = 8 - (num_chars & 7);
0665
0666 if (num_bs > space) {
0667 no_space_left = 1;
0668 break;
0669 }
0670 space -= num_bs;
0671 while (num_bs--) {
0672 tty_put_char(tty, '\b');
0673 if (ldata->column > 0)
0674 ldata->column--;
0675 }
0676 tail += 3;
0677 break;
0678 }
0679 case ECHO_OP_SET_CANON_COL:
0680 ldata->canon_column = ldata->column;
0681 tail += 2;
0682 break;
0683
0684 case ECHO_OP_MOVE_BACK_COL:
0685 if (ldata->column > 0)
0686 ldata->column--;
0687 tail += 2;
0688 break;
0689
0690 case ECHO_OP_START:
0691
0692 if (!space) {
0693 no_space_left = 1;
0694 break;
0695 }
0696 tty_put_char(tty, ECHO_OP_START);
0697 ldata->column++;
0698 space--;
0699 tail += 2;
0700 break;
0701
0702 default:
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712 if (space < 2) {
0713 no_space_left = 1;
0714 break;
0715 }
0716 tty_put_char(tty, '^');
0717 tty_put_char(tty, op ^ 0100);
0718 ldata->column += 2;
0719 space -= 2;
0720 tail += 2;
0721 }
0722
0723 if (no_space_left)
0724 break;
0725 } else {
0726 if (O_OPOST(tty)) {
0727 int retval = do_output_char(c, tty, space);
0728 if (retval < 0)
0729 break;
0730 space -= retval;
0731 } else {
0732 if (!space)
0733 break;
0734 tty_put_char(tty, c);
0735 space -= 1;
0736 }
0737 tail += 1;
0738 }
0739 }
0740
0741
0742
0743
0744 while (ldata->echo_commit > tail &&
0745 ldata->echo_commit - tail >= ECHO_DISCARD_WATERMARK) {
0746 if (echo_buf(ldata, tail) == ECHO_OP_START) {
0747 if (echo_buf(ldata, tail + 1) == ECHO_OP_ERASE_TAB)
0748 tail += 3;
0749 else
0750 tail += 2;
0751 } else
0752 tail++;
0753 }
0754
0755 not_yet_stored:
0756 ldata->echo_tail = tail;
0757 return old_space - space;
0758 }
0759
0760 static void commit_echoes(struct tty_struct *tty)
0761 {
0762 struct n_tty_data *ldata = tty->disc_data;
0763 size_t nr, old, echoed;
0764 size_t head;
0765
0766 mutex_lock(&ldata->output_lock);
0767 head = ldata->echo_head;
0768 ldata->echo_mark = head;
0769 old = ldata->echo_commit - ldata->echo_tail;
0770
0771
0772
0773
0774 nr = head - ldata->echo_tail;
0775 if (nr < ECHO_COMMIT_WATERMARK ||
0776 (nr % ECHO_BLOCK > old % ECHO_BLOCK)) {
0777 mutex_unlock(&ldata->output_lock);
0778 return;
0779 }
0780
0781 ldata->echo_commit = head;
0782 echoed = __process_echoes(tty);
0783 mutex_unlock(&ldata->output_lock);
0784
0785 if (echoed && tty->ops->flush_chars)
0786 tty->ops->flush_chars(tty);
0787 }
0788
0789 static void process_echoes(struct tty_struct *tty)
0790 {
0791 struct n_tty_data *ldata = tty->disc_data;
0792 size_t echoed;
0793
0794 if (ldata->echo_mark == ldata->echo_tail)
0795 return;
0796
0797 mutex_lock(&ldata->output_lock);
0798 ldata->echo_commit = ldata->echo_mark;
0799 echoed = __process_echoes(tty);
0800 mutex_unlock(&ldata->output_lock);
0801
0802 if (echoed && tty->ops->flush_chars)
0803 tty->ops->flush_chars(tty);
0804 }
0805
0806
0807 static void flush_echoes(struct tty_struct *tty)
0808 {
0809 struct n_tty_data *ldata = tty->disc_data;
0810
0811 if ((!L_ECHO(tty) && !L_ECHONL(tty)) ||
0812 ldata->echo_commit == ldata->echo_head)
0813 return;
0814
0815 mutex_lock(&ldata->output_lock);
0816 ldata->echo_commit = ldata->echo_head;
0817 __process_echoes(tty);
0818 mutex_unlock(&ldata->output_lock);
0819 }
0820
0821
0822
0823
0824
0825
0826
0827
0828 static inline void add_echo_byte(unsigned char c, struct n_tty_data *ldata)
0829 {
0830 *echo_buf_addr(ldata, ldata->echo_head) = c;
0831 smp_wmb();
0832 ldata->echo_head++;
0833 }
0834
0835
0836
0837
0838
0839
0840
0841 static void echo_move_back_col(struct n_tty_data *ldata)
0842 {
0843 add_echo_byte(ECHO_OP_START, ldata);
0844 add_echo_byte(ECHO_OP_MOVE_BACK_COL, ldata);
0845 }
0846
0847
0848
0849
0850
0851
0852
0853
0854 static void echo_set_canon_col(struct n_tty_data *ldata)
0855 {
0856 add_echo_byte(ECHO_OP_START, ldata);
0857 add_echo_byte(ECHO_OP_SET_CANON_COL, ldata);
0858 }
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873 static void echo_erase_tab(unsigned int num_chars, int after_tab,
0874 struct n_tty_data *ldata)
0875 {
0876 add_echo_byte(ECHO_OP_START, ldata);
0877 add_echo_byte(ECHO_OP_ERASE_TAB, ldata);
0878
0879
0880 num_chars &= 7;
0881
0882
0883 if (after_tab)
0884 num_chars |= 0x80;
0885
0886 add_echo_byte(num_chars, ldata);
0887 }
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898
0899 static void echo_char_raw(unsigned char c, struct n_tty_data *ldata)
0900 {
0901 if (c == ECHO_OP_START) {
0902 add_echo_byte(ECHO_OP_START, ldata);
0903 add_echo_byte(ECHO_OP_START, ldata);
0904 } else {
0905 add_echo_byte(c, ldata);
0906 }
0907 }
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920 static void echo_char(unsigned char c, struct tty_struct *tty)
0921 {
0922 struct n_tty_data *ldata = tty->disc_data;
0923
0924 if (c == ECHO_OP_START) {
0925 add_echo_byte(ECHO_OP_START, ldata);
0926 add_echo_byte(ECHO_OP_START, ldata);
0927 } else {
0928 if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
0929 add_echo_byte(ECHO_OP_START, ldata);
0930 add_echo_byte(c, ldata);
0931 }
0932 }
0933
0934
0935
0936
0937
0938 static inline void finish_erasing(struct n_tty_data *ldata)
0939 {
0940 if (ldata->erasing) {
0941 echo_char_raw('/', ldata);
0942 ldata->erasing = 0;
0943 }
0944 }
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958 static void eraser(unsigned char c, struct tty_struct *tty)
0959 {
0960 struct n_tty_data *ldata = tty->disc_data;
0961 enum { ERASE, WERASE, KILL } kill_type;
0962 size_t head;
0963 size_t cnt;
0964 int seen_alnums;
0965
0966 if (ldata->read_head == ldata->canon_head) {
0967
0968 return;
0969 }
0970 if (c == ERASE_CHAR(tty))
0971 kill_type = ERASE;
0972 else if (c == WERASE_CHAR(tty))
0973 kill_type = WERASE;
0974 else {
0975 if (!L_ECHO(tty)) {
0976 ldata->read_head = ldata->canon_head;
0977 return;
0978 }
0979 if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
0980 ldata->read_head = ldata->canon_head;
0981 finish_erasing(ldata);
0982 echo_char(KILL_CHAR(tty), tty);
0983
0984 if (L_ECHOK(tty))
0985 echo_char_raw('\n', ldata);
0986 return;
0987 }
0988 kill_type = KILL;
0989 }
0990
0991 seen_alnums = 0;
0992 while (MASK(ldata->read_head) != MASK(ldata->canon_head)) {
0993 head = ldata->read_head;
0994
0995
0996 do {
0997 head--;
0998 c = read_buf(ldata, head);
0999 } while (is_continuation(c, tty) &&
1000 MASK(head) != MASK(ldata->canon_head));
1001
1002
1003 if (is_continuation(c, tty))
1004 break;
1005
1006 if (kill_type == WERASE) {
1007
1008 if (isalnum(c) || c == '_')
1009 seen_alnums++;
1010 else if (seen_alnums)
1011 break;
1012 }
1013 cnt = ldata->read_head - head;
1014 ldata->read_head = head;
1015 if (L_ECHO(tty)) {
1016 if (L_ECHOPRT(tty)) {
1017 if (!ldata->erasing) {
1018 echo_char_raw('\\', ldata);
1019 ldata->erasing = 1;
1020 }
1021
1022 echo_char(c, tty);
1023 while (--cnt > 0) {
1024 head++;
1025 echo_char_raw(read_buf(ldata, head), ldata);
1026 echo_move_back_col(ldata);
1027 }
1028 } else if (kill_type == ERASE && !L_ECHOE(tty)) {
1029 echo_char(ERASE_CHAR(tty), tty);
1030 } else if (c == '\t') {
1031 unsigned int num_chars = 0;
1032 int after_tab = 0;
1033 size_t tail = ldata->read_head;
1034
1035
1036
1037
1038
1039
1040
1041
1042 while (MASK(tail) != MASK(ldata->canon_head)) {
1043 tail--;
1044 c = read_buf(ldata, tail);
1045 if (c == '\t') {
1046 after_tab = 1;
1047 break;
1048 } else if (iscntrl(c)) {
1049 if (L_ECHOCTL(tty))
1050 num_chars += 2;
1051 } else if (!is_continuation(c, tty)) {
1052 num_chars++;
1053 }
1054 }
1055 echo_erase_tab(num_chars, after_tab, ldata);
1056 } else {
1057 if (iscntrl(c) && L_ECHOCTL(tty)) {
1058 echo_char_raw('\b', ldata);
1059 echo_char_raw(' ', ldata);
1060 echo_char_raw('\b', ldata);
1061 }
1062 if (!iscntrl(c) || L_ECHOCTL(tty)) {
1063 echo_char_raw('\b', ldata);
1064 echo_char_raw(' ', ldata);
1065 echo_char_raw('\b', ldata);
1066 }
1067 }
1068 }
1069 if (kill_type == ERASE)
1070 break;
1071 }
1072 if (ldata->read_head == ldata->canon_head && L_ECHO(tty))
1073 finish_erasing(ldata);
1074 }
1075
1076
1077 static void __isig(int sig, struct tty_struct *tty)
1078 {
1079 struct pid *tty_pgrp = tty_get_pgrp(tty);
1080 if (tty_pgrp) {
1081 kill_pgrp(tty_pgrp, sig, 1);
1082 put_pid(tty_pgrp);
1083 }
1084 }
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100 static void isig(int sig, struct tty_struct *tty)
1101 {
1102 struct n_tty_data *ldata = tty->disc_data;
1103
1104 if (L_NOFLSH(tty)) {
1105
1106 __isig(sig, tty);
1107
1108 } else {
1109 up_read(&tty->termios_rwsem);
1110 down_write(&tty->termios_rwsem);
1111
1112 __isig(sig, tty);
1113
1114
1115 mutex_lock(&ldata->output_lock);
1116 ldata->echo_head = ldata->echo_tail = 0;
1117 ldata->echo_mark = ldata->echo_commit = 0;
1118 mutex_unlock(&ldata->output_lock);
1119
1120
1121 tty_driver_flush_buffer(tty);
1122
1123
1124 reset_buffer_flags(tty->disc_data);
1125
1126
1127 if (tty->link)
1128 n_tty_packet_mode_flush(tty);
1129
1130 up_write(&tty->termios_rwsem);
1131 down_read(&tty->termios_rwsem);
1132 }
1133 }
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147 static void n_tty_receive_break(struct tty_struct *tty)
1148 {
1149 struct n_tty_data *ldata = tty->disc_data;
1150
1151 if (I_IGNBRK(tty))
1152 return;
1153 if (I_BRKINT(tty)) {
1154 isig(SIGINT, tty);
1155 return;
1156 }
1157 if (I_PARMRK(tty)) {
1158 put_tty_queue('\377', ldata);
1159 put_tty_queue('\0', ldata);
1160 }
1161 put_tty_queue('\0', ldata);
1162 }
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174 static void n_tty_receive_overrun(struct tty_struct *tty)
1175 {
1176 struct n_tty_data *ldata = tty->disc_data;
1177
1178 ldata->num_overrun++;
1179 if (time_after(jiffies, ldata->overrun_time + HZ) ||
1180 time_after(ldata->overrun_time, jiffies)) {
1181 tty_warn(tty, "%d input overrun(s)\n", ldata->num_overrun);
1182 ldata->overrun_time = jiffies;
1183 ldata->num_overrun = 0;
1184 }
1185 }
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198 static void n_tty_receive_parity_error(struct tty_struct *tty, unsigned char c)
1199 {
1200 struct n_tty_data *ldata = tty->disc_data;
1201
1202 if (I_INPCK(tty)) {
1203 if (I_IGNPAR(tty))
1204 return;
1205 if (I_PARMRK(tty)) {
1206 put_tty_queue('\377', ldata);
1207 put_tty_queue('\0', ldata);
1208 put_tty_queue(c, ldata);
1209 } else
1210 put_tty_queue('\0', ldata);
1211 } else
1212 put_tty_queue(c, ldata);
1213 }
1214
1215 static void
1216 n_tty_receive_signal_char(struct tty_struct *tty, int signal, unsigned char c)
1217 {
1218 isig(signal, tty);
1219 if (I_IXON(tty))
1220 start_tty(tty);
1221 if (L_ECHO(tty)) {
1222 echo_char(c, tty);
1223 commit_echoes(tty);
1224 } else
1225 process_echoes(tty);
1226 }
1227
1228 static bool n_tty_is_char_flow_ctrl(struct tty_struct *tty, unsigned char c)
1229 {
1230 return c == START_CHAR(tty) || c == STOP_CHAR(tty);
1231 }
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248 static bool n_tty_receive_char_flow_ctrl(struct tty_struct *tty, unsigned char c,
1249 bool lookahead_done)
1250 {
1251 if (!n_tty_is_char_flow_ctrl(tty, c))
1252 return false;
1253
1254 if (lookahead_done)
1255 return true;
1256
1257 if (c == START_CHAR(tty)) {
1258 start_tty(tty);
1259 process_echoes(tty);
1260 return true;
1261 }
1262
1263
1264 stop_tty(tty);
1265 return true;
1266 }
1267
1268 static void n_tty_receive_char_special(struct tty_struct *tty, unsigned char c,
1269 bool lookahead_done)
1270 {
1271 struct n_tty_data *ldata = tty->disc_data;
1272
1273 if (I_IXON(tty) && n_tty_receive_char_flow_ctrl(tty, c, lookahead_done))
1274 return;
1275
1276 if (L_ISIG(tty)) {
1277 if (c == INTR_CHAR(tty)) {
1278 n_tty_receive_signal_char(tty, SIGINT, c);
1279 return;
1280 } else if (c == QUIT_CHAR(tty)) {
1281 n_tty_receive_signal_char(tty, SIGQUIT, c);
1282 return;
1283 } else if (c == SUSP_CHAR(tty)) {
1284 n_tty_receive_signal_char(tty, SIGTSTP, c);
1285 return;
1286 }
1287 }
1288
1289 if (tty->flow.stopped && !tty->flow.tco_stopped && I_IXON(tty) && I_IXANY(tty)) {
1290 start_tty(tty);
1291 process_echoes(tty);
1292 }
1293
1294 if (c == '\r') {
1295 if (I_IGNCR(tty))
1296 return;
1297 if (I_ICRNL(tty))
1298 c = '\n';
1299 } else if (c == '\n' && I_INLCR(tty))
1300 c = '\r';
1301
1302 if (ldata->icanon) {
1303 if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
1304 (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
1305 eraser(c, tty);
1306 commit_echoes(tty);
1307 return;
1308 }
1309 if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
1310 ldata->lnext = 1;
1311 if (L_ECHO(tty)) {
1312 finish_erasing(ldata);
1313 if (L_ECHOCTL(tty)) {
1314 echo_char_raw('^', ldata);
1315 echo_char_raw('\b', ldata);
1316 commit_echoes(tty);
1317 }
1318 }
1319 return;
1320 }
1321 if (c == REPRINT_CHAR(tty) && L_ECHO(tty) && L_IEXTEN(tty)) {
1322 size_t tail = ldata->canon_head;
1323
1324 finish_erasing(ldata);
1325 echo_char(c, tty);
1326 echo_char_raw('\n', ldata);
1327 while (MASK(tail) != MASK(ldata->read_head)) {
1328 echo_char(read_buf(ldata, tail), tty);
1329 tail++;
1330 }
1331 commit_echoes(tty);
1332 return;
1333 }
1334 if (c == '\n') {
1335 if (L_ECHO(tty) || L_ECHONL(tty)) {
1336 echo_char_raw('\n', ldata);
1337 commit_echoes(tty);
1338 }
1339 goto handle_newline;
1340 }
1341 if (c == EOF_CHAR(tty)) {
1342 c = __DISABLED_CHAR;
1343 goto handle_newline;
1344 }
1345 if ((c == EOL_CHAR(tty)) ||
1346 (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
1347
1348
1349
1350 if (L_ECHO(tty)) {
1351
1352 if (ldata->canon_head == ldata->read_head)
1353 echo_set_canon_col(ldata);
1354 echo_char(c, tty);
1355 commit_echoes(tty);
1356 }
1357
1358
1359
1360
1361 if (c == (unsigned char) '\377' && I_PARMRK(tty))
1362 put_tty_queue(c, ldata);
1363
1364 handle_newline:
1365 set_bit(ldata->read_head & (N_TTY_BUF_SIZE - 1), ldata->read_flags);
1366 put_tty_queue(c, ldata);
1367 smp_store_release(&ldata->canon_head, ldata->read_head);
1368 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1369 wake_up_interruptible_poll(&tty->read_wait, EPOLLIN | EPOLLRDNORM);
1370 return;
1371 }
1372 }
1373
1374 if (L_ECHO(tty)) {
1375 finish_erasing(ldata);
1376 if (c == '\n')
1377 echo_char_raw('\n', ldata);
1378 else {
1379
1380 if (ldata->canon_head == ldata->read_head)
1381 echo_set_canon_col(ldata);
1382 echo_char(c, tty);
1383 }
1384 commit_echoes(tty);
1385 }
1386
1387
1388 if (c == (unsigned char) '\377' && I_PARMRK(tty))
1389 put_tty_queue(c, ldata);
1390
1391 put_tty_queue(c, ldata);
1392 }
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406 static void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
1407 {
1408 struct n_tty_data *ldata = tty->disc_data;
1409
1410 if (tty->flow.stopped && !tty->flow.tco_stopped && I_IXON(tty) && I_IXANY(tty)) {
1411 start_tty(tty);
1412 process_echoes(tty);
1413 }
1414 if (L_ECHO(tty)) {
1415 finish_erasing(ldata);
1416
1417 if (ldata->canon_head == ldata->read_head)
1418 echo_set_canon_col(ldata);
1419 echo_char(c, tty);
1420 commit_echoes(tty);
1421 }
1422
1423 if (c == (unsigned char) '\377' && I_PARMRK(tty))
1424 put_tty_queue(c, ldata);
1425 put_tty_queue(c, ldata);
1426 }
1427
1428 static void n_tty_receive_char_closing(struct tty_struct *tty, unsigned char c,
1429 bool lookahead_done)
1430 {
1431 if (I_ISTRIP(tty))
1432 c &= 0x7f;
1433 if (I_IUCLC(tty) && L_IEXTEN(tty))
1434 c = tolower(c);
1435
1436 if (I_IXON(tty)) {
1437 if (!n_tty_receive_char_flow_ctrl(tty, c, lookahead_done) &&
1438 tty->flow.stopped && !tty->flow.tco_stopped && I_IXANY(tty) &&
1439 c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) &&
1440 c != SUSP_CHAR(tty)) {
1441 start_tty(tty);
1442 process_echoes(tty);
1443 }
1444 }
1445 }
1446
1447 static void
1448 n_tty_receive_char_flagged(struct tty_struct *tty, unsigned char c, char flag)
1449 {
1450 switch (flag) {
1451 case TTY_BREAK:
1452 n_tty_receive_break(tty);
1453 break;
1454 case TTY_PARITY:
1455 case TTY_FRAME:
1456 n_tty_receive_parity_error(tty, c);
1457 break;
1458 case TTY_OVERRUN:
1459 n_tty_receive_overrun(tty);
1460 break;
1461 default:
1462 tty_err(tty, "unknown flag %d\n", flag);
1463 break;
1464 }
1465 }
1466
1467 static void
1468 n_tty_receive_char_lnext(struct tty_struct *tty, unsigned char c, char flag)
1469 {
1470 struct n_tty_data *ldata = tty->disc_data;
1471
1472 ldata->lnext = 0;
1473 if (likely(flag == TTY_NORMAL)) {
1474 if (I_ISTRIP(tty))
1475 c &= 0x7f;
1476 if (I_IUCLC(tty) && L_IEXTEN(tty))
1477 c = tolower(c);
1478 n_tty_receive_char(tty, c);
1479 } else
1480 n_tty_receive_char_flagged(tty, c, flag);
1481 }
1482
1483
1484 static void n_tty_lookahead_flow_ctrl(struct tty_struct *tty, const unsigned char *cp,
1485 const unsigned char *fp, unsigned int count)
1486 {
1487 struct n_tty_data *ldata = tty->disc_data;
1488 unsigned char flag = TTY_NORMAL;
1489
1490 ldata->lookahead_count += count;
1491
1492 if (!I_IXON(tty))
1493 return;
1494
1495 while (count--) {
1496 if (fp)
1497 flag = *fp++;
1498 if (likely(flag == TTY_NORMAL))
1499 n_tty_receive_char_flow_ctrl(tty, *cp, false);
1500 cp++;
1501 }
1502 }
1503
1504 static void
1505 n_tty_receive_buf_real_raw(struct tty_struct *tty, const unsigned char *cp,
1506 const char *fp, int count)
1507 {
1508 struct n_tty_data *ldata = tty->disc_data;
1509 size_t n, head;
1510
1511 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1512 n = min_t(size_t, count, N_TTY_BUF_SIZE - head);
1513 memcpy(read_buf_addr(ldata, head), cp, n);
1514 ldata->read_head += n;
1515 cp += n;
1516 count -= n;
1517
1518 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1519 n = min_t(size_t, count, N_TTY_BUF_SIZE - head);
1520 memcpy(read_buf_addr(ldata, head), cp, n);
1521 ldata->read_head += n;
1522 }
1523
1524 static void
1525 n_tty_receive_buf_raw(struct tty_struct *tty, const unsigned char *cp,
1526 const char *fp, int count)
1527 {
1528 struct n_tty_data *ldata = tty->disc_data;
1529 char flag = TTY_NORMAL;
1530
1531 while (count--) {
1532 if (fp)
1533 flag = *fp++;
1534 if (likely(flag == TTY_NORMAL))
1535 put_tty_queue(*cp++, ldata);
1536 else
1537 n_tty_receive_char_flagged(tty, *cp++, flag);
1538 }
1539 }
1540
1541 static void
1542 n_tty_receive_buf_closing(struct tty_struct *tty, const unsigned char *cp,
1543 const char *fp, int count, bool lookahead_done)
1544 {
1545 char flag = TTY_NORMAL;
1546
1547 while (count--) {
1548 if (fp)
1549 flag = *fp++;
1550 if (likely(flag == TTY_NORMAL))
1551 n_tty_receive_char_closing(tty, *cp++, lookahead_done);
1552 }
1553 }
1554
1555 static void n_tty_receive_buf_standard(struct tty_struct *tty,
1556 const unsigned char *cp, const char *fp, int count, bool lookahead_done)
1557 {
1558 struct n_tty_data *ldata = tty->disc_data;
1559 char flag = TTY_NORMAL;
1560
1561 while (count--) {
1562 unsigned char c = *cp++;
1563
1564 if (fp)
1565 flag = *fp++;
1566
1567 if (ldata->lnext) {
1568 n_tty_receive_char_lnext(tty, c, flag);
1569 continue;
1570 }
1571
1572 if (unlikely(flag != TTY_NORMAL)) {
1573 n_tty_receive_char_flagged(tty, c, flag);
1574 continue;
1575 }
1576
1577 if (I_ISTRIP(tty))
1578 c &= 0x7f;
1579 if (I_IUCLC(tty) && L_IEXTEN(tty))
1580 c = tolower(c);
1581 if (L_EXTPROC(tty)) {
1582 put_tty_queue(c, ldata);
1583 continue;
1584 }
1585
1586 if (test_bit(c, ldata->char_map))
1587 n_tty_receive_char_special(tty, c, lookahead_done);
1588 else
1589 n_tty_receive_char(tty, c);
1590 }
1591 }
1592
1593 static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
1594 const char *fp, int count)
1595 {
1596 struct n_tty_data *ldata = tty->disc_data;
1597 bool preops = I_ISTRIP(tty) || (I_IUCLC(tty) && L_IEXTEN(tty));
1598 size_t la_count = min_t(size_t, ldata->lookahead_count, count);
1599
1600 if (ldata->real_raw)
1601 n_tty_receive_buf_real_raw(tty, cp, fp, count);
1602 else if (ldata->raw || (L_EXTPROC(tty) && !preops))
1603 n_tty_receive_buf_raw(tty, cp, fp, count);
1604 else if (tty->closing && !L_EXTPROC(tty)) {
1605 if (la_count > 0)
1606 n_tty_receive_buf_closing(tty, cp, fp, la_count, true);
1607 if (count > la_count)
1608 n_tty_receive_buf_closing(tty, cp, fp, count - la_count, false);
1609 } else {
1610 if (la_count > 0)
1611 n_tty_receive_buf_standard(tty, cp, fp, la_count, true);
1612 if (count > la_count)
1613 n_tty_receive_buf_standard(tty, cp, fp, count - la_count, false);
1614
1615 flush_echoes(tty);
1616 if (tty->ops->flush_chars)
1617 tty->ops->flush_chars(tty);
1618 }
1619
1620 ldata->lookahead_count -= la_count;
1621
1622 if (ldata->icanon && !L_EXTPROC(tty))
1623 return;
1624
1625
1626 smp_store_release(&ldata->commit_head, ldata->read_head);
1627
1628 if (read_cnt(ldata)) {
1629 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1630 wake_up_interruptible_poll(&tty->read_wait, EPOLLIN | EPOLLRDNORM);
1631 }
1632 }
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667 static int
1668 n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,
1669 const char *fp, int count, int flow)
1670 {
1671 struct n_tty_data *ldata = tty->disc_data;
1672 int room, n, rcvd = 0, overflow;
1673
1674 down_read(&tty->termios_rwsem);
1675
1676 do {
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690 size_t tail = smp_load_acquire(&ldata->read_tail);
1691
1692 room = N_TTY_BUF_SIZE - (ldata->read_head - tail);
1693 if (I_PARMRK(tty))
1694 room = (room + 2) / 3;
1695 room--;
1696 if (room <= 0) {
1697 overflow = ldata->icanon && ldata->canon_head == tail;
1698 if (overflow && room < 0)
1699 ldata->read_head--;
1700 room = overflow;
1701 ldata->no_room = flow && !room;
1702 } else
1703 overflow = 0;
1704
1705 n = min(count, room);
1706 if (!n)
1707 break;
1708
1709
1710 if (!overflow || !fp || *fp != TTY_PARITY)
1711 __receive_buf(tty, cp, fp, n);
1712
1713 cp += n;
1714 if (fp)
1715 fp += n;
1716 count -= n;
1717 rcvd += n;
1718 } while (!test_bit(TTY_LDISC_CHANGING, &tty->flags));
1719
1720 tty->receive_room = room;
1721
1722
1723 if (tty->driver->type == TTY_DRIVER_TYPE_PTY) {
1724 if (overflow) {
1725 tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
1726 tty_unthrottle_safe(tty);
1727 __tty_set_flow_change(tty, 0);
1728 }
1729 } else
1730 n_tty_check_throttle(tty);
1731
1732 up_read(&tty->termios_rwsem);
1733
1734 return rcvd;
1735 }
1736
1737 static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1738 const char *fp, int count)
1739 {
1740 n_tty_receive_buf_common(tty, cp, fp, count, 0);
1741 }
1742
1743 static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
1744 const char *fp, int count)
1745 {
1746 return n_tty_receive_buf_common(tty, cp, fp, count, 1);
1747 }
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761 static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
1762 {
1763 struct n_tty_data *ldata = tty->disc_data;
1764
1765 if (!old || (old->c_lflag ^ tty->termios.c_lflag) & (ICANON | EXTPROC)) {
1766 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
1767 ldata->line_start = ldata->read_tail;
1768 if (!L_ICANON(tty) || !read_cnt(ldata)) {
1769 ldata->canon_head = ldata->read_tail;
1770 ldata->push = 0;
1771 } else {
1772 set_bit((ldata->read_head - 1) & (N_TTY_BUF_SIZE - 1),
1773 ldata->read_flags);
1774 ldata->canon_head = ldata->read_head;
1775 ldata->push = 1;
1776 }
1777 ldata->commit_head = ldata->read_head;
1778 ldata->erasing = 0;
1779 ldata->lnext = 0;
1780 }
1781
1782 ldata->icanon = (L_ICANON(tty) != 0);
1783
1784 if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
1785 I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
1786 I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
1787 I_PARMRK(tty)) {
1788 bitmap_zero(ldata->char_map, 256);
1789
1790 if (I_IGNCR(tty) || I_ICRNL(tty))
1791 set_bit('\r', ldata->char_map);
1792 if (I_INLCR(tty))
1793 set_bit('\n', ldata->char_map);
1794
1795 if (L_ICANON(tty)) {
1796 set_bit(ERASE_CHAR(tty), ldata->char_map);
1797 set_bit(KILL_CHAR(tty), ldata->char_map);
1798 set_bit(EOF_CHAR(tty), ldata->char_map);
1799 set_bit('\n', ldata->char_map);
1800 set_bit(EOL_CHAR(tty), ldata->char_map);
1801 if (L_IEXTEN(tty)) {
1802 set_bit(WERASE_CHAR(tty), ldata->char_map);
1803 set_bit(LNEXT_CHAR(tty), ldata->char_map);
1804 set_bit(EOL2_CHAR(tty), ldata->char_map);
1805 if (L_ECHO(tty))
1806 set_bit(REPRINT_CHAR(tty),
1807 ldata->char_map);
1808 }
1809 }
1810 if (I_IXON(tty)) {
1811 set_bit(START_CHAR(tty), ldata->char_map);
1812 set_bit(STOP_CHAR(tty), ldata->char_map);
1813 }
1814 if (L_ISIG(tty)) {
1815 set_bit(INTR_CHAR(tty), ldata->char_map);
1816 set_bit(QUIT_CHAR(tty), ldata->char_map);
1817 set_bit(SUSP_CHAR(tty), ldata->char_map);
1818 }
1819 clear_bit(__DISABLED_CHAR, ldata->char_map);
1820 ldata->raw = 0;
1821 ldata->real_raw = 0;
1822 } else {
1823 ldata->raw = 1;
1824 if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
1825 (I_IGNPAR(tty) || !I_INPCK(tty)) &&
1826 (tty->driver->flags & TTY_DRIVER_REAL_RAW))
1827 ldata->real_raw = 1;
1828 else
1829 ldata->real_raw = 0;
1830 }
1831
1832
1833
1834
1835 if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow.tco_stopped) {
1836 start_tty(tty);
1837 process_echoes(tty);
1838 }
1839
1840
1841 wake_up_interruptible(&tty->write_wait);
1842 wake_up_interruptible(&tty->read_wait);
1843 }
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853 static void n_tty_close(struct tty_struct *tty)
1854 {
1855 struct n_tty_data *ldata = tty->disc_data;
1856
1857 if (tty->link)
1858 n_tty_packet_mode_flush(tty);
1859
1860 down_write(&tty->termios_rwsem);
1861 vfree(ldata);
1862 tty->disc_data = NULL;
1863 up_write(&tty->termios_rwsem);
1864 }
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874 static int n_tty_open(struct tty_struct *tty)
1875 {
1876 struct n_tty_data *ldata;
1877
1878
1879 ldata = vzalloc(sizeof(*ldata));
1880 if (!ldata)
1881 return -ENOMEM;
1882
1883 ldata->overrun_time = jiffies;
1884 mutex_init(&ldata->atomic_read_lock);
1885 mutex_init(&ldata->output_lock);
1886
1887 tty->disc_data = ldata;
1888 tty->closing = 0;
1889
1890 clear_bit(TTY_LDISC_HALTED, &tty->flags);
1891 n_tty_set_termios(tty, NULL);
1892 tty_unthrottle(tty);
1893 return 0;
1894 }
1895
1896 static inline int input_available_p(struct tty_struct *tty, int poll)
1897 {
1898 struct n_tty_data *ldata = tty->disc_data;
1899 int amt = poll && !TIME_CHAR(tty) && MIN_CHAR(tty) ? MIN_CHAR(tty) : 1;
1900
1901 if (ldata->icanon && !L_EXTPROC(tty))
1902 return ldata->canon_head != ldata->read_tail;
1903 else
1904 return ldata->commit_head - ldata->read_tail >= amt;
1905 }
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925 static bool copy_from_read_buf(struct tty_struct *tty,
1926 unsigned char **kbp,
1927 size_t *nr)
1928
1929 {
1930 struct n_tty_data *ldata = tty->disc_data;
1931 size_t n;
1932 bool is_eof;
1933 size_t head = smp_load_acquire(&ldata->commit_head);
1934 size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
1935
1936 n = min(head - ldata->read_tail, N_TTY_BUF_SIZE - tail);
1937 n = min(*nr, n);
1938 if (n) {
1939 unsigned char *from = read_buf_addr(ldata, tail);
1940 memcpy(*kbp, from, n);
1941 is_eof = n == 1 && *from == EOF_CHAR(tty);
1942 tty_audit_add_data(tty, from, n);
1943 zero_buffer(tty, from, n);
1944 smp_store_release(&ldata->read_tail, ldata->read_tail + n);
1945
1946 if (L_EXTPROC(tty) && ldata->icanon && is_eof &&
1947 (head == ldata->read_tail))
1948 return false;
1949 *kbp += n;
1950 *nr -= n;
1951
1952
1953 return head != ldata->read_tail;
1954 }
1955 return false;
1956 }
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980 static bool canon_copy_from_read_buf(struct tty_struct *tty,
1981 unsigned char **kbp,
1982 size_t *nr)
1983 {
1984 struct n_tty_data *ldata = tty->disc_data;
1985 size_t n, size, more, c;
1986 size_t eol;
1987 size_t tail, canon_head;
1988 int found = 0;
1989
1990
1991 if (!*nr)
1992 return false;
1993
1994 canon_head = smp_load_acquire(&ldata->canon_head);
1995 n = min(*nr, canon_head - ldata->read_tail);
1996
1997 tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
1998 size = min_t(size_t, tail + n, N_TTY_BUF_SIZE);
1999
2000 n_tty_trace("%s: nr:%zu tail:%zu n:%zu size:%zu\n",
2001 __func__, *nr, tail, n, size);
2002
2003 eol = find_next_bit(ldata->read_flags, size, tail);
2004 more = n - (size - tail);
2005 if (eol == N_TTY_BUF_SIZE && more) {
2006
2007 eol = find_first_bit(ldata->read_flags, more);
2008 found = eol != more;
2009 } else
2010 found = eol != size;
2011
2012 n = eol - tail;
2013 if (n > N_TTY_BUF_SIZE)
2014 n += N_TTY_BUF_SIZE;
2015 c = n + found;
2016
2017 if (!found || read_buf(ldata, eol) != __DISABLED_CHAR)
2018 n = c;
2019
2020 n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu tail:%zu more:%zu\n",
2021 __func__, eol, found, n, c, tail, more);
2022
2023 tty_copy(tty, *kbp, tail, n);
2024 *kbp += n;
2025 *nr -= n;
2026
2027 if (found)
2028 clear_bit(eol, ldata->read_flags);
2029 smp_store_release(&ldata->read_tail, ldata->read_tail + c);
2030
2031 if (found) {
2032 if (!ldata->push)
2033 ldata->line_start = ldata->read_tail;
2034 else
2035 ldata->push = 0;
2036 tty_audit_push();
2037 return false;
2038 }
2039
2040
2041 return ldata->read_tail != canon_head;
2042 }
2043
2044
2045
2046
2047
2048
2049 static void canon_skip_eof(struct tty_struct *tty)
2050 {
2051 struct n_tty_data *ldata = tty->disc_data;
2052 size_t tail, canon_head;
2053
2054 canon_head = smp_load_acquire(&ldata->canon_head);
2055 tail = ldata->read_tail;
2056
2057
2058 if (tail == canon_head)
2059 return;
2060
2061
2062 tail &= (N_TTY_BUF_SIZE - 1);
2063 if (!test_bit(tail, ldata->read_flags))
2064 return;
2065 if (read_buf(ldata, tail) != __DISABLED_CHAR)
2066 return;
2067
2068
2069 clear_bit(tail, ldata->read_flags);
2070 smp_store_release(&ldata->read_tail, ldata->read_tail + 1);
2071 }
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087 static int job_control(struct tty_struct *tty, struct file *file)
2088 {
2089
2090
2091
2092
2093
2094 if (file->f_op->write_iter == redirected_tty_write)
2095 return 0;
2096
2097 return __tty_check_change(tty, SIGTTIN);
2098 }
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121 static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
2122 unsigned char *kbuf, size_t nr,
2123 void **cookie, unsigned long offset)
2124 {
2125 struct n_tty_data *ldata = tty->disc_data;
2126 unsigned char *kb = kbuf;
2127 DEFINE_WAIT_FUNC(wait, woken_wake_function);
2128 int c;
2129 int minimum, time;
2130 ssize_t retval = 0;
2131 long timeout;
2132 bool packet;
2133 size_t tail;
2134
2135
2136
2137
2138
2139
2140
2141 if (*cookie) {
2142 if (ldata->icanon && !L_EXTPROC(tty)) {
2143
2144
2145
2146
2147
2148 if (!nr)
2149 canon_skip_eof(tty);
2150 else if (canon_copy_from_read_buf(tty, &kb, &nr))
2151 return kb - kbuf;
2152 } else {
2153 if (copy_from_read_buf(tty, &kb, &nr))
2154 return kb - kbuf;
2155 }
2156
2157
2158 n_tty_kick_worker(tty);
2159 n_tty_check_unthrottle(tty);
2160 up_read(&tty->termios_rwsem);
2161 mutex_unlock(&ldata->atomic_read_lock);
2162 *cookie = NULL;
2163 return kb - kbuf;
2164 }
2165
2166 c = job_control(tty, file);
2167 if (c < 0)
2168 return c;
2169
2170
2171
2172
2173 if (file->f_flags & O_NONBLOCK) {
2174 if (!mutex_trylock(&ldata->atomic_read_lock))
2175 return -EAGAIN;
2176 } else {
2177 if (mutex_lock_interruptible(&ldata->atomic_read_lock))
2178 return -ERESTARTSYS;
2179 }
2180
2181 down_read(&tty->termios_rwsem);
2182
2183 minimum = time = 0;
2184 timeout = MAX_SCHEDULE_TIMEOUT;
2185 if (!ldata->icanon) {
2186 minimum = MIN_CHAR(tty);
2187 if (minimum) {
2188 time = (HZ / 10) * TIME_CHAR(tty);
2189 } else {
2190 timeout = (HZ / 10) * TIME_CHAR(tty);
2191 minimum = 1;
2192 }
2193 }
2194
2195 packet = tty->ctrl.packet;
2196 tail = ldata->read_tail;
2197
2198 add_wait_queue(&tty->read_wait, &wait);
2199 while (nr) {
2200
2201 if (packet && tty->link->ctrl.pktstatus) {
2202 unsigned char cs;
2203 if (kb != kbuf)
2204 break;
2205 spin_lock_irq(&tty->link->ctrl.lock);
2206 cs = tty->link->ctrl.pktstatus;
2207 tty->link->ctrl.pktstatus = 0;
2208 spin_unlock_irq(&tty->link->ctrl.lock);
2209 *kb++ = cs;
2210 nr--;
2211 break;
2212 }
2213
2214 if (!input_available_p(tty, 0)) {
2215 up_read(&tty->termios_rwsem);
2216 tty_buffer_flush_work(tty->port);
2217 down_read(&tty->termios_rwsem);
2218 if (!input_available_p(tty, 0)) {
2219 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
2220 retval = -EIO;
2221 break;
2222 }
2223 if (tty_hung_up_p(file))
2224 break;
2225
2226
2227
2228
2229 if (test_bit(TTY_HUPPING, &tty->flags))
2230 break;
2231 if (!timeout)
2232 break;
2233 if (tty_io_nonblock(tty, file)) {
2234 retval = -EAGAIN;
2235 break;
2236 }
2237 if (signal_pending(current)) {
2238 retval = -ERESTARTSYS;
2239 break;
2240 }
2241 up_read(&tty->termios_rwsem);
2242
2243 timeout = wait_woken(&wait, TASK_INTERRUPTIBLE,
2244 timeout);
2245
2246 down_read(&tty->termios_rwsem);
2247 continue;
2248 }
2249 }
2250
2251 if (ldata->icanon && !L_EXTPROC(tty)) {
2252 if (canon_copy_from_read_buf(tty, &kb, &nr))
2253 goto more_to_be_read;
2254 } else {
2255
2256 if (packet && kb == kbuf) {
2257 *kb++ = TIOCPKT_DATA;
2258 nr--;
2259 }
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270 if (copy_from_read_buf(tty, &kb, &nr) && kb - kbuf >= minimum) {
2271 more_to_be_read:
2272 remove_wait_queue(&tty->read_wait, &wait);
2273 *cookie = cookie;
2274 return kb - kbuf;
2275 }
2276 }
2277
2278 n_tty_check_unthrottle(tty);
2279
2280 if (kb - kbuf >= minimum)
2281 break;
2282 if (time)
2283 timeout = time;
2284 }
2285 if (tail != ldata->read_tail)
2286 n_tty_kick_worker(tty);
2287 up_read(&tty->termios_rwsem);
2288
2289 remove_wait_queue(&tty->read_wait, &wait);
2290 mutex_unlock(&ldata->atomic_read_lock);
2291
2292 if (kb - kbuf)
2293 retval = kb - kbuf;
2294
2295 return retval;
2296 }
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318 static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
2319 const unsigned char *buf, size_t nr)
2320 {
2321 const unsigned char *b = buf;
2322 DEFINE_WAIT_FUNC(wait, woken_wake_function);
2323 int c;
2324 ssize_t retval = 0;
2325
2326
2327 if (L_TOSTOP(tty) && file->f_op->write_iter != redirected_tty_write) {
2328 retval = tty_check_change(tty);
2329 if (retval)
2330 return retval;
2331 }
2332
2333 down_read(&tty->termios_rwsem);
2334
2335
2336 process_echoes(tty);
2337
2338 add_wait_queue(&tty->write_wait, &wait);
2339 while (1) {
2340 if (signal_pending(current)) {
2341 retval = -ERESTARTSYS;
2342 break;
2343 }
2344 if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
2345 retval = -EIO;
2346 break;
2347 }
2348 if (O_OPOST(tty)) {
2349 while (nr > 0) {
2350 ssize_t num = process_output_block(tty, b, nr);
2351 if (num < 0) {
2352 if (num == -EAGAIN)
2353 break;
2354 retval = num;
2355 goto break_out;
2356 }
2357 b += num;
2358 nr -= num;
2359 if (nr == 0)
2360 break;
2361 c = *b;
2362 if (process_output(c, tty) < 0)
2363 break;
2364 b++; nr--;
2365 }
2366 if (tty->ops->flush_chars)
2367 tty->ops->flush_chars(tty);
2368 } else {
2369 struct n_tty_data *ldata = tty->disc_data;
2370
2371 while (nr > 0) {
2372 mutex_lock(&ldata->output_lock);
2373 c = tty->ops->write(tty, b, nr);
2374 mutex_unlock(&ldata->output_lock);
2375 if (c < 0) {
2376 retval = c;
2377 goto break_out;
2378 }
2379 if (!c)
2380 break;
2381 b += c;
2382 nr -= c;
2383 }
2384 }
2385 if (!nr)
2386 break;
2387 if (tty_io_nonblock(tty, file)) {
2388 retval = -EAGAIN;
2389 break;
2390 }
2391 up_read(&tty->termios_rwsem);
2392
2393 wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
2394
2395 down_read(&tty->termios_rwsem);
2396 }
2397 break_out:
2398 remove_wait_queue(&tty->write_wait, &wait);
2399 if (nr && tty->fasync)
2400 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
2401 up_read(&tty->termios_rwsem);
2402 return (b - buf) ? b - buf : retval;
2403 }
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419 static __poll_t n_tty_poll(struct tty_struct *tty, struct file *file,
2420 poll_table *wait)
2421 {
2422 __poll_t mask = 0;
2423
2424 poll_wait(file, &tty->read_wait, wait);
2425 poll_wait(file, &tty->write_wait, wait);
2426 if (input_available_p(tty, 1))
2427 mask |= EPOLLIN | EPOLLRDNORM;
2428 else {
2429 tty_buffer_flush_work(tty->port);
2430 if (input_available_p(tty, 1))
2431 mask |= EPOLLIN | EPOLLRDNORM;
2432 }
2433 if (tty->ctrl.packet && tty->link->ctrl.pktstatus)
2434 mask |= EPOLLPRI | EPOLLIN | EPOLLRDNORM;
2435 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
2436 mask |= EPOLLHUP;
2437 if (tty_hung_up_p(file))
2438 mask |= EPOLLHUP;
2439 if (tty->ops->write && !tty_is_writelocked(tty) &&
2440 tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
2441 tty_write_room(tty) > 0)
2442 mask |= EPOLLOUT | EPOLLWRNORM;
2443 return mask;
2444 }
2445
2446 static unsigned long inq_canon(struct n_tty_data *ldata)
2447 {
2448 size_t nr, head, tail;
2449
2450 if (ldata->canon_head == ldata->read_tail)
2451 return 0;
2452 head = ldata->canon_head;
2453 tail = ldata->read_tail;
2454 nr = head - tail;
2455
2456 while (MASK(head) != MASK(tail)) {
2457 if (test_bit(tail & (N_TTY_BUF_SIZE - 1), ldata->read_flags) &&
2458 read_buf(ldata, tail) == __DISABLED_CHAR)
2459 nr--;
2460 tail++;
2461 }
2462 return nr;
2463 }
2464
2465 static int n_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
2466 unsigned long arg)
2467 {
2468 struct n_tty_data *ldata = tty->disc_data;
2469 int retval;
2470
2471 switch (cmd) {
2472 case TIOCOUTQ:
2473 return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
2474 case TIOCINQ:
2475 down_write(&tty->termios_rwsem);
2476 if (L_ICANON(tty) && !L_EXTPROC(tty))
2477 retval = inq_canon(ldata);
2478 else
2479 retval = read_cnt(ldata);
2480 up_write(&tty->termios_rwsem);
2481 return put_user(retval, (unsigned int __user *) arg);
2482 default:
2483 return n_tty_ioctl_helper(tty, cmd, arg);
2484 }
2485 }
2486
2487 static struct tty_ldisc_ops n_tty_ops = {
2488 .owner = THIS_MODULE,
2489 .num = N_TTY,
2490 .name = "n_tty",
2491 .open = n_tty_open,
2492 .close = n_tty_close,
2493 .flush_buffer = n_tty_flush_buffer,
2494 .read = n_tty_read,
2495 .write = n_tty_write,
2496 .ioctl = n_tty_ioctl,
2497 .set_termios = n_tty_set_termios,
2498 .poll = n_tty_poll,
2499 .receive_buf = n_tty_receive_buf,
2500 .write_wakeup = n_tty_write_wakeup,
2501 .receive_buf2 = n_tty_receive_buf2,
2502 .lookahead_buf = n_tty_lookahead_flow_ctrl,
2503 };
2504
2505
2506
2507
2508
2509
2510
2511
2512 void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
2513 {
2514 *ops = n_tty_ops;
2515 ops->owner = NULL;
2516 }
2517 EXPORT_SYMBOL_GPL(n_tty_inherit_ops);
2518
2519 void __init n_tty_init(void)
2520 {
2521 tty_register_ldisc(&n_tty_ops);
2522 }