Merge pull request #109283 from Nintorch/master

Fix C# environment variables access on Linux (SDL-related bug)
This commit is contained in:
Thaddeus Crews
2025-08-11 09:55:21 -05:00
4 changed files with 86 additions and 3 deletions

View File

@ -87,9 +87,11 @@
#ifdef __linux__ #ifdef __linux__
#define HAVE_INOTIFY 1 #define HAVE_INOTIFY 1
#define HAVE_INOTIFY_INIT1 1 #define HAVE_INOTIFY_INIT1 1
#define HAVE_GETENV 1 // Don't add these defines, for some reason they mess with C#'s ability
#define HAVE_SETENV 1 // to use environment variables (see GH-109024)
#define HAVE_UNSETENV 1 //#define HAVE_GETENV 1
//#define HAVE_SETENV 1
//#define HAVE_UNSETENV 1
#endif #endif
#ifdef DBUS_ENABLED #ifdef DBUS_ENABLED

View File

@ -972,6 +972,7 @@ Patches:
- `0003-std-include.patch` (GH-108144) - `0003-std-include.patch` (GH-108144)
- `0004-errno-include.patch` (GH-108354) - `0004-errno-include.patch` (GH-108354)
- `0005-fix-libudev-dbus.patch` (GH-108373) - `0005-fix-libudev-dbus.patch` (GH-108373)
- `0006-fix-cs-environ.patch` (GH-109283)
The SDL source code folder includes `hidapi` library inside of folder `thirdparty/sdl/hidapi/`. The SDL source code folder includes `hidapi` library inside of folder `thirdparty/sdl/hidapi/`.
Its version and license is described in this file under `hidapi`. Its version and license is described in this file under `hidapi`.

View File

@ -0,0 +1,65 @@
diff --git a/thirdparty/sdl/stdlib/SDL_getenv.c b/thirdparty/sdl/stdlib/SDL_getenv.c
index b4a19224655..e23f8a0ea0d 100644
--- a/thirdparty/sdl/stdlib/SDL_getenv.c
+++ b/thirdparty/sdl/stdlib/SDL_getenv.c
@@ -50,6 +50,9 @@ extern char **environ;
static char **environ;
#endif
+#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_FREEBSD)
+#include <stdlib.h>
+#endif
struct SDL_Environment
{
@@ -149,6 +152,9 @@ SDL_Environment *SDL_CreateEnvironment(bool populated)
const char *SDL_GetEnvironmentVariable(SDL_Environment *env, const char *name)
{
+#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_FREEBSD)
+ return getenv(name);
+#else
const char *result = NULL;
if (!env) {
@@ -168,6 +174,7 @@ const char *SDL_GetEnvironmentVariable(SDL_Environment *env, const char *name)
SDL_UnlockMutex(env->lock);
return result;
+#endif
}
typedef struct CountEnvStringsData
@@ -246,6 +253,9 @@ char **SDL_GetEnvironmentVariables(SDL_Environment *env)
bool SDL_SetEnvironmentVariable(SDL_Environment *env, const char *name, const char *value, bool overwrite)
{
+#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_FREEBSD)
+ return setenv(name, value, overwrite);
+#else
bool result = false;
if (!env) {
@@ -281,10 +291,14 @@ bool SDL_SetEnvironmentVariable(SDL_Environment *env, const char *name, const ch
SDL_UnlockMutex(env->lock);
return result;
+#endif
}
bool SDL_UnsetEnvironmentVariable(SDL_Environment *env, const char *name)
{
+#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_FREEBSD)
+ return unsetenv(name);
+#else
bool result = false;
if (!env) {
@@ -305,6 +319,7 @@ bool SDL_UnsetEnvironmentVariable(SDL_Environment *env, const char *name)
SDL_UnlockMutex(env->lock);
return result;
+#endif
}
void SDL_DestroyEnvironment(SDL_Environment *env)

View File

@ -50,6 +50,9 @@ extern char **environ;
static char **environ; static char **environ;
#endif #endif
#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_FREEBSD)
#include <stdlib.h>
#endif
struct SDL_Environment struct SDL_Environment
{ {
@ -149,6 +152,9 @@ SDL_Environment *SDL_CreateEnvironment(bool populated)
const char *SDL_GetEnvironmentVariable(SDL_Environment *env, const char *name) const char *SDL_GetEnvironmentVariable(SDL_Environment *env, const char *name)
{ {
#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_FREEBSD)
return getenv(name);
#else
const char *result = NULL; const char *result = NULL;
if (!env) { if (!env) {
@ -168,6 +174,7 @@ const char *SDL_GetEnvironmentVariable(SDL_Environment *env, const char *name)
SDL_UnlockMutex(env->lock); SDL_UnlockMutex(env->lock);
return result; return result;
#endif
} }
typedef struct CountEnvStringsData typedef struct CountEnvStringsData
@ -246,6 +253,9 @@ char **SDL_GetEnvironmentVariables(SDL_Environment *env)
bool SDL_SetEnvironmentVariable(SDL_Environment *env, const char *name, const char *value, bool overwrite) bool SDL_SetEnvironmentVariable(SDL_Environment *env, const char *name, const char *value, bool overwrite)
{ {
#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_FREEBSD)
return setenv(name, value, overwrite);
#else
bool result = false; bool result = false;
if (!env) { if (!env) {
@ -281,10 +291,14 @@ bool SDL_SetEnvironmentVariable(SDL_Environment *env, const char *name, const ch
SDL_UnlockMutex(env->lock); SDL_UnlockMutex(env->lock);
return result; return result;
#endif
} }
bool SDL_UnsetEnvironmentVariable(SDL_Environment *env, const char *name) bool SDL_UnsetEnvironmentVariable(SDL_Environment *env, const char *name)
{ {
#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_FREEBSD)
return unsetenv(name);
#else
bool result = false; bool result = false;
if (!env) { if (!env) {
@ -305,6 +319,7 @@ bool SDL_UnsetEnvironmentVariable(SDL_Environment *env, const char *name)
SDL_UnlockMutex(env->lock); SDL_UnlockMutex(env->lock);
return result; return result;
#endif
} }
void SDL_DestroyEnvironment(SDL_Environment *env) void SDL_DestroyEnvironment(SDL_Environment *env)