From 4d20b828504610cbe2ad9364cdccdd1ec76da13f Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Wed, 6 Mar 2024 18:51:20 +0300
Subject: [PATCH] SDL_RWFromFile, stdio: allow named pipes along with regular
files.
Fixes https://github.com/libsdl-org/SDL/issues/9174
(cherry picked from commit 177a836653e0d2690ff8802dade165c392502f81)
---
src/file/SDL_rwops.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/file/SDL_rwops.c b/src/file/SDL_rwops.c
index 6589a20ddc1b3..f9ecd74bf9b0d 100644
--- a/src/file/SDL_rwops.c
+++ b/src/file/SDL_rwops.c
@@ -461,16 +461,17 @@ static size_t SDLCALL mem_write(SDL_RWops *context, const void *ptr, size_t size
/* Functions to create SDL_RWops structures from various data sources */
#if defined(HAVE_STDIO_H) && !defined(SDL_PLATFORM_WINDOWS)
-static SDL_bool SDL_IsRegularFile(FILE *f)
+static SDL_bool IsRegularFileOrPipe(FILE *f)
{
#ifdef SDL_PLATFORM_WINRT
struct __stat64 st;
- if (_fstat64(_fileno(f), &st) < 0 || (st.st_mode & _S_IFMT) != _S_IFREG) {
+ if (_fstat64(_fileno(f), &st) < 0 ||
+ !((st.st_mode & _S_IFMT) == _S_IFREG || (st.st_mode & _S_IFMT) == _S_IFIFO)) {
return SDL_FALSE;
}
#else
struct stat st;
- if (fstat(fileno(f), &st) < 0 || !S_ISREG(st.st_mode)) {
+ if (fstat(fileno(f), &st) < 0 || !(S_ISREG(st.st_mode) || S_ISFIFO(st.st_mode))) {
return SDL_FALSE;
}
#endif
@@ -491,9 +492,9 @@ SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)
if (*file == '/') {
FILE *fp = fopen(file, mode);
if (fp) {
- if (!SDL_IsRegularFile(fp)) {
+ if (!IsRegularFileOrPipe(fp)) {
fclose(fp);
- SDL_SetError("%s is not a regular file", file);
+ SDL_SetError("%s is not a regular file or pipe", file);
return NULL;
}
return SDL_RWFromFP(fp, 1);
@@ -511,9 +512,9 @@ SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)
fp = fopen(path, mode);
SDL_stack_free(path);
if (fp) {
- if (!SDL_IsRegularFile(fp)) {
+ if (!IsRegularFileOrPipe(fp)) {
fclose(fp);
- SDL_SetError("%s is not a regular file", path);
+ SDL_SetError("%s is not a regular file or pipe", path);
return NULL;
}
return SDL_RWFromFP(fp, 1);
@@ -569,10 +570,10 @@ SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)
#endif
if (!fp) {
SDL_SetError("Couldn't open %s", file);
- } else if (!SDL_IsRegularFile(fp)) {
+ } else if (!IsRegularFileOrPipe(fp)) {
fclose(fp);
fp = NULL;
- SDL_SetError("%s is not a regular file", file);
+ SDL_SetError("%s is not a regular file or pipe", file);
} else {
rwops = SDL_RWFromFP(fp, SDL_TRUE);
}