summaryrefslogtreecommitdiff
path: root/src/termios/_termios.h
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-08-15 12:33:24 -0400
committerJakob Kaivo <jkk@ung.org>2020-08-15 12:33:24 -0400
commit661977b6f44652cf7d14c38e4b888c51e399cdd4 (patch)
tree792cf5c284cc9f90c0f662b503a928164314b5f0 /src/termios/_termios.h
parent05f52c10c527ce911a2880b4ddd4c9ee299172a8 (diff)
sadly Linux-specific implementation
Diffstat (limited to 'src/termios/_termios.h')
-rw-r--r--src/termios/_termios.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/termios/_termios.h b/src/termios/_termios.h
new file mode 100644
index 00000000..ce35d32e
--- /dev/null
+++ b/src/termios/_termios.h
@@ -0,0 +1,61 @@
+#ifndef ___TERMIOS_H__
+#define ___TERMIOS_H__
+
+#include <termios.h>
+#include <string.h>
+
+#ifdef __linux__
+#include "_syscall.h"
+
+#define KNCCS 19
+#define MINCCS (KNCCS < NCCS ? KNCCS : NCCS)
+
+#define TCGETS 0x5401
+#define TCSETS 0x5402
+#define TCSETSW 0x5403
+#define TCSETSF 0x5404
+#define TCSBRK 0x5409
+#define TCSBRKP 0x5425
+#define TCXONC 0x540A
+#define TCFLSH 0x540B
+#define TIOCGPGRP 0x540F
+
+#define ioctl(_fd, _cmd, _arg) __syscall(16, _fd, _cmd, _arg)
+
+struct kernel_termios {
+ tcflag_t c_iflag;
+ tcflag_t c_oflag;
+ tcflag_t c_cflag;
+ tcflag_t c_lflag;
+ cc_t c_line;
+ cc_t c_cc[KNCCS];
+ speed_t c_ispeed;
+ speed_t c_ospeed;
+};
+
+#define ktou(_u, _k) do { \
+ (_u).c_iflag = (_k).c_iflag; \
+ (_u).c_oflag = (_k).c_oflag; \
+ (_u).c_cflag = (_k).c_cflag; \
+ (_u).c_lflag = (_k).c_lflag; \
+ memcpy((_u).c_cc, (_k).c_cc, MINCCS); \
+} while (0)
+ /* and the speeds */
+
+#define utok(_k, _u) do { \
+ (_k).c_iflag = (_u).c_iflag; \
+ (_k).c_oflag = (_u).c_oflag; \
+ (_k).c_cflag = (_u).c_cflag; \
+ (_k).c_lflag = (_u).c_lflag; \
+ (_k).c_line = 0; \
+ memcpy((_k).c_cc, (_u).c_cc, MINCCS); \
+} while (0)
+ /* and the speeds */
+
+#else
+#define kernel_termios termios
+#define ktou(_u, _k) (memcpy(_u, _k, sizeof(_u))
+#define utok(_k, _u) (memcpy(_k, _u, sizeof(_u))
+#endif
+
+#endif