From 29e00b637e5239b8f8b13c533d515dd8b24853f0 Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Sat, 4 Jul 2020 04:20:51 +0430 Subject: [PATCH] LibC: Implement cf{g,s}et{i,o}speed --- Libraries/LibC/termios.cpp | 75 ++++++++++++++++++++++++++++++++++++++ Libraries/LibC/termios.h | 5 +++ 2 files changed, 80 insertions(+) diff --git a/Libraries/LibC/termios.cpp b/Libraries/LibC/termios.cpp index 0241d35db78..a48a69e154b 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 3503b113447..028ddc06a53 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