LibC: Implement cf{g,s}et{i,o}speed

This commit is contained in:
AnotherTest 2020-07-04 04:20:51 +04:30 committed by Andreas Kling
parent 9609539236
commit 29e00b637e
Notes: sideshowbarker 2024-07-19 05:11:49 +09:00
2 changed files with 80 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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