9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
March/rmode/rom.c | 4+++-
Msrc/libc/arch/rmode/rcode/Makefile | 3+++
Asrc/libc/arch/rmode/rcode/_environ.s | 8++++++++
Asrc/libc/arch/rmode/rcode/getenv.c | 22++++++++++++++++++++++
Asrc/libc/arch/rmode/rcode/putenv.c | 40++++++++++++++++++++++++++++++++++++++++
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; +}