commit 85743cc3e3d80b3e2a255986f154ad8b290b11a1
parent dc1b079b01eb577b1bd3628c2a3bd7cc83235cc5
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Wed, 21 Nov 2018 20:14:59 +0000
[libc/rmode] Add getenv() and putenv()
Change-Id: I1a6b75e23177204a77d437975aadf061c6c7190e
Diffstat:
5 files changed, 76 insertions(+), 1 deletion(-)
diff --git a/arch/rmode/rom.c b/arch/rmode/rom.c
@@ -7,7 +7,8 @@
#include "sysreg.h"
#include "arch.h"
-#define ENVSIZ 100
+#define ENVPOS 8
+#define ENVSIZ (ENVPOS * sizeof(char **))
#define BSSSIZ 1024
typedef struct mach Mach;
@@ -53,6 +54,7 @@ imach(Mach *mp, void *txt, size_t txtsiz, void *ram, size_t ramsiz)
mp->stacksiz = bp - ramp;
mp->envsiz = ENVSIZ;
+ ((int *) mp->env)[ENVPOS-1] = ENVPOS-1;
mp->bsssiz = BSSSIZ;
fp->sp = mp->sp;
diff --git a/src/libc/arch/rmode/rcode/Makefile b/src/libc/arch/rmode/rcode/Makefile
@@ -8,6 +8,9 @@ OBJS = _Exit.o \
_write.o \
_sys_errlist.o \
_read.o \
+ _environ.o \
+ getenv.o \
+ putenv.o \
all: $(OBJS)
diff --git a/src/libc/arch/rmode/rcode/_environ.s b/src/libc/arch/rmode/rcode/_environ.s
@@ -0,0 +1,8 @@
+ .text
+ .globl _environ
+
+_environ:
+ mov x0,sp
+ mov x1,#(~4095)
+ and x0,x0,x1
+ ret
diff --git a/src/libc/arch/rmode/rcode/getenv.c b/src/libc/arch/rmode/rcode/getenv.c
@@ -0,0 +1,22 @@
+#include <stdlib.h>
+#include <string.h>
+#undef getenv
+
+extern char **_environ();
+
+char *
+getenv(const char *name)
+{
+ char **p;
+ size_t len = strlen(name);
+
+ for (p = _environ() + 1; *p; ++p) {
+ if (!strncmp(name, *p, len) && (*p)[len] == '=')
+ break;
+ }
+
+ if (!*p)
+ return NULL;
+
+ return &(*p)[len];
+}
diff --git a/src/libc/arch/rmode/rcode/putenv.c b/src/libc/arch/rmode/rcode/putenv.c
@@ -0,0 +1,40 @@
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+extern char **_environ();
+
+int
+putenv(char *name)
+{
+ char **p, **env, *s;
+ size_t len;
+ int *nump;
+
+ if ((s = strchr(name, '=')) == NULL) {
+ errno = 1;
+ return -1;
+ }
+ len = s - name;
+
+ env = _environ();
+ for (p = env + 1; *p; ++p) {
+ if (!strncmp(name, *p, len) && (*p)[len] == '=')
+ break;
+ }
+
+ if (*p) {
+ *p = name;
+ } else {
+ nump = (int *) env;
+ if (*nump == 0) {
+ errno = 1;
+ return -1;
+ }
+ --*nump;
+ *p++ = name;
+ *p = NULL;
+ }
+
+ return 0;
+}