Commit 20d46f0d authored by Kevin Wolf's avatar Kevin Wolf

libc: isatty() und file_is_terminal()

+ libc: Hilfsfunktionen, die für einen gegebenen FILE* oder
  POSIX-Dateideskriptor feststellen, ob es sich um ein Terminal handelt.
Signed-off-by: Kevin Wolf's avatarKevin Wolf <kevin@tyndur.org>
parent 797e0544
......@@ -154,6 +154,7 @@ struct lostio_internal_file {
#define IS_LIO2(h) ((h)->lio2_res > 0)
lio_stream_t file_get_stream(FILE *io_res);
bool file_is_terminal(FILE* io_res);
///LostIO-Schnittstelle initialisieren
void lostio_init(void);
......
......@@ -52,9 +52,8 @@
extern "C" {
#endif
#ifndef CONFIG_LIBC_NO_STUBS
int isatty(int desc);
#endif
/// Prüft, ob es sich um ein Terminal handelt
int isatty(int fd);
/// PID des aktuellen Prozesses auslesen
pid_t getpid(void);
......
......@@ -41,14 +41,6 @@ int getpagesize(void)
}
#ifndef CONFIG_LIBC_NO_STUBS
/**
* Wir haben keine TTYs
*/
int isatty(int desc)
{
return 0;
}
/**
* Prozess klonen
*/
......
......@@ -594,6 +594,32 @@ ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
return ret;
}
/**
* Prüft, ob es sich beim Dateideskriptor @fd um ein Terminal handelt.
*
* Gibt 1 zurück, wenn es ein Terminal ist; andernfalls 0 und errno wird
* gesetzt.
*/
int isatty(int fd)
{
io_resource_t* file = fd_to_file(fd);
int ret;
if (file == NULL || !IS_LIO2(file)) {
errno = EBADF;
return 0;
}
ret = lio_ioctl(file->lio2_stream, LIO_IOCTL_ISATTY);
if (ret < 0) {
errno = -ret;
return 0;
}
return 1;
}
#ifndef CONFIG_LIBC_NO_STUBS
/**
* Dateideskriptor duplizieren
......
......@@ -201,6 +201,18 @@ lio_stream_t file_get_stream(FILE *io_res)
return io_res->res->lio2_stream;
}
bool file_is_terminal(FILE* io_res)
{
int ret;
if (!is_valid_res(io_res) || !IS_LIO2_FILE(io_res)) {
return -EBADF;
}
ret = lio_ioctl(io_res->res->lio2_stream, LIO_IOCTL_ISATTY);
return (ret >= 0);
}
static void prepare_buffer(FILE* io_res, bool is_write)
{
if (io_res->buffer_writes == is_write) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment