banan-os/userspace/libraries/LibC/termios.cpp

90 lines
1.4 KiB
C++

#include <BAN/Assert.h>
#include <BAN/Debug.h>
#include <errno.h>
#include <sys/syscall.h>
#include <termios.h>
#include <unistd.h>
speed_t cfgetispeed(const struct termios* termios)
{
return termios->c_ispeed;
}
speed_t cfgetospeed(const struct termios* termios)
{
return termios->c_ospeed;
}
static bool is_valid_speed(speed_t speed)
{
switch (speed)
{
case B0:
case B50:
case B75:
case B110:
case B134:
case B150:
case B200:
case B300:
case B600:
case B1200:
case B1800:
case B2400:
case B4800:
case B9600:
case B19200:
case B38400:
return true;
default:
return false;
}
}
int cfsetispeed(struct termios* termios, speed_t speed)
{
if (!is_valid_speed(speed))
{
errno = EINVAL;
return -1;
}
termios->c_ispeed = speed;
return 0;
}
int cfsetospeed(struct termios* termios, speed_t speed)
{
if (!is_valid_speed(speed))
{
errno = EINVAL;
return -1;
}
termios->c_ospeed = speed;
return 0;
}
int tcdrain(int);
int tcflow(int, int);
int tcflush(int fd, int queue_selector)
{
dwarnln("FIXME: tcflush({}, {})", fd, queue_selector);
return 0;
}
int tcgetattr(int fildes, struct termios* termios)
{
return syscall(SYS_TCGETATTR, fildes, termios);
}
pid_t tcgetsid(int);
int tcsendbreak(int, int);
int tcsetattr(int fildes, int optional_actions, const struct termios* termios)
{
return syscall(SYS_TCSETATTR, fildes, optional_actions, termios);
}