diff --git a/core/io/file_access.cpp b/core/io/file_access.cpp
index 230184ad04b6..7d422bf09467 100644
--- a/core/io/file_access.cpp
+++ b/core/io/file_access.cpp
@@ -451,7 +451,7 @@ String FileAccess::get_line() const {
uint8_t c = get_8();
while (!eof_reached()) {
- if (c == '\n' || c == '\0') {
+ if (c == '\n' || c == '\0' || get_error() != OK) {
line.push_back(0);
return String::utf8(line.get_data());
} else if (c != '\r') {
diff --git a/doc/classes/FileAccess.xml b/doc/classes/FileAccess.xml
index a2ee5a132304..9dfc142126ff 100644
--- a/doc/classes/FileAccess.xml
+++ b/doc/classes/FileAccess.xml
@@ -204,7 +204,7 @@
- Returns the size of the file in bytes.
+ Returns the size of the file in bytes. If [FileAccess] is pipe, returns number of bytes available to be read from the pipe.
diff --git a/drivers/unix/file_access_unix_pipe.cpp b/drivers/unix/file_access_unix_pipe.cpp
index 775d3f7d8676..56be559a34cc 100644
--- a/drivers/unix/file_access_unix_pipe.cpp
+++ b/drivers/unix/file_access_unix_pipe.cpp
@@ -37,6 +37,7 @@
#include
#include
+#include
#include
#include
#include
@@ -132,6 +133,14 @@ String FileAccessUnixPipe::get_path_absolute() const {
return path_src;
}
+uint64_t FileAccessUnixPipe::get_length() const {
+ ERR_FAIL_COND_V_MSG(fd[0] < 0, 0, "Pipe must be opened before use.");
+
+ int buf_rem = 0;
+ ERR_FAIL_COND_V(ioctl(fd[0], FIONREAD, &buf_rem) != 0, 0);
+ return buf_rem;
+}
+
uint64_t FileAccessUnixPipe::get_buffer(uint8_t *p_dst, uint64_t p_length) const {
ERR_FAIL_COND_V_MSG(fd[0] < 0, -1, "Pipe must be opened before use.");
ERR_FAIL_COND_V(!p_dst && p_length > 0, -1);
diff --git a/drivers/unix/file_access_unix_pipe.h b/drivers/unix/file_access_unix_pipe.h
index a95cbc8e614f..b1633db015c5 100644
--- a/drivers/unix/file_access_unix_pipe.h
+++ b/drivers/unix/file_access_unix_pipe.h
@@ -61,7 +61,7 @@ class FileAccessUnixPipe : public FileAccess {
virtual void seek(uint64_t p_position) override {}
virtual void seek_end(int64_t p_position = 0) override {}
virtual uint64_t get_position() const override { return 0; }
- virtual uint64_t get_length() const override { return 0; }
+ virtual uint64_t get_length() const override;
virtual bool eof_reached() const override { return false; }
diff --git a/drivers/windows/file_access_windows_pipe.cpp b/drivers/windows/file_access_windows_pipe.cpp
index 88e76f67ef50..6960e9d71536 100644
--- a/drivers/windows/file_access_windows_pipe.cpp
+++ b/drivers/windows/file_access_windows_pipe.cpp
@@ -102,6 +102,14 @@ String FileAccessWindowsPipe::get_path_absolute() const {
return path_src;
}
+uint64_t FileAccessWindowsPipe::get_length() const {
+ ERR_FAIL_COND_V_MSG(fd[0] == nullptr, -1, "Pipe must be opened before use.");
+
+ DWORD buf_rem = 0;
+ ERR_FAIL_COND_V(!PeekNamedPipe(fd[0], nullptr, 0, nullptr, &buf_rem, nullptr), 0);
+ return buf_rem;
+}
+
uint64_t FileAccessWindowsPipe::get_buffer(uint8_t *p_dst, uint64_t p_length) const {
ERR_FAIL_COND_V_MSG(fd[0] == nullptr, -1, "Pipe must be opened before use.");
ERR_FAIL_COND_V(!p_dst && p_length > 0, -1);
diff --git a/drivers/windows/file_access_windows_pipe.h b/drivers/windows/file_access_windows_pipe.h
index b01b48fe133e..0eb570ae2294 100644
--- a/drivers/windows/file_access_windows_pipe.h
+++ b/drivers/windows/file_access_windows_pipe.h
@@ -60,7 +60,7 @@ class FileAccessWindowsPipe : public FileAccess {
virtual void seek(uint64_t p_position) override {}
virtual void seek_end(int64_t p_position = 0) override {}
virtual uint64_t get_position() const override { return 0; }
- virtual uint64_t get_length() const override { return 0; }
+ virtual uint64_t get_length() const override;
virtual bool eof_reached() const override { return false; }