Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | /* $Id: termios.h,v 1.11 2001/06/01 08:12:11 davem Exp $ */ #ifndef _SPARC64_TERMIOS_H #define _SPARC64_TERMIOS_H #include <asm/ioctls.h> #include <asm/termbits.h> #if defined(__KERNEL__) || defined(__DEFINE_BSD_TERMIOS) struct sgttyb { char sg_ispeed; char sg_ospeed; char sg_erase; char sg_kill; short sg_flags; }; struct tchars { char t_intrc; char t_quitc; char t_startc; char t_stopc; char t_eofc; char t_brkc; }; struct ltchars { char t_suspc; char t_dsuspc; char t_rprntc; char t_flushc; char t_werasc; char t_lnextc; }; #endif /* __KERNEL__ */ struct sunos_ttysize { int st_lines; /* Lines on the terminal */ int st_columns; /* Columns on the terminal */ }; struct winsize { unsigned short ws_row; unsigned short ws_col; unsigned short ws_xpixel; unsigned short ws_ypixel; }; #ifdef __KERNEL__ #include <linux/module.h> /* * c_cc characters in the termio structure. Oh, how I love being * backwardly compatible. Notice that character 4 and 5 are * interpreted differently depending on whether ICANON is set in * c_lflag. If it's set, they are used as _VEOF and _VEOL, otherwise * as _VMIN and V_TIME. This is for compatibility with OSF/1 (which * is compatible with sysV)... */ #define _VMIN 4 #define _VTIME 5 /* intr=^C quit=^\ erase=del kill=^U eof=^D eol=\0 eol2=\0 sxtc=\0 start=^Q stop=^S susp=^Z dsusp=^Y reprint=^R discard=^U werase=^W lnext=^V vmin=\1 vtime=\0 */ #define INIT_C_CC "\003\034\177\025\004\000\000\000\021\023\032\031\022\025\027\026\001" /* * Translate a "termio" structure into a "termios". Ugh. */ #define user_termio_to_kernel_termios(termios, termio) \ ({ \ unsigned short tmp; \ int err; \ err = get_user(tmp, &(termio)->c_iflag); \ (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \ err |= get_user(tmp, &(termio)->c_oflag); \ (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \ err |= get_user(tmp, &(termio)->c_cflag); \ (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \ err |= get_user(tmp, &(termio)->c_lflag); \ (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \ err |= copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ err; \ }) /* * Translate a "termios" structure into a "termio". Ugh. * * Note the "fun" _VMIN overloading. */ #define kernel_termios_to_user_termio(termio, termios) \ ({ \ int err; \ err = put_user((termios)->c_iflag, &(termio)->c_iflag); \ err |= put_user((termios)->c_oflag, &(termio)->c_oflag); \ err |= put_user((termios)->c_cflag, &(termio)->c_cflag); \ err |= put_user((termios)->c_lflag, &(termio)->c_lflag); \ err |= put_user((termios)->c_line, &(termio)->c_line); \ err |= copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ if (!((termios)->c_lflag & ICANON)) { \ err |= put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \ err |= put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \ } \ err; \ }) #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) \ ({ \ 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; \ }) #define kernel_termios_to_user_termios_1(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; \ }) #endif /* __KERNEL__ */ #endif /* _SPARC64_TERMIOS_H */ |