diff options
Diffstat (limited to 'mdk-stage1/dietlibc/lib/putenv.c')
-rw-r--r-- | mdk-stage1/dietlibc/lib/putenv.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/lib/putenv.c b/mdk-stage1/dietlibc/lib/putenv.c new file mode 100644 index 000000000..274b16b0e --- /dev/null +++ b/mdk-stage1/dietlibc/lib/putenv.c @@ -0,0 +1,37 @@ +#include <stdlib.h> +#include <string.h> + +int putenv(const char *string) { + int len; + int envc; + char *tmp; + const char **ep; + char **newenv; + static char **origenv=0; + if (!origenv) origenv=environ; + if (!(tmp=strchr(string,'='))) + len=strlen(string); + else + len=tmp-string+1; + for (envc=0, ep=(const char**)environ; *ep; ++ep) { + if (!memcmp(string,*ep,len)) { /* found */ + if (!tmp) { + for (; ep[1]; ++ep) ep[0]=ep[1]; + ep[0]=0; + return 0; + } + *ep=string; + return 0; + } + ++envc; + } + if (tmp) { + newenv=(char**)malloc((envc+2)*sizeof(char*)); + if (!newenv) return -1; + newenv[0]=(char*)string; + memcpy(newenv+1,environ,(envc+1)*sizeof(char*)); + if (environ!=origenv) free(environ); + environ=newenv; + } + return 0; +} |