|
|
1.1 root 1: /******************************************************************************
2: * Copyright (c) 2004, 2008 IBM Corporation
3: * All rights reserved.
4: * This program and the accompanying materials
5: * are made available under the terms of the BSD License
6: * which accompanies this distribution, and is available at
7: * http://www.opensource.org/licenses/bsd-license.php
8: *
9: * Contributors:
10: * IBM Corporation - initial implementation
11: *****************************************************************************/
12: #include <stdio.h>
13: #include <stdlib.h>
14: #include <sys/types.h>
15: #include <sys/stat.h>
16: #include <fcntl.h>
17: #include <string.h>
18: #include <unistd.h>
19:
20: #include <cfgparse.h>
21:
22: static int inbetween_white(char *s, int max, char **start, char **end,
23: char **next);
24: static int add_header(struct ffs_chain_t *, struct ffs_header_t *);
25:
26: static int glob_come_from_cr = 0;
27:
28: static int
29: find_next_entry(int file, struct ffs_chain_t *chain)
30: {
31: #define MAX_LINE_SIZE 1024
32: char lnbuf[MAX_LINE_SIZE], b0 = 0, b1 = 0;
33: char *start, *end, *next;
34: struct ffs_header_t *hdr; //, *hdr2;
35: int lc, rc;
36: char c;
37:
38: /* search for new config line */
39: if (0 == glob_come_from_cr) {
40: while (1 == (rc = read(file, &c, 1))) {
41: //printf("b0=%c b1=%c c=%c\n",
42: // b0, b1, c);
43: b0 = b1;
44: b1 = c;
45: /* this looks for starting sign "<CR>[^#]" */
46: if (((0x0a == b0) || (0x0d == b0)) &&
47: (('#' != b1) && (0x0a != b1) && (0x0d != b1))) {
48: break;
49: }
50: }
51: } else {
52: /* normalize */
53: while (1 == (rc = read(file, &c, 1))) {
54: //printf("read c=%c\n", c);
55: if ((0x0a != c) && (0x0d != c)) {
56: break;
57: }
58: }
59: glob_come_from_cr = 0;
60: //printf("debug: glob_come_from_cr = 0\n");
61: }
62: if (1 != rc) {
63: return 1;
64: }
65:
66: /* now buffer it until end of line */
67: memset((void *) lnbuf, 0, MAX_LINE_SIZE);
68: lnbuf[0] = c;
69: lc = 1;
70: while ((1 == read(file, &(lnbuf[lc]), 1)) && (lc < MAX_LINE_SIZE)) {
71: //printf("read lnbuf=%c\n", lnbuf[lc]);
72: if ((0x0a == lnbuf[lc]) || (0x0d == lnbuf[lc])) {
73: glob_come_from_cr = 1;
74: //printf("debug: glob_come_from_cr = 1\n");
75: break;
76: }
77: lc++;
78: }
79:
80: /* allocate header */
81: hdr = malloc(sizeof(struct ffs_header_t));
82: if (NULL == hdr) {
83: perror("alloc memory");
84: return 2;
85: }
86: memset((void *) hdr, 0, sizeof(struct ffs_header_t));
87:
88: /* attach header to chain */
89: if (0 != add_header(chain, hdr)) {
90: return 2;
91: }
92:
93: /**********************************************************/
94: /* extract token name *********************************** */
95: start = NULL;
96: if (inbetween_white(lnbuf, MAX_LINE_SIZE, &start, &end, &next) != 0) {
97: printf("parsing error 1");
98: return 2;
99: }
100: /* get memory for it */
101: hdr->token = malloc(end - start + 1);
102: if (NULL == hdr->token) {
103: return 2;
104: }
105: /* set string */
106: strncpy(hdr->token, start, end - start + 1);
107: hdr->token[end - start] = 0;
108:
109: /**********************************************************/
110: /* extract file name *********************************** */
111: if (NULL == next) {
112: return 2;
113: }
114: start = next;
115: if (inbetween_white(lnbuf, MAX_LINE_SIZE, &start, &end, &next) != 0) {
116: printf("parsing error 1");
117: return 2;
118: }
119:
120: /* get memory for it */
121: hdr->imagefile = malloc(end - start + 1);
122: if (NULL == hdr->imagefile) {
123: return 2;
124: }
125:
126: /* check if file is existing */
127:
128: /* set string */
129: strncpy(hdr->imagefile, start, end - start + 1);
130: hdr->imagefile[end - start] = 0;
131:
132: /* check if entry is linked to another header */
133: if (':' == *start) {
134: printf
135: ("\nERROR: links are removed as feature in this version\n");
136: return 2;
137:
138: /*
139: start++;
140: if (0 != find_entry_by_token(chain, hdr->imagefile+1, &hdr2)) {
141: printf("[%s]: link to [%s] not found\n",
142: hdr->token, hdr->imagefile+1);
143: dump_fs_contents(chain);
144: return 2;
145: }
146: hdr->linked_to = hdr2;
147: */
148: }
149:
150: /**********************************************************/
151: /* extract flags name *********************************** */
152: if (NULL == next) {
153: return 2;
154: }
155: start = next;
156: if (inbetween_white(lnbuf, MAX_LINE_SIZE, &start, &end, &next) != 0) {
157: printf("parsing error 1");
158: return 2;
159: }
160: hdr->flags = strtoul(start, NULL, 16);
161:
162: /**********************************************************/
163: /* extract rom start name *********************************** */
164: if (NULL == next) {
165: return 2;
166: }
167: start = next;
168: if (inbetween_white(lnbuf, MAX_LINE_SIZE, &start, &end, &next) != 0) {
169: printf("parsing error 1");
170: return 2;
171: }
172: if ('-' == *start) {
173: /* this means not specific address request for data */
174: hdr->romaddr = 0;
175: } else {
176: /* data has to begin at specific address */
177: hdr->romaddr = strtoul(start, NULL, 16);
178: }
179:
180: return 0;
181: }
182:
183: int
184: read_config(int conf_file, struct ffs_chain_t *ffs_chain)
185: {
186: int rc;
187:
188: while (1) {
189: rc = find_next_entry(conf_file, ffs_chain);
190: if (rc != 0)
191: break;
192: }
193: return rc;
194: }
195:
196: static int
197: inbetween_white(char *s, int max, char **start, char **end, char **next)
198: {
199: int pos = 0, posalt;
200:
201: if (NULL != *start) {
202: pos = *start - s;
203: s = *start;
204: }
205:
206: /* wind to first non white */
207: while (pos < max) {
208: if ((' ' == *s) || (' ' == *s)) {
209: s++;
210: pos++;
211: continue;
212: }
213: break;
214: }
215: if (pos >= max) {
216: /* no non-white found */
217: return 1;
218: }
219:
220: /* assign start */
221: *start = s;
222:
223: /* wind to end of non white or end of buffer */
224: posalt = pos;
225: while (pos < max) {
226: if ((' ' == *s) || (' ' == *s) ||
227: (0x0a == *s) || (0x0d == *s)) {
228: break;
229: }
230: s++;
231: pos++;
232: }
233:
234: if (pos == posalt) {
235: return 1;
236: }
237:
238: *end = s;
239:
240: if ((pos + 1) >= max) {
241: *next = NULL;
242: } else {
243: *next = s;
244: }
245:
246: return 0;
247: }
248:
249: int
250: add_header(struct ffs_chain_t *chain, struct ffs_header_t *hdr)
251: {
252: struct ffs_header_t *next;
253:
254: if (NULL == chain->first) {
255: chain->count = 1;
256: chain->first = hdr;
257: return 0;
258: }
259: next = chain->first;
260:
261: /* find last */
262: while (NULL != next->next) {
263: next = next->next;
264: }
265: next->next = hdr;
266: chain->count++;
267:
268: return 0;
269: }
270:
271: void
272: dump_fs_contents(struct ffs_chain_t *chain)
273: {
274: struct ffs_header_t *next;
275:
276: if (NULL == chain->first) {
277: printf("no contents in fs\n");
278: return;
279: }
280: next = chain->first;
281:
282: while (1) {
283: if (NULL != next->token) {
284: printf("Token [%s] ", next->token);
285: } else {
286: printf(" [not-set], ");
287: }
288:
289: if (NULL != next->imagefile) {
290: printf(" <%s>, ", next->imagefile);
291: } else {
292: printf(" file<not-set>, ");
293: }
294:
295: printf("flags<%llx>, ", next->flags);
296: printf("romaddr<%llx>, ", next->romaddr);
297:
298: if (NULL != next->linked_to) {
299: printf("linked to [%s]", next->linked_to->token);
300: }
301:
302: printf("\n");
303: if (NULL == next->next) {
304: break;
305: }
306:
307: next = next->next;
308: }
309:
310: }
311:
312: void
313: free_chain_memory(struct ffs_chain_t *chain)
314: {
315: struct ffs_header_t *hdr, *next_hdr;
316:
317: if (NULL != chain->first) {
318: hdr = chain->first;
319: chain->first = NULL;
320: } else {
321: return;
322: }
323:
324: while (NULL != hdr) {
325: //printf("%p ", hdr);
326: if (NULL != hdr->token) {
327: //printf("free up %s\n", hdr->token);
328: free(hdr->token);
329: }
330: if (NULL != hdr->imagefile) {
331: free(hdr->imagefile);
332: }
333: next_hdr = hdr->next;
334: free(hdr);
335: hdr = next_hdr;
336: }
337: }
338:
339:
340: /*
341: * Detect duplicate entries in the romfs list
342: */
343: void
344: find_duplicates(struct ffs_chain_t *chain)
345: {
346: struct ffs_header_t *act, *sub;
347:
348: if (NULL == chain->first) {
349: printf("no contents in fs\n");
350: return;
351: }
352: act = chain->first;
353:
354: do {
355: sub = act->next;
356: while (sub != NULL) {
357:
358: if (act->token == NULL || sub->token == NULL) {
359: printf("find_duplicates: token not set!\n");
360: } else if (strcmp(act->token, sub->token) == 0) {
361: printf("*** NOTE: duplicate romfs file '%s'.\n",
362: act->token);
363: }
364: sub = sub->next;
365: }
366:
367: act = act->next;
368:
369: } while (act != NULL);
370:
371: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.