summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibC/stdlib.cpp11
-rw-r--r--Userland/Libraries/LibC/stdlib.h1
-rw-r--r--Userland/Libraries/LibCore/System.cpp15
-rw-r--r--Userland/Libraries/LibCore/System.h2
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);
+
}