From fdd129db6886e41a1857797f05dfe3599c6a76ea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= <joakim.nohlgard@eistec.se>
Date: Mon, 11 Jul 2016 06:33:55 +0200
Subject: [PATCH] uart_stdio: Bind uart_stdio to vfs fds for stdin/out/err

---
 sys/uart_stdio/uart_stdio.c | 58 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 57 insertions(+), 1 deletion(-)

diff --git a/sys/uart_stdio/uart_stdio.c b/sys/uart_stdio/uart_stdio.c
index 55f2a395be..b87ccef2bc 100644
--- a/sys/uart_stdio/uart_stdio.c
+++ b/sys/uart_stdio/uart_stdio.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2013 INRIA
  *               2015 Kaspar Schleiser <kaspar@schleiser.de>
+ *               2016 Eistec AB
  *
  * This file is subject to the terms and conditions of the GNU Lesser
  * General Public License v2.1. See the file LICENSE in the top level
@@ -19,12 +20,17 @@
  * @author      Oliver Hahm <oliver.hahm@inria.fr>
  * @author      Ludwig Knüpfer <ludwig.knuepfer@fu-berlin.de>
  * @author      Kaspar Schleiser <kaspar@schleiser.de>
+ * @author      Joakim Nohlgård <joakim.nohlgard@eistec.se>
  *
  * @}
  */
 
 #include <stdio.h>
-
+#if MODULE_VFS
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#endif
 #include "uart_stdio.h"
 
 #include "board.h"
@@ -36,12 +42,47 @@
 extern ethos_t ethos;
 #endif
 
+#if MODULE_VFS
+#include "vfs.h"
+#endif
+
 #define ENABLE_DEBUG 0
 #include "debug.h"
 
 static char _rx_buf_mem[UART_STDIO_RX_BUFSIZE];
 isrpipe_t uart_stdio_isrpipe = ISRPIPE_INIT(_rx_buf_mem);
 
+#if MODULE_VFS
+static ssize_t uart_stdio_vfs_read(vfs_file_t *filp, void *dest, size_t nbytes);
+static ssize_t uart_stdio_vfs_write(vfs_file_t *filp, const void *src, size_t nbytes);
+
+/**
+ * @brief VFS file operation table for stdin/stdout/stderr
+ */
+static vfs_file_ops_t uart_stdio_vfs_ops = {
+    .read = uart_stdio_vfs_read,
+    .write = uart_stdio_vfs_write,
+};
+
+static ssize_t uart_stdio_vfs_read(vfs_file_t *filp, void *dest, size_t nbytes)
+{
+    int fd = filp->private_data.value;
+    if (fd != STDIN_FILENO) {
+        return -EBADF;
+    }
+    return uart_stdio_read(dest, nbytes);
+}
+
+static ssize_t uart_stdio_vfs_write(vfs_file_t *filp, const void *src, size_t nbytes)
+{
+    int fd = filp->private_data.value;
+    if (fd == STDIN_FILENO) {
+        return -EBADF;
+    }
+    return uart_stdio_write(src, nbytes);
+}
+#endif
+
 void uart_stdio_init(void)
 {
 #ifndef USE_ETHOS_FOR_STDIO
@@ -49,6 +90,21 @@ void uart_stdio_init(void)
 #else
     uart_init(ETHOS_UART, ETHOS_BAUDRATE, (uart_rx_cb_t) isrpipe_write_one, &uart_stdio_isrpipe);
 #endif
+#if MODULE_VFS
+    int fd;
+    fd = vfs_bind(STDIN_FILENO, O_RDONLY, &uart_stdio_vfs_ops, (void *)STDIN_FILENO);
+    if (fd < 0) {
+        /* How to handle errors on init? */
+    }
+    fd = vfs_bind(STDOUT_FILENO, O_WRONLY, &uart_stdio_vfs_ops, (void *)STDOUT_FILENO);
+    if (fd < 0) {
+        /* How to handle errors on init? */
+    }
+    fd = vfs_bind(STDERR_FILENO, O_WRONLY, &uart_stdio_vfs_ops, (void *)STDERR_FILENO);
+    if (fd < 0) {
+        /* How to handle errors on init? */
+    }
+#endif
 }
 
 int uart_stdio_read(char* buffer, int count)
-- 
GitLab