diff --git a/Base/usr/share/man/man3/clearenv.md b/Base/usr/share/man/man3/clearenv.md new file mode 100644 index 0000000000..42185419b9 --- /dev/null +++ b/Base/usr/share/man/man3/clearenv.md @@ -0,0 +1,34 @@ +## Name + +clearenv - clear the environment + +## Synopsis + +```**c++ +#include + +clearenv(); +``` + +## Description + +Clears all environment variables and sets the external +variable `environ` to NULL. + +## Return value + +The `clearenv()` function returns zero. + +## Examples + +```c++ +#include + +int main() +{ + clearenv(); + putenv("PATH=/bin"); + + return 0; +} +``` diff --git a/Libraries/LibC/stdlib.cpp b/Libraries/LibC/stdlib.cpp index 9e91be3061..0e127d8957 100644 --- a/Libraries/LibC/stdlib.cpp +++ b/Libraries/LibC/stdlib.cpp @@ -289,6 +289,16 @@ int unsetenv(const char* name) return 0; } +int clearenv() +{ + size_t environ_size = 0; + for (; environ[environ_size]; ++environ_size) { + environ[environ_size] = NULL; + } + *environ = NULL; + return 0; +} + int setenv(const char* name, const char* value, int overwrite) { if (!overwrite && getenv(name)) diff --git a/Libraries/LibC/stdlib.h b/Libraries/LibC/stdlib.h index 089d47b389..735e62e36a 100644 --- a/Libraries/LibC/stdlib.h +++ b/Libraries/LibC/stdlib.h @@ -47,6 +47,7 @@ __attribute__((alloc_size(2))) void* realloc(void* ptr, size_t); char* getenv(const char* name); int putenv(char*); int unsetenv(const char*); +int clearenv(void); int setenv(const char* name, const char* value, int overwrite); int atoi(const char*); long atol(const char*); diff --git a/Userland/env.cpp b/Userland/env.cpp index c9cd621ac2..630ff81749 100644 --- a/Userland/env.cpp +++ b/Userland/env.cpp @@ -41,7 +41,7 @@ int main(int argc, char** argv) for (int idx = 1; idx < argc; ++idx) { if (idx == 1) { if (StringView { argv[idx] } == "-i" || StringView { argv[idx] } == "--ignore-environment") { - *environ = NULL; + clearenv(); continue; } }