summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-08-12 13:55:12 -0400
committerJakob Kaivo <jkk@ung.org>2020-08-12 13:55:12 -0400
commitc3f7489af9a3a93be968364c8cbb7bf600643605 (patch)
treecaaee1b100598bb6bce3854ee2be56b3abcda233
parentda692588c1f74f0e5ab5fe6e243b8cffcb812b1a (diff)
make environment available even without POSIX environ
-rw-r--r--src/__main.c7
-rw-r--r--src/stdlib/_stdlib.h1
-rw-r--r--src/stdlib/getenv.c20
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];
}
/***