diff options
author | Jakob Kaivo <jkk@ung.org> | 2020-08-12 13:55:12 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2020-08-12 13:55:12 -0400 |
commit | c3f7489af9a3a93be968364c8cbb7bf600643605 (patch) | |
tree | caaee1b100598bb6bce3854ee2be56b3abcda233 | |
parent | da692588c1f74f0e5ab5fe6e243b8cffcb812b1a (diff) |
make environment available even without POSIX environ
-rw-r--r-- | src/__main.c | 7 | ||||
-rw-r--r-- | src/stdlib/_stdlib.h | 1 | ||||
-rw-r--r-- | src/stdlib/getenv.c | 20 |
3 files changed, 17 insertions, 11 deletions
diff --git a/src/__main.c b/src/__main.c index 14e71594..a61cef86 100644 --- a/src/__main.c +++ b/src/__main.c @@ -2,6 +2,7 @@ #include "stdio.h" #include "locale.h" #include "stdio/_stdio.h" +#include "stdlib/_stdlib.h" #ifdef _POSIX_SOURCE #define DEFAULT_LOCALE "POSIX" @@ -20,8 +21,14 @@ static struct termios __tios; void __main(int argc, char **argv) { extern int main(int, char*[]); + + #ifdef _POSIX_SOURCE extern char **environ; environ = argv + argc + 1; + __stdlib.environ = environ; + #else + __stdlib.environ = argv + argc + 1; + #endif stdin = __stdio.FILES + 0; stdin->fd = 0; diff --git a/src/stdlib/_stdlib.h b/src/stdlib/_stdlib.h index b0aa3cd2..089de7df 100644 --- a/src/stdlib/_stdlib.h +++ b/src/stdlib/_stdlib.h @@ -15,6 +15,7 @@ struct __stdlib { struct atexit *prev; } atexit; unsigned int rand; + char **environ; }; extern struct __stdlib __stdlib; diff --git a/src/stdlib/getenv.c b/src/stdlib/getenv.c index e5129dc4..4ba83edb 100644 --- a/src/stdlib/getenv.c +++ b/src/stdlib/getenv.c @@ -1,24 +1,22 @@ #include <stdlib.h> #include "string.h" +#include "_stdlib.h" /** get an environment variable **/ char * getenv(const char * name) { - #ifdef _POSIX_SOURCE - extern char **environ; - int i = 0; + char **environ = __stdlib.environ; + size_t len = strlen(name); + size_t i = 0; - while (environ[i] != 0) { - if (!strncmp(environ[i], name, strlen(name)) && environ[i][strlen(name)] == '=') - return environ[i]; - i++; + for (i = 0; environ[i] != NULL; i++) { + if (!strncmp(environ[i], name, len) && environ[i][len] == '=') { + break; + } } - #else - (void)name; - #endif - return NULL; + return environ[i]; } /*** |