summaryrefslogtreecommitdiff
path: root/Libraries/LibC
diff options
context:
space:
mode:
authorAnotherTest <ali.mpfard@gmail.com>2020-07-04 04:20:51 +0430
committerAndreas Kling <kling@serenityos.org>2020-07-04 10:49:36 +0200
commit29e00b637e5239b8f8b13c533d515dd8b24853f0 (patch)
treebd0c31e1ee71f3b8c5efb7d0c489ebfff7502322 /Libraries/LibC
parent960953923683e91d817e4803c0369809f4ec93b6 (diff)
downloadserenity-29e00b637e5239b8f8b13c533d515dd8b24853f0.zip
LibC: Implement cf{g,s}et{i,o}speed
Diffstat (limited to 'Libraries/LibC')
-rw-r--r--Libraries/LibC/termios.cpp75
-rw-r--r--Libraries/LibC/termios.h5
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