]> xenbits.xensource.com Git - mini-os.git/commitdiff
mini-os: minimal implementations of some termios functions
authorSimon Waterman <watermansrdev@gmail.com>
Sun, 25 Jun 2017 22:02:08 +0000 (23:02 +0100)
committerWei Liu <wei.liu2@citrix.com>
Tue, 4 Jul 2017 13:06:29 +0000 (14:06 +0100)
Add minimal implementation of termios functions so that a console
can be configured in raw mode if an application requires it.

Signed-off-by: Simon Waterman <watermansrdev@gmail.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
lib/sys.c

index 1420722a6de176294330cebefc2800da3e974735..b173bc8c2ea4602da77deb7be71a012edd6acb7f 100644 (file)
--- a/lib/sys.c
+++ b/lib/sys.c
@@ -32,6 +32,7 @@
 #include <xenbus.h>
 #include <xenstore.h>
 #include <poll.h>
+#include <termios.h>
 
 #include <sys/types.h>
 #include <sys/unistd.h>
@@ -1436,6 +1437,82 @@ int nice(int inc)
     return 0;
 }
 
+/* Limited termios terminal settings support */
+const struct termios default_termios = {0,             /* iflag */
+                                        OPOST | ONLCR, /* oflag */
+                                        0,             /* lflag */
+                                        CREAD | CS8,   /* cflag */
+                                        {}};           /* cc */
+
+int tcsetattr(int fildes, int action, const struct termios *tios)
+{
+    if (fildes < 0 || fildes >= NOFILE) {
+        errno = EBADF;
+        return -1;
+    }
+
+    if (files[fildes].type != FTYPE_CONSOLE) {
+        errno = ENOTTY;
+        return -1;
+    }
+
+    if (tios == NULL) {
+        errno = EINVAL;
+        return -1;
+    }
+
+    switch (action) {
+        case TCSANOW:
+        case TCSADRAIN:
+        case TCSAFLUSH:
+            break;
+        default:
+            errno = EINVAL;
+            return -1;
+    }
+
+    if (tios->c_oflag & OPOST)
+        files[fildes].cons.dev->is_raw = false;
+    else
+        files[fildes].cons.dev->is_raw = true;
+
+    return 0;
+}
+
+int tcgetattr(int fildes, struct termios *tios)
+{
+    if (fildes < 0 || fildes >= NOFILE) {
+        errno = EBADF;
+        return -1;
+    }
+
+    if (files[fildes].type != FTYPE_CONSOLE) {
+        errno = ENOTTY;
+        return -1;
+    }
+
+    if (tios == NULL) {
+        errno = EINVAL;
+        return -1;
+    }
+
+    memcpy(tios, &default_termios, sizeof(struct termios));
+
+    if (files[fildes].cons.dev->is_raw)
+        tios->c_oflag &= ~OPOST;
+
+    return 0;
+}
+
+void cfmakeraw(struct termios *tios)
+{
+    tios->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
+                       | INLCR | IGNCR | ICRNL | IXON);
+    tios->c_oflag &= ~OPOST;
+    tios->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
+    tios->c_cflag &= ~(CSIZE | PARENB);
+    tios->c_cflag |= CS8;
+}
 
 /* Not supported by FS yet.  */
 unsupported_function_crash(link);
@@ -1472,8 +1549,6 @@ unsupported_function_crash(waitpid);
 unsupported_function_crash(wait);
 unsupported_function_crash(lockf);
 unsupported_function_crash(sysconf);
-unsupported_function(int, tcsetattr, -1);
-unsupported_function(int, tcgetattr, 0);
 unsupported_function(int, grantpt, -1);
 unsupported_function(int, unlockpt, -1);
 unsupported_function(char *, ptsname, NULL);