termios-base.h 2.1 KB

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