00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <dev/nvmem.h>
00034
00035 #include <stdint.h>
00036 #include <stdlib.h>
00037 #include <string.h>
00038
00039 #include <sys/environ.h>
00040
00041 NUTENVIRONMENT *nut_environ;
00042
00043
00044
00045
00046 static size_t read_string(int *addr, char *buf, size_t siz)
00047 {
00048 size_t rc = 0;
00049 char ch;
00050
00051 while (rc <= siz) {
00052 if (NutNvMemLoad(*addr, &ch, 1)) {
00053 rc = 0;
00054 break;
00055 }
00056 (*addr)++;
00057 if (ch == 0) {
00058 break;
00059 }
00060 if (buf) {
00061 *buf++ = ch;
00062 }
00063 rc++;
00064 }
00065 if (buf) {
00066 *buf = 0;
00067 }
00068 return rc;
00069 }
00070
00079 NUTENVIRONMENT *findenv(CONST char *name)
00080 {
00081 NUTENVIRONMENT *envp;
00082 size_t len;
00083 size_t max_len = 0;
00084 char *buf;
00085
00086 if (nut_environ == NULL) {
00087
00088 uint32_t magic;
00089 int addr = ENVIRON_EE_OFFSET;
00090 NUTENVIRONMENT *prvp = NULL;
00091
00092 if (NutNvMemLoad(addr, &magic, sizeof(magic)) == 0 && magic == ENVIRON_MAGIC) {
00093 addr += 4;
00094
00095 while ((len = read_string(&addr, NULL, MAX_ENVIRON_ITEM_SIZE)) > 0) {
00096 if (len > max_len) {
00097 max_len = len;
00098 }
00099 len = read_string(&addr, NULL, MAX_ENVIRON_ITEM_SIZE);
00100 if (len > max_len) {
00101 max_len = len;
00102 }
00103 }
00104
00105 addr = ENVIRON_EE_OFFSET + sizeof(magic);
00106 if (max_len && (buf = malloc(max_len + 1)) != NULL) {
00107 while ((len = read_string(&addr, buf, max_len)) > 0) {
00108 if ((envp = malloc(sizeof(NUTENVIRONMENT))) == NULL) {
00109 break;
00110 }
00111 memset(envp, 0, sizeof(NUTENVIRONMENT));
00112 if ((envp->env_name = malloc(len + 1)) == NULL) {
00113 free(envp);
00114 break;
00115 }
00116 strcpy(envp->env_name, buf);
00117 len = read_string(&addr, buf, max_len);
00118 if ((envp->env_value = malloc(len + 1)) == NULL) {
00119 break;
00120 }
00121 strcpy(envp->env_value, buf);
00122 if (prvp) {
00123 prvp->env_next = envp;
00124 envp->env_prev = prvp;
00125 } else {
00126 nut_environ = envp;
00127 }
00128 prvp = envp;
00129 }
00130 free(buf);
00131 }
00132 }
00133 }
00134 for (envp = nut_environ; envp; envp = envp->env_next) {
00135 if (strcmp(envp->env_name, name) == 0) {
00136 break;
00137 }
00138 }
00139 return envp;
00140 }
00141