diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-07-04 04:20:51 +0430 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-07-04 10:49:36 +0200 |
commit | 29e00b637e5239b8f8b13c533d515dd8b24853f0 (patch) | |
tree | bd0c31e1ee71f3b8c5efb7d0c489ebfff7502322 /Libraries/LibC | |
parent | 960953923683e91d817e4803c0369809f4ec93b6 (diff) | |
download | serenity-29e00b637e5239b8f8b13c533d515dd8b24853f0.zip |
LibC: Implement cf{g,s}et{i,o}speed
Diffstat (limited to 'Libraries/LibC')
-rw-r--r-- | Libraries/LibC/termios.cpp | 75 | ||||
-rw-r--r-- | Libraries/LibC/termios.h | 5 |
2 files changed, 80 insertions, 0 deletions
diff --git a/Libraries/LibC/termios.cpp b/Libraries/LibC/termios.cpp index 0241d35db7..a48a69e154 100644 --- a/Libraries/LibC/termios.cpp +++ b/Libraries/LibC/termios.cpp @@ -74,4 +74,79 @@ speed_t cfgetospeed(const struct termios* tp) { return tp->c_ospeed; } + +static int baud_rate_from_speed(speed_t speed) +{ + int rate = -EINVAL; + switch (speed) { + case B0: + rate = 0; + break; + case B50: + rate = 50; + break; + case B75: + rate = 75; + break; + case B110: + rate = 110; + break; + case B134: + rate = 134; + break; + case B150: + rate = 150; + break; + case B200: + rate = 200; + break; + case B300: + rate = 300; + break; + case B600: + rate = 600; + break; + case B1200: + rate = 1200; + break; + case B1800: + rate = 1800; + break; + case B2400: + rate = 2400; + break; + case B4800: + rate = 4800; + break; + case B9600: + rate = 9600; + break; + case B19200: + rate = 19200; + break; + case B38400: + rate = 38400; + break; + } + + return rate; +} + +int cfsetispeed(struct termios* tp, speed_t speed) +{ + auto ispeed = baud_rate_from_speed(speed); + if (ispeed > 0) { + tp->c_ispeed = ispeed; + } + __RETURN_WITH_ERRNO(ispeed, 0, -1); +} + +int cfsetospeed(struct termios* tp, speed_t speed) +{ + auto ospeed = baud_rate_from_speed(speed); + if (ospeed > 0) { + tp->c_ispeed = ospeed; + } + __RETURN_WITH_ERRNO(ospeed, 0, -1); +} } diff --git a/Libraries/LibC/termios.h b/Libraries/LibC/termios.h index 3503b11344..028ddc06a5 100644 --- a/Libraries/LibC/termios.h +++ b/Libraries/LibC/termios.h @@ -52,6 +52,11 @@ int tcsetattr(int fd, int optional_actions, const struct termios*); int tcflow(int fd, int action); int tcflush(int fd, int queue_selector); +speed_t cfgetispeed(const struct termios*); +speed_t cfgetospeed(const struct termios*); +int cfsetispeed(struct termios*, speed_t); +int cfsetospeed(struct termios*, speed_t); + /* c_cc characters */ #define VINTR 0 #define VQUIT 1 |