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