linux/arch/alpha/include/asm/termios.h
<<
>>
Prefs
   1#ifndef _ALPHA_TERMIOS_H
   2#define _ALPHA_TERMIOS_H
   3
   4#include <asm/ioctls.h>
   5#include <asm/termbits.h>
   6
   7struct sgttyb {
   8        char    sg_ispeed;
   9        char    sg_ospeed;
  10        char    sg_erase;
  11        char    sg_kill;
  12        short   sg_flags;
  13};
  14
  15struct tchars {
  16        char    t_intrc;
  17        char    t_quitc;
  18        char    t_startc;
  19        char    t_stopc;
  20        char    t_eofc;
  21        char    t_brkc;
  22};
  23
  24struct ltchars {
  25        char    t_suspc;
  26        char    t_dsuspc;
  27        char    t_rprntc;
  28        char    t_flushc;
  29        char    t_werasc;
  30        char    t_lnextc;
  31};
  32
  33struct winsize {
  34        unsigned short ws_row;
  35        unsigned short ws_col;
  36        unsigned short ws_xpixel;
  37        unsigned short ws_ypixel;
  38};
  39
  40#define NCC 8
  41struct termio {
  42        unsigned short c_iflag;         /* input mode flags */
  43        unsigned short c_oflag;         /* output mode flags */
  44        unsigned short c_cflag;         /* control mode flags */
  45        unsigned short c_lflag;         /* local mode flags */
  46        unsigned char c_line;           /* line discipline */
  47        unsigned char c_cc[NCC];        /* control characters */
  48};
  49
  50/*
  51 * c_cc characters in the termio structure.  Oh, how I love being
  52 * backwardly compatible.  Notice that character 4 and 5 are
  53 * interpreted differently depending on whether ICANON is set in
  54 * c_lflag.  If it's set, they are used as _VEOF and _VEOL, otherwise
  55 * as _VMIN and V_TIME.  This is for compatibility with OSF/1 (which
  56 * is compatible with sysV)...
  57 */
  58#define _VINTR  0
  59#define _VQUIT  1
  60#define _VERASE 2
  61#define _VKILL  3
  62#define _VEOF   4
  63#define _VMIN   4
  64#define _VEOL   5
  65#define _VTIME  5
  66#define _VEOL2  6
  67#define _VSWTC  7
  68
  69#ifdef __KERNEL__
  70/*      eof=^D          eol=\0          eol2=\0         erase=del
  71        werase=^W       kill=^U         reprint=^R      sxtc=\0
  72        intr=^C         quit=^\         susp=^Z         <OSF/1 VDSUSP>
  73        start=^Q        stop=^S         lnext=^V        discard=^U
  74        vmin=\1         vtime=\0
  75*/
  76#define INIT_C_CC "\004\000\000\177\027\025\022\000\003\034\032\000\021\023\026\025\001\000"
  77
  78/*
  79 * Translate a "termio" structure into a "termios". Ugh.
  80 */
  81
  82#define user_termio_to_kernel_termios(a_termios, u_termio)                      \
  83({                                                                              \
  84        struct ktermios *k_termios = (a_termios);                               \
  85        struct termio k_termio;                                                 \
  86        int canon, ret;                                                         \
  87                                                                                \
  88        ret = copy_from_user(&k_termio, u_termio, sizeof(k_termio));            \
  89        if (!ret) {                                                             \
  90                /* Overwrite only the low bits.  */                             \
  91                *(unsigned short *)&k_termios->c_iflag = k_termio.c_iflag;      \
  92                *(unsigned short *)&k_termios->c_oflag = k_termio.c_oflag;      \
  93                *(unsigned short *)&k_termios->c_cflag = k_termio.c_cflag;      \
  94                *(unsigned short *)&k_termios->c_lflag = k_termio.c_lflag;      \
  95                canon = k_termio.c_lflag & ICANON;                              \
  96                                                                                \
  97                k_termios->c_cc[VINTR]  = k_termio.c_cc[_VINTR];                \
  98                k_termios->c_cc[VQUIT]  = k_termio.c_cc[_VQUIT];                \
  99                k_termios->c_cc[VERASE] = k_termio.c_cc[_VERASE];               \
 100                k_termios->c_cc[VKILL]  = k_termio.c_cc[_VKILL];                \
 101                k_termios->c_cc[VEOL2]  = k_termio.c_cc[_VEOL2];                \
 102                k_termios->c_cc[VSWTC]  = k_termio.c_cc[_VSWTC];                \
 103                k_termios->c_cc[canon ? VEOF : VMIN]  = k_termio.c_cc[_VEOF];   \
 104                k_termios->c_cc[canon ? VEOL : VTIME] = k_termio.c_cc[_VEOL];   \
 105        }                                                                       \
 106        ret;                                                                    \
 107})
 108
 109/*
 110 * Translate a "termios" structure into a "termio". Ugh.
 111 *
 112 * Note the "fun" _VMIN overloading.
 113 */
 114#define kernel_termios_to_user_termio(u_termio, a_termios)              \
 115({                                                                      \
 116        struct ktermios *k_termios = (a_termios);                       \
 117        struct termio k_termio;                                         \
 118        int canon;                                                      \
 119                                                                        \
 120        k_termio.c_iflag = k_termios->c_iflag;                          \
 121        k_termio.c_oflag = k_termios->c_oflag;                          \
 122        k_termio.c_cflag = k_termios->c_cflag;                          \
 123        canon = (k_termio.c_lflag = k_termios->c_lflag) & ICANON;       \
 124                                                                        \
 125        k_termio.c_line = k_termios->c_line;                            \
 126        k_termio.c_cc[_VINTR]  = k_termios->c_cc[VINTR];                \
 127        k_termio.c_cc[_VQUIT]  = k_termios->c_cc[VQUIT];                \
 128        k_termio.c_cc[_VERASE] = k_termios->c_cc[VERASE];               \
 129        k_termio.c_cc[_VKILL]  = k_termios->c_cc[VKILL];                \
 130        k_termio.c_cc[_VEOF]   = k_termios->c_cc[canon ? VEOF : VMIN];  \
 131        k_termio.c_cc[_VEOL]   = k_termios->c_cc[canon ? VEOL : VTIME]; \
 132        k_termio.c_cc[_VEOL2]  = k_termios->c_cc[VEOL2];                \
 133        k_termio.c_cc[_VSWTC]  = k_termios->c_cc[VSWTC];                \
 134                                                                        \
 135        copy_to_user(u_termio, &k_termio, sizeof(k_termio));            \
 136})
 137
 138#define user_termios_to_kernel_termios(k, u) \
 139        copy_from_user(k, u, sizeof(struct termios))
 140
 141#define kernel_termios_to_user_termios(u, k) \
 142        copy_to_user(u, k, sizeof(struct termios))
 143
 144#endif  /* __KERNEL__ */
 145
 146#endif  /* _ALPHA_TERMIOS_H */
 147