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