From 4d20b828504610cbe2ad9364cdccdd1ec76da13f Mon Sep 17 00:00:00 2001 From: Ozkan Sezer 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 6589a20ddc..f9ecd74bf9 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); }