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 0 : unsigned short tmp; 24 : 25 0 : if (get_user(tmp, &termio->c_iflag) < 0) 26 0 : goto fault; 27 0 : termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp; 28 : 29 0 : if (get_user(tmp, &termio->c_oflag) < 0) 30 0 : goto fault; 31 0 : termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp; 32 : 33 0 : if (get_user(tmp, &termio->c_cflag) < 0) 34 0 : goto fault; 35 0 : termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp; 36 : 37 0 : if (get_user(tmp, &termio->c_lflag) < 0) 38 0 : 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 0 : goto fault; 43 : 44 0 : if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0) 45 0 : 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 0 : 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 4 : static inline int user_termios_to_kernel_termios_1(struct ktermios *k, 84 : struct termios __user *u) 85 : { 86 4 : return copy_from_user(k, u, sizeof(struct termios)); 87 : } 88 : 89 164 : static inline int kernel_termios_to_user_termios_1(struct termios __user *u, 90 : struct ktermios *k) 91 : { 92 164 : 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 */