fix(storage/vfs_console): stop new console opens from overwriting existing fds

This commit is contained in:
Tomáš Rohlínek
2024-12-12 10:01:16 +01:00
parent a24dc94030
commit 299b93bc9e
5 changed files with 89 additions and 2 deletions
+25
View File
@@ -15,6 +15,7 @@
#include "esp_vfs_console.h"
#include "sdkconfig.h"
#include "esp_private/startup_internal.h"
#include <sys/errno.h>
#define STRINGIFY(s) STRINGIFY2(s)
#define STRINGIFY2(s) #s
@@ -43,8 +44,18 @@ const static esp_vfs_t *primary_vfs = NULL;
static vfs_console_context_t vfs_console = {0};
static size_t s_open_count = 0;
int console_open(const char * path, int flags, int mode)
{
if (s_open_count > 0) {
// Underlying fd is already open, so just increment the open count
// and return the same fd
s_open_count++;
return 0;
}
// Primary port open
#if CONFIG_ESP_CONSOLE_UART
vfs_console.fd_primary = open("/dev/uart/"STRINGIFY(CONFIG_ESP_CONSOLE_UART_NUM), flags, mode);
@@ -58,6 +69,8 @@ int console_open(const char * path, int flags, int mode)
#if CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG
vfs_console.fd_secondary = open("/dev/secondary", flags, mode);
#endif
s_open_count++;
return 0;
}
@@ -78,6 +91,18 @@ int console_fstat(int fd, struct stat * st)
int console_close(int fd)
{
if (s_open_count == 0) {
errno = EBADF;
return -1;
}
s_open_count--;
// We don't actually close the underlying fd until the open count reaches 0
if (s_open_count > 0) {
return 0;
}
// All function calls are to primary, except from write and close, which will be forwarded to both primary and secondary.
close(vfs_console.fd_primary);
#if CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG