linux/include/asm-generic/termios-base.h
<<
>>
Prefs
   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 <linux/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