From: Simon Waterman Date: Sun, 25 Jun 2017 22:02:08 +0000 (+0100) Subject: mini-os: minimal implementations of some termios functions X-Git-Tag: xen-4.10.0-rc1~5 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=c96c22f1d94;p=mini-os.git mini-os: minimal implementations of some termios functions 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 Acked-by: Wei Liu --- diff --git a/lib/sys.c b/lib/sys.c index 1420722..b173bc8 100644 --- a/lib/sys.c +++ b/lib/sys.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -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);