termios.h (2877B)
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 */ 20static inline int user_termio_to_kernel_termios(struct ktermios *termios, 21 const struct termio __user *termio) 22{ 23 unsigned short tmp; 24 25 if (get_user(tmp, &termio->c_iflag) < 0) 26 goto fault; 27 termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp; 28 29 if (get_user(tmp, &termio->c_oflag) < 0) 30 goto fault; 31 termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp; 32 33 if (get_user(tmp, &termio->c_cflag) < 0) 34 goto fault; 35 termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp; 36 37 if (get_user(tmp, &termio->c_lflag) < 0) 38 goto fault; 39 termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp; 40 41 if (get_user(termios->c_line, &termio->c_line) < 0) 42 goto fault; 43 44 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 */ 56static inline int kernel_termios_to_user_termio(struct termio __user *termio, 57 struct ktermios *termios) 58{ 59 if (put_user(termios->c_iflag, &termio->c_iflag) < 0 || 60 put_user(termios->c_oflag, &termio->c_oflag) < 0 || 61 put_user(termios->c_cflag, &termio->c_cflag) < 0 || 62 put_user(termios->c_lflag, &termio->c_lflag) < 0 || 63 put_user(termios->c_line, &termio->c_line) < 0 || 64 copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0) 65 return -EFAULT; 66 67 return 0; 68} 69 70#ifdef TCGETS2 71static inline int user_termios_to_kernel_termios(struct ktermios *k, 72 struct termios2 __user *u) 73{ 74 return copy_from_user(k, u, sizeof(struct termios2)); 75} 76 77static inline int kernel_termios_to_user_termios(struct termios2 __user *u, 78 struct ktermios *k) 79{ 80 return copy_to_user(u, k, sizeof(struct termios2)); 81} 82 83static inline int user_termios_to_kernel_termios_1(struct ktermios *k, 84 struct termios __user *u) 85{ 86 return copy_from_user(k, u, sizeof(struct termios)); 87} 88 89static inline int kernel_termios_to_user_termios_1(struct termios __user *u, 90 struct ktermios *k) 91{ 92 return copy_to_user(u, k, sizeof(struct termios)); 93} 94#else /* TCGETS2 */ 95static 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 101static 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 */