/*
 * termios.h
 */

#ifndef _TERMIOS_H
#define _TERMIOS_H

#include <klibc/extern.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/termios.h>

/* Redefine these so the magic constants == the ioctl number to use. */
#undef TCSANOW
#undef TCSADRAIN
#undef TCSAFLUSH
#define TCSANOW	   TCSETS
#define TCSADRAIN  TCSETSW
#define TCSAFLUSH  TCSETSF

static __inline__ int tcgetattr(int __fd, struct termios *__s)
{
  return ioctl(__fd, TCGETS, __s);
}

static __inline__ int tcsetattr(int __fd, int __opt, const struct termios *__s)
{
  return ioctl(__fd, __opt, (void *)__s);
}

static __inline__ int tcflow(int __fd, int __action)
{
  return ioctl(__fd, TCXONC, (void *)(intptr_t)__action);
}

static __inline__ int tcflush(int __fd, int __queue)
{
  return ioctl(__fd, TCFLSH, (void *)(intptr_t)__queue);
}

static __inline__ pid_t tcgetpgrp(int __fd)
{
  pid_t __p;
  return ioctl(__fd, TIOCGPGRP, &__p) ? (pid_t)-1 : __p;
}

static __inline__ pid_t tcgetsid(int __fd)
{
  pid_t __p;
  return ioctl(__fd, TIOCGSID, &__p) ? (pid_t)-1 : __p;
}

static __inline__ int tcsendbreak(int __fd, int __duration)
{
  return ioctl(__fd, TCSBRKP, (void *)(uintptr_t)__duration);
}

static __inline__ int tcsetpgrp(int __fd, pid_t __p)
{
  return ioctl(__fd, TIOCSPGRP, &__p);
}

static __inline__ speed_t cfgetospeed(const struct termios *__s)
{
  return (speed_t)(__s->c_cflag & CBAUD);
}

static __inline__ speed_t cfgetispeed(const struct termios *__s)
{
  return (speed_t)(__s->c_cflag & CBAUD);
}

static __inline__ int cfsetospeed(struct termios *__s, speed_t __v)
{
  __s->c_cflag = (__s->c_cflag & ~CBAUD) | (__v & CBAUD);
  return 0;
}

static __inline__ int cfsetispeed(struct termios *__s, speed_t __v)
{
  __s->c_cflag = (__s->c_cflag & ~CBAUD) | (__v & CBAUD);
  return 0;
}

#endif /* _TERMIOS_H */
