|
@@ -107,6 +107,48 @@ struct winsize {
|
|
|
})
|
|
|
|
|
|
#define user_termios_to_kernel_termios(k, u) \
|
|
|
+({ \
|
|
|
+ int err; \
|
|
|
+ err = get_user((k)->c_iflag, &(u)->c_iflag); \
|
|
|
+ err |= get_user((k)->c_oflag, &(u)->c_oflag); \
|
|
|
+ err |= get_user((k)->c_cflag, &(u)->c_cflag); \
|
|
|
+ err |= get_user((k)->c_lflag, &(u)->c_lflag); \
|
|
|
+ err |= get_user((k)->c_line, &(u)->c_line); \
|
|
|
+ err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
|
|
|
+ if ((k)->c_lflag & ICANON) { \
|
|
|
+ err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
|
|
+ err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
|
|
+ } else { \
|
|
|
+ err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
|
|
+ err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
|
|
+ } \
|
|
|
+ err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \
|
|
|
+ err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \
|
|
|
+ err; \
|
|
|
+})
|
|
|
+
|
|
|
+#define kernel_termios_to_user_termios(u, k) \
|
|
|
+({ \
|
|
|
+ int err; \
|
|
|
+ err = put_user((k)->c_iflag, &(u)->c_iflag); \
|
|
|
+ err |= put_user((k)->c_oflag, &(u)->c_oflag); \
|
|
|
+ err |= put_user((k)->c_cflag, &(u)->c_cflag); \
|
|
|
+ err |= put_user((k)->c_lflag, &(u)->c_lflag); \
|
|
|
+ err |= put_user((k)->c_line, &(u)->c_line); \
|
|
|
+ err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
|
|
|
+ if (!((k)->c_lflag & ICANON)) { \
|
|
|
+ err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
|
|
+ err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
|
|
+ } else { \
|
|
|
+ err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
|
|
+ err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
|
|
+ } \
|
|
|
+ err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \
|
|
|
+ err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \
|
|
|
+ err; \
|
|
|
+})
|
|
|
+
|
|
|
+#define user_termios_to_kernel_termios_1(k, u) \
|
|
|
({ \
|
|
|
get_user((k)->c_iflag, &(u)->c_iflag); \
|
|
|
get_user((k)->c_oflag, &(u)->c_oflag); \
|
|
@@ -114,7 +156,7 @@ struct winsize {
|
|
|
get_user((k)->c_lflag, &(u)->c_lflag); \
|
|
|
get_user((k)->c_line, &(u)->c_line); \
|
|
|
copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
|
|
|
- if((k)->c_lflag & ICANON) { \
|
|
|
+ if ((k)->c_lflag & ICANON) { \
|
|
|
get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
|
|
get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
|
|
} else { \
|
|
@@ -124,7 +166,7 @@ struct winsize {
|
|
|
0; \
|
|
|
})
|
|
|
|
|
|
-#define kernel_termios_to_user_termios(u, k) \
|
|
|
+#define kernel_termios_to_user_termios_1(u, k) \
|
|
|
({ \
|
|
|
put_user((k)->c_iflag, &(u)->c_iflag); \
|
|
|
put_user((k)->c_oflag, &(u)->c_oflag); \
|
|
@@ -132,7 +174,7 @@ struct winsize {
|
|
|
put_user((k)->c_lflag, &(u)->c_lflag); \
|
|
|
put_user((k)->c_line, &(u)->c_line); \
|
|
|
copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
|
|
|
- if(!((k)->c_lflag & ICANON)) { \
|
|
|
+ if (!((k)->c_lflag & ICANON)) { \
|
|
|
put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
|
|
put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
|
|
} else { \
|