diff options
-rw-r--r-- | Userland/Libraries/LibC/stdlib.cpp | 11 | ||||
-rw-r--r-- | Userland/Libraries/LibC/stdlib.h | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/System.cpp | 15 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/System.h | 2 |
4 files changed, 26 insertions, 3 deletions
diff --git a/Userland/Libraries/LibC/stdlib.cpp b/Userland/Libraries/LibC/stdlib.cpp index 580ffd630c..d56dfc03d1 100644 --- a/Userland/Libraries/LibC/stdlib.cpp +++ b/Userland/Libraries/LibC/stdlib.cpp @@ -306,11 +306,16 @@ int clearenv() // https://pubs.opengroup.org/onlinepubs/9699919799/functions/setenv.html int setenv(const char* name, const char* value, int overwrite) { + return serenity_setenv(name, strlen(name), value, strlen(value), overwrite); +} + +int serenity_setenv(const char* name, ssize_t name_length, const char* value, ssize_t value_length, int overwrite) +{ if (!overwrite && getenv(name)) return 0; - auto length = strlen(name) + strlen(value) + 2; - auto* var = (char*)malloc(length); - snprintf(var, length, "%s=%s", name, value); + auto const total_length = name_length + value_length + 2; + auto* var = (char*)malloc(total_length); + snprintf(var, total_length, "%s=%s", name, value); s_malloced_environment_variables.set((FlatPtr)var); return putenv(var); } diff --git a/Userland/Libraries/LibC/stdlib.h b/Userland/Libraries/LibC/stdlib.h index cfb7e19729..21865cd398 100644 --- a/Userland/Libraries/LibC/stdlib.h +++ b/Userland/Libraries/LibC/stdlib.h @@ -33,6 +33,7 @@ int putenv(char*); int unsetenv(const char*); int clearenv(void); int setenv(const char* name, const char* value, int overwrite); +int serenity_setenv(const char* name, ssize_t name_length, const char* value, ssize_t value_length, int overwrite); const char* getprogname(void); void setprogname(const char*); int atoi(const char*); diff --git a/Userland/Libraries/LibCore/System.cpp b/Userland/Libraries/LibCore/System.cpp index 484ed5b878..ff29dc69c6 100644 --- a/Userland/Libraries/LibCore/System.cpp +++ b/Userland/Libraries/LibCore/System.cpp @@ -14,6 +14,7 @@ #include <LibSystem/syscall.h> #include <limits.h> #include <stdarg.h> +#include <stdlib.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/ptrace.h> @@ -1069,4 +1070,18 @@ ErrorOr<void> mkfifo(StringView pathname, mode_t mode) return mknod(pathname, mode | S_IFIFO, 0); } +ErrorOr<void> setenv(StringView name, StringView value, bool overwrite) +{ +#ifdef __serenity__ + auto const rc = ::serenity_setenv(name.characters_without_null_termination(), name.length(), value.characters_without_null_termination(), value.length(), overwrite); +#else + String name_string = name; + String value_string = value; + auto const rc = ::setenv(name_string.characters(), value_string.characters(), overwrite); +#endif + if (rc < 0) + return Error::from_syscall("setenv", -errno); + return {}; +} + } diff --git a/Userland/Libraries/LibCore/System.h b/Userland/Libraries/LibCore/System.h index b160462548..4312e50165 100644 --- a/Userland/Libraries/LibCore/System.h +++ b/Userland/Libraries/LibCore/System.h @@ -145,4 +145,6 @@ ErrorOr<void> socketpair(int domain, int type, int protocol, int sv[2]); ErrorOr<Vector<gid_t>> getgroups(); ErrorOr<void> mknod(StringView pathname, mode_t mode, dev_t dev); ErrorOr<void> mkfifo(StringView pathname, mode_t mode); +ErrorOr<void> setenv(StringView, StringView, bool); + } |