termios-base.h (2164B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* termios.h: generic termios/termio user copying/translation 3 */ 4 5#ifndef _ASM_GENERIC_TERMIOS_BASE_H 6#define _ASM_GENERIC_TERMIOS_BASE_H 7 8#include <linux/uaccess.h> 9 10#ifndef __ARCH_TERMIO_GETPUT 11 12/* 13 * Translate a "termio" structure into a "termios". Ugh. 14 */ 15static inline int user_termio_to_kernel_termios(struct ktermios *termios, 16 struct termio __user *termio) 17{ 18 unsigned short tmp; 19 20 if (get_user(tmp, &termio->c_iflag) < 0) 21 goto fault; 22 termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp; 23 24 if (get_user(tmp, &termio->c_oflag) < 0) 25 goto fault; 26 termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp; 27 28 if (get_user(tmp, &termio->c_cflag) < 0) 29 goto fault; 30 termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp; 31 32 if (get_user(tmp, &termio->c_lflag) < 0) 33 goto fault; 34 termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp; 35 36 if (get_user(termios->c_line, &termio->c_line) < 0) 37 goto fault; 38 39 if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0) 40 goto fault; 41 42 return 0; 43 44 fault: 45 return -EFAULT; 46} 47 48/* 49 * Translate a "termios" structure into a "termio". Ugh. 50 */ 51static inline int kernel_termios_to_user_termio(struct termio __user *termio, 52 struct ktermios *termios) 53{ 54 if (put_user(termios->c_iflag, &termio->c_iflag) < 0 || 55 put_user(termios->c_oflag, &termio->c_oflag) < 0 || 56 put_user(termios->c_cflag, &termio->c_cflag) < 0 || 57 put_user(termios->c_lflag, &termio->c_lflag) < 0 || 58 put_user(termios->c_line, &termio->c_line) < 0 || 59 copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0) 60 return -EFAULT; 61 62 return 0; 63} 64 65#ifndef user_termios_to_kernel_termios 66#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios)) 67#endif 68 69#ifndef kernel_termios_to_user_termios 70#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios)) 71#endif 72 73#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios)) 74#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios)) 75 76#endif /* __ARCH_TERMIO_GETPUT */ 77 78#endif /* _ASM_GENERIC_TERMIOS_BASE_H */