Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _ASM_GENERIC_TERMIOS_H 3 : : #define _ASM_GENERIC_TERMIOS_H 4 : : 5 : : 6 : : #include <linux/uaccess.h> 7 : : #include <uapi/asm-generic/termios.h> 8 : : 9 : : /* intr=^C quit=^\ erase=del kill=^U 10 : : eof=^D vtime=\0 vmin=\1 sxtc=\0 11 : : start=^Q stop=^S susp=^Z eol=\0 12 : : reprint=^R discard=^U werase=^W lnext=^V 13 : : eol2=\0 14 : : */ 15 : : #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" 16 : : 17 : : /* 18 : : * Translate a "termio" structure into a "termios". Ugh. 19 : : */ 20 : 0 : static inline int user_termio_to_kernel_termios(struct ktermios *termios, 21 : : const struct termio __user *termio) 22 : : { 23 : : unsigned short tmp; 24 : : 25 : 0 : if (get_user(tmp, &termio->c_iflag) < 0) 26 : : goto fault; 27 : 0 : termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp; 28 : : 29 : 0 : if (get_user(tmp, &termio->c_oflag) < 0) 30 : : goto fault; 31 : 0 : termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp; 32 : : 33 : 0 : if (get_user(tmp, &termio->c_cflag) < 0) 34 : : goto fault; 35 : 0 : termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp; 36 : : 37 : 0 : if (get_user(tmp, &termio->c_lflag) < 0) 38 : : goto fault; 39 : 0 : termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp; 40 : : 41 : 0 : if (get_user(termios->c_line, &termio->c_line) < 0) 42 : : goto fault; 43 : : 44 : 0 : if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0) 45 : : goto fault; 46 : : 47 : : return 0; 48 : : 49 : : fault: 50 : : return -EFAULT; 51 : : } 52 : : 53 : : /* 54 : : * Translate a "termios" structure into a "termio". Ugh. 55 : : */ 56 : 0 : static inline int kernel_termios_to_user_termio(struct termio __user *termio, 57 : : struct ktermios *termios) 58 : : { 59 : 0 : if (put_user(termios->c_iflag, &termio->c_iflag) < 0 || 60 : 0 : put_user(termios->c_oflag, &termio->c_oflag) < 0 || 61 : 0 : put_user(termios->c_cflag, &termio->c_cflag) < 0 || 62 : 0 : put_user(termios->c_lflag, &termio->c_lflag) < 0 || 63 : 0 : put_user(termios->c_line, &termio->c_line) < 0 || 64 : 0 : copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0) 65 : : return -EFAULT; 66 : : 67 : : return 0; 68 : : } 69 : : 70 : : #ifdef TCGETS2 71 : 0 : static inline int user_termios_to_kernel_termios(struct ktermios *k, 72 : : struct termios2 __user *u) 73 : : { 74 : 0 : return copy_from_user(k, u, sizeof(struct termios2)); 75 : : } 76 : : 77 : 0 : static inline int kernel_termios_to_user_termios(struct termios2 __user *u, 78 : : struct ktermios *k) 79 : : { 80 : 0 : return copy_to_user(u, k, sizeof(struct termios2)); 81 : : } 82 : : 83 : 3 : static inline int user_termios_to_kernel_termios_1(struct ktermios *k, 84 : : struct termios __user *u) 85 : : { 86 : 3 : return copy_from_user(k, u, sizeof(struct termios)); 87 : : } 88 : : 89 : 3 : static inline int kernel_termios_to_user_termios_1(struct termios __user *u, 90 : : struct ktermios *k) 91 : : { 92 : 3 : return copy_to_user(u, k, sizeof(struct termios)); 93 : : } 94 : : #else /* TCGETS2 */ 95 : : static inline int user_termios_to_kernel_termios(struct ktermios *k, 96 : : struct termios __user *u) 97 : : { 98 : : return copy_from_user(k, u, sizeof(struct termios)); 99 : : } 100 : : 101 : : static inline int kernel_termios_to_user_termios(struct termios __user *u, 102 : : struct ktermios *k) 103 : : { 104 : : return copy_to_user(u, k, sizeof(struct termios)); 105 : : } 106 : : #endif /* TCGETS2 */ 107 : : 108 : : #endif /* _ASM_GENERIC_TERMIOS_H */