Annotation of embedtools/src/ub_env.c, revision 1.1.2.16
1.1.2.1 misho 1: #include "global.h"
2: #include "ub_env.h"
3:
4:
1.1.2.4 misho 5: env_t *env;
6:
1.1.2.3 misho 7: static int
1.1.2.5 misho 8: ub_flash_io(const char *csSec, int mode)
1.1.2.3 misho 9: {
1.1.2.7 misho 10: int f, l, rlen;
1.1.2.5 misho 11: const char *str;
1.1.2.14 misho 12: ssize_t siz, esiz;
1.1.2.7 misho 13: ait_val_t v;
1.1.2.12 misho 14: u_int crc;
1.1.2.3 misho 15:
16: FTRACE(4);
17:
1.1.2.12 misho 18: str = cfg_getAttribute(&cfg, csSec, "drive_size");
1.1.2.6 misho 19: siz = strtol(str, NULL, 0);
20: if (!siz)
21: return -1;
1.1.2.12 misho 22: str = cfg_getAttribute(&cfg, csSec, "env_size");
23: if (!str)
24: esiz = siz - sizeof env->env_crc;
25: else
26: esiz = strtol(str, NULL, 0);
27: str = cfg_getAttribute(&cfg, csSec, "drive_name");
1.1.2.5 misho 28: if (!str) {
29: printf("Error:: drive not found!\n");
30: return -1;
31: }
32:
1.1.2.7 misho 33: cfg_loadAttribute(&cfg, "ube", "lock", &v, UBE_LOCK);
1.1.2.8 misho 34: l = open(AIT_GET_STR(&v), O_CREAT | O_EXCL | O_WRONLY, 0644);
1.1.2.7 misho 35: if (l == -1) {
1.1.2.8 misho 36: printf("Error:: Locked u-boot-env map %s\n", AIT_GET_STR(&v));
1.1.2.7 misho 37: AIT_FREE_VAL(&v);
38: return -1;
39: }
40:
1.1.2.5 misho 41: f = open(str, mode);
1.1.2.3 misho 42: if (f == -1) {
1.1.2.5 misho 43: printf("Error:: Can't access u-boot-env device %s\n", str);
1.1.2.7 misho 44: close(l);
45: unlink(AIT_GET_STR(&v));
46: AIT_FREE_VAL(&v);
1.1.2.3 misho 47: return -1;
48: }
49:
50: if (mode & O_RDWR) {
1.1.2.13 misho 51: env->env_crc = crc32(0, (u_char*) env->env_data, esiz);
1.1.2.16! misho 52: VERB(5) printf("Write CRC32 0x%x\n", env->env_crc);
1.1.2.6 misho 53: rlen = write(f, env, siz);
54: if (rlen != siz)
55: printf("Error:: written %d bytes != %d\n", rlen, siz);
56: else
57: VERB(3) printf("Written %d bytes\n", rlen);
58: lseek(f, 0, SEEK_SET);
1.1.2.3 misho 59: }
60:
1.1.2.6 misho 61: rlen = read(f, env, siz);
62: if (rlen != siz)
63: printf("Error:: readed %d bytes != %d\n", rlen, siz);
64: else
65: VERB(3) printf("Readed %d bytes\n", rlen);
66:
1.1.2.12 misho 67: crc = crc32(0, (u_char*) env->env_data, esiz);
1.1.2.16! misho 68: VERB(5) printf("Calculated CRC32 0x%x\n", crc);
1.1.2.12 misho 69: if (crc != env->env_crc)
1.1.2.13 misho 70: VERB(1) printf("Warning:: Bad CRC, Flash crc32 0x%x != 0x%x\n",
71: env->env_crc, crc);
1.1.2.12 misho 72:
1.1.2.3 misho 73: close(f);
1.1.2.7 misho 74: close(l);
75: unlink(AIT_GET_STR(&v));
76: AIT_FREE_VAL(&v);
77: return 0;
1.1.2.3 misho 78: }
79:
1.1.2.10 misho 80: static inline const char *
81: ub_envmatch(const char *csName, const char *e)
82: {
83: while (*csName == *e++)
84: if (*csName++ == '=')
85: return e;
86: if (!*csName && *(e - 1) == '=')
87: return e;
88:
89: return NULL;
90: }
91:
1.1.2.4 misho 92: int
93: ub_load(const char *csSec)
94: {
95: const char *str;
96: size_t siz;
97:
1.1.2.5 misho 98: FTRACE(4);
99:
1.1.2.12 misho 100: str = cfg_getAttribute(&cfg, csSec, "drive_size");
1.1.2.4 misho 101: siz = strtol(str, NULL, 0);
102: if (!siz)
103: return -1;
104:
105: env = e_malloc(siz);
106: if (!env) {
107: ELIBERR(elwix);
108: return -1;
109: }
110:
1.1.2.7 misho 111: return ub_flash_io(csSec, O_RDONLY);
1.1.2.4 misho 112: }
113:
114: void
115: ub_unload()
116: {
1.1.2.5 misho 117: FTRACE(4);
118:
1.1.2.4 misho 119: if (env)
120: e_free(env);
121: }
122:
1.1.2.2 misho 123: const char*
1.1.2.5 misho 124: ub_getenv(const char *csSec, const char *csName)
1.1.2.2 misho 125: {
1.1.2.10 misho 126: char *e, *nxt;
1.1.2.14 misho 127: size_t dlen = 0;
1.1.2.2 misho 128: const char *str = NULL;
129:
1.1.2.3 misho 130: FTRACE(3);
131:
1.1.2.12 misho 132: str = cfg_getAttribute(&cfg, csSec, "env_size");
133: if (!str) {
134: str = cfg_getAttribute(&cfg, csSec, "drive_size");
135: if (!str)
1.1.2.13 misho 136: return NULL;
1.1.2.14 misho 137: dlen -= sizeof env->env_crc;
1.1.2.12 misho 138: }
1.1.2.14 misho 139: dlen += strtol(str, NULL, 0);
1.1.2.10 misho 140: if (!dlen)
141: return NULL;
142: else
143: dlen--;
144:
145: for (e = env->env_data; *e; e = nxt + 1) {
146: for (nxt = e; *nxt; nxt++)
147: if (nxt >= env->env_data + dlen) {
148: printf("Error:: environment not terminated\n");
149: return NULL;
150: }
151:
152: str = ub_envmatch(csName, e);
153: if (str)
154: break;
155: }
156:
1.1.2.2 misho 157: return str;
158: }
159:
160: int
1.1.2.5 misho 161: ub_setenv(const char *csSec, const char *csName, const char *csValue)
1.1.2.2 misho 162: {
1.1.2.11 misho 163: char *e, *nxt;
1.1.2.14 misho 164: ssize_t dlen = 0, len;
1.1.2.11 misho 165: const char *str, *old = NULL;
166:
1.1.2.3 misho 167: FTRACE(3);
168:
1.1.2.12 misho 169: str = cfg_getAttribute(&cfg, csSec, "env_size");
170: if (!str) {
171: str = cfg_getAttribute(&cfg, csSec, "drive_size");
172: if (!str)
173: return -1;
1.1.2.14 misho 174: dlen -= sizeof env->env_crc;
1.1.2.12 misho 175: }
1.1.2.14 misho 176: dlen += strtol(str, NULL, 0);
1.1.2.11 misho 177: if (!dlen)
178: return -1;
179: else
180: dlen--;
181:
182: for (e = env->env_data; *e; e = nxt + 1) {
183: for (nxt = e; *nxt; nxt++)
184: if (nxt >= env->env_data + dlen) {
185: printf("Error:: environment not terminated\n");
186: return -1;
187: }
188:
189: old = ub_envmatch(csName, e);
190: if (old)
191: break;
192: }
193:
194: /* Delete any existing definition */
195: if (old) {
196: if (!*++nxt)
197: *e = 0;
198: else
199: while (42) {
200: *e = *nxt++;
201: if (!*e && !*nxt)
202: break;
203: e++;
204: }
205: *++e = 0;
206: }
207:
208: if (csValue) {
209: /* Append new definition at the end */
210: for (e = env->env_data; *e || *(e + 1); e++);
211: if (e > env->env_data)
212: e++;
1.1.2.15 misho 213: /* "name" + "=" + "val" +"\0\0" check u-boot-env size */
1.1.2.11 misho 214: len = strlen(csName) + 2; /* add '=' for first arg, ' ' for all others */
215: len += strlen(csValue) + 1;
216: if (len > env->env_data + dlen - e) {
217: printf("Error:: Environment overflow!\n");
218: return -1;
219: }
220:
221: /* av pair */
222: while ((*e = *csName++))
223: e++;
224: *e = '=';
225: while ((*++e = *csValue++));
226:
227: /* end is marked with double '\0' */
228: *++e = 0;
229: }
230:
231: if (ub_flash_io(csSec, O_RDWR)) {
232: printf("Error:: Can't write environment to flash!\n");
233: return -1;
234: }
235:
1.1.2.2 misho 236: return 0;
237: }
1.1.2.9 misho 238:
239: int
240: ub_env(const char *csSec)
241: {
242: char *e, *nxt;
1.1.2.14 misho 243: ssize_t dlen = 0;
1.1.2.9 misho 244: const char *str;
245:
246: FTRACE(3);
247:
1.1.2.12 misho 248: str = cfg_getAttribute(&cfg, csSec, "env_size");
249: if (!str) {
250: str = cfg_getAttribute(&cfg, csSec, "drive_size");
251: if (!str)
252: return -1;
1.1.2.14 misho 253: dlen -= sizeof env->env_crc;
1.1.2.12 misho 254: }
1.1.2.14 misho 255: dlen += strtol(str, NULL, 0);
1.1.2.9 misho 256: if (!dlen)
257: return -1;
258: else
259: dlen--;
260:
261: for (e = env->env_data; *e; e = nxt + 1) {
262: for (nxt = e; *nxt; nxt++)
263: if (nxt >= env->env_data + dlen) {
264: printf("Error:: environment not terminated\n");
265: return -1;
266: }
267:
268: printf("%s\n", e);
269: }
270:
271: return 0;
272: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>