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