commit 085575ac98cb0ddcefbfbde0c6123dc4b1a5371f
parent 653911418286685682f182efffb71d66b0aa29bf
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Fri, 23 Nov 2018 17:37:55 +0000
[libk/libc] Make simpler getenv() and putenv()
Change-Id: I9acd7cb9b1788868bf7c20849acdba58fe32ce5e
Diffstat:
9 files changed, 50 insertions(+), 55 deletions(-)
diff --git a/include/bits/rmode/arch/stdlib.h b/include/bits/rmode/arch/stdlib.h
@@ -3,6 +3,13 @@ typedef unsigned long size_t;
#define SIZET_
#endif
+struct _Env {
+ int nvars;
+ char *vars[];
+};
+
+extern struct _Env *_environ();
+
#define EXIT_FAILURE 1
#define EXIT_SUCCESS 0
diff --git a/include/rcode.h b/include/rcode.h
@@ -56,6 +56,7 @@ struct bssmap {
unsigned char dumpstack;
unsigned char backtrace;
void *text;
+ void *environ;
size_t bsssize;
void *uartbase;
diff --git a/src/libc/arch/posix/getenv.c b/src/libc/arch/posix/getenv.c
@@ -7,16 +7,12 @@ extern char **_environ;
char *
getenv(const char *name)
{
- char **p;
+ char **p, *s;
size_t len = strlen(name);
- for (p = _environ; *p; ++p) {
- if (!strncmp(name, *p, len) && (*p)[len] == '=')
- break;
+ for (p = _environ; s = *p; ++p) {
+ if (!strncmp(name, s, len) && s[len] == '=')
+ return s + len + 1;
}
-
- if (!*p)
- return NULL;
-
- return &(*p)[len];
+ return NULL;
}
diff --git a/src/libc/arch/rmode/rcode/Makefile b/src/libc/arch/rmode/rcode/Makefile
@@ -8,9 +8,7 @@ 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
@@ -1,8 +0,0 @@
- .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
@@ -1,22 +1,24 @@
#include <stdlib.h>
#include <string.h>
+
#undef getenv
-extern char **_environ();
+extern void *getenviron(void);
char *
getenv(const char *name)
{
- char **p;
+ int i;
+ char *s;
+ struct _Env *envp;
size_t len = strlen(name);
- for (p = _environ() + 1; *p; ++p) {
- if (!strncmp(name, *p, len) && (*p)[len] == '=')
+ envp = getenviron();
+ for (i = 0; i < envp->nvars; i++) {
+ if ((s = envp->vars[i]) == NULL)
break;
+ if (!strncmp(name, s, len) && s[len] == '=')
+ return s + len + 1;
}
-
- if (!*p)
- return NULL;
-
- return &(*p)[len];
+ return NULL;
}
diff --git a/src/libk/putenv-native.c b/src/libk/putenv-native.c
@@ -2,14 +2,15 @@
#include <stdlib.h>
#include <string.h>
-extern char **_environ();
+extern void *getenviron(void);
int
putenv(char *name)
{
- char **p, **env, *s;
+ int i;
+ char *s;
+ struct _Env *envp;
size_t len;
- int *nump;
if ((s = strchr(name, '=')) == NULL) {
errno = EINVAL;
@@ -17,24 +18,19 @@ putenv(char *name)
}
len = s - name;
- env = _environ();
- for (p = env + 1; *p; ++p) {
- if (!strncmp(name, *p, len) && (*p)[len] == '=')
+ envp = getenviron();
+ for (i = 0; i < envp->nvars; i++) {
+ if ((s = envp->vars[i]) == NULL)
+ break;
+ if (!strncmp(name, s, len) && s[len] == '=')
break;
}
- if (*p) {
- *p = name;
- } else {
- nump = (int *) env;
- if (*nump == 0) {
- errno = ENOMEM;
- return -1;
- }
- --*nump;
- *p++ = name;
- *p = NULL;
+ if (i == envp->nvars) {
+ errno = ENOMEM;
+ return -1;
}
+ envp->vars[i] = name;
return 0;
}
diff --git a/target/native/crt.s b/target/native/crt.s
@@ -3,7 +3,7 @@ SRAMADDR = 0x2E00F000
SRAMSIZE = 4096
.text
- .globl _start,_environ
+ .globl _start
_start:
bl getpc
getpc:
@@ -43,12 +43,6 @@ initmem:
b.ne initmem
ret
-_environ:
- mov x0,sp
- mov x1,#(~4095)
- and x0,x0,x1
- ret
-
.section .rodata
outsync:
.asciz "out of sync"
diff --git a/target/native/rom.c b/target/native/rom.c
@@ -8,8 +8,8 @@
#include "sysreg.h"
#include "arch.h"
-#define ENVPOS 8
-#define ENVSIZ (ENVPOS * sizeof(char **))
+#define ENVPOS 7
+#define ENVSIZ (sizeof(struct _Env) + ENVPOS*sizeof(char *))
#define BSSSIZ 1024
typedef struct mach Mach;
@@ -34,6 +34,12 @@ geterrno(void)
return &bss->errno_;
}
+struct _Env *
+getenviron(void)
+{
+ return bss->environ;
+}
+
static void
imach(Mach *mp, void *txt, size_t txtsiz, void *ram, size_t ramsiz)
{
@@ -55,7 +61,6 @@ 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;
@@ -69,12 +74,16 @@ imach(Mach *mp, void *txt, size_t txtsiz, void *ram, size_t ramsiz)
static void
ibss(Mach *mp)
{
+ struct _Env *envp;
+
wsysreg(TPIDR_R, (uintptr_t) mp->bss_);
bss->text = mp->txt;
bss->backtrace = 1;
bss->dumpstack = 1;
bss->uartbase = (void *)UARTBASE;
bss->bsssize = sizeof(struct bssmap);
+ envp = bss->environ = mp->env;
+ envp->nvars = ENVPOS;
}
static void