summaryrefslogtreecommitdiff
path: root/navit/support
diff options
context:
space:
mode:
authorzaxl <zaxl@ffa7fe5e-494d-0410-b361-a75ebd5db220>2008-11-08 01:01:45 +0000
committerzaxl <zaxl@ffa7fe5e-494d-0410-b361-a75ebd5db220>2008-11-08 01:01:45 +0000
commite414aaebf123df0a585c1002c2f1f1e37051961c (patch)
treeed4df3d45356f9ea177c940144a7c578948dd16a /navit/support
parent554f8b071d06ea9528daa1aabf8cd71d1179a534 (diff)
downloadnavit-e414aaebf123df0a585c1002c2f1f1e37051961c.tar.gz
Add:support: Simple setenv/getenv for the support libc
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@1690 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/support')
-rw-r--r--navit/support/libc/libc.c91
1 files changed, 85 insertions, 6 deletions
diff --git a/navit/support/libc/libc.c b/navit/support/libc/libc.c
index 42d77f6dc..982c79d1d 100644
--- a/navit/support/libc/libc.c
+++ b/navit/support/libc/libc.c
@@ -1,25 +1,104 @@
#include "locale.h"
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
int errno;
+static int at_exit_registered;
+#define REGISTER_AT_EXIT() \
+ do { \
+ if (!at_exit_registered) \
+ at_exit_registered = !atexit(cleanup_libc); \
+ } while(0)
+
+#define MAXENV 32
+static char *envnames[MAXENV];
+static char *envvars[MAXENV];
+
+static void cleanup_libc(void)
+{
+ int i;
+ for (i=0; i <MAXENV; i++) {
+ if (envnames[i])
+ free(envnames[i]);
+ if (envvars[i])
+ free(envvars[i]);
+ }
+}
+
char *
getenv(char *name)
{
- return 0;
+ int i;
+ REGISTER_AT_EXIT();
+ for (i=0; i < MAXENV; i++) {
+ if (envnames[i] && !strcmp(envnames[i], name))
+ return envvars[i];
+ }
+ return NULL;
}
-void
-setenv(void)
+int
+setenv(const char *name, const char *value, int overwrite)
+{
+ int i;
+ char *val;
+ REGISTER_AT_EXIT();
+ for (i=0; i < MAXENV; i++) {
+ if (envnames[i] && !strcmp(envnames[i], name)) {
+ if (overwrite) {
+ val = strdup(value);
+ if (!val)
+ return -1;
+ if (envvars[i])
+ free(envvars[i]);
+ envvars[i] = val;
+ }
+ return 0;
+ }
+ }
+ for (i=0; i < MAXENV; i++) {
+ if (!envnames[i]) {
+ envnames[i] = strdup(name);
+ envvars[i] = strdup(value);
+ if (!envnames[i] || !envvars[i]) {
+ if (envnames[i])
+ free(envnames[i]);
+ if (envvars[i])
+ free(envvars[i]);
+ envnames[i] = NULL;
+ envvars[i] = NULL;
+ return -1;
+ }
+ return 0;
+ }
+ }
+ return -1;
+}
+
+int unsetenv(const char *name)
{
+ int i;
+ for (i=0; i < MAXENV; i++) {
+ if (envnames[i] && !strcmp(envnames[i], name)) {
+ free(envnames[i]);
+ envnames[i] = NULL;
+ if (envvars[i])
+ free(envvars[i]);
+ envvars[i] = NULL;
+ }
+ }
+ return 0;
}
char *
-getcwd(void)
+getcwd(char *buf, int size)
{
return "dummy";
}
char *
-getwd(void)
+getwd(char *buf)
{
return "dummy";
}
@@ -30,7 +109,7 @@ char *strtok_r(char *str, const char *delim, char **saveptr)
}
void
-perror(char *x)
+perror(const char *x)
{
}