|
|
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: #include <getopt.h>
20:
21: #include <cfgparse.h>
22:
23: int verbose = 0;
24:
25: #define dprintf(fmt, args...) if (verbose) printf(fmt, ##args)
26:
27: static void
28: print_usage(void)
29: {
30: printf
31: ("Usage: build_romfs [-?] [--help] [-s|--romfs-size <romfs_size>]\n"
32: "\t[-p|--smart-pad] [-n|--notime] <config-file> <output-file>\n");
33: }
34:
35: unsigned long
36: str_to_num(const char *str)
37: {
38: char *s = (char *) str;
39: unsigned long num = strtoul(s, &s, 0);
40: if (s) {
41: if (s[0] == 'K')
42: num <<= 10;
43: if (s[0] == 'M')
44: num <<= 20;
45: }
46: return num;
47: }
48:
49: /*
50: * NOTE: We should consider to install an exit handler which does the
51: * unlink() of the output file. In case of error we just do exit() and
52: * forget about all the clumsy error handling free/close code, which
53: * blows up the code significantly and makes it hard to read.
54: */
55: int
56: main(int argc, char *argv[])
57: {
58: int conf_file, rc;
59: struct ffs_chain_t ffs_chain;
60: int c;
61: int smart_pad = 0; /* default */
62: int notime = 0;
63: const char *config_file = "boot_rom.ffs";
64: const char *output_file = "boot_rom.bin";
65:
66: memset((void *) &ffs_chain, 0, sizeof(struct ffs_chain_t));
67:
68: while (1) {
69: int option_index = 0;
70: static struct option long_options[] = {
71: {"romfs-size", 1, 0, 's'},
72: {"smart-pad", 0, 0, 'p'},
73: {"notime", 0, 0, 'n'},
74: {"verbose", 0, 0, 'v'},
75: {"help", 1, 0, 'h'},
76: {0, 0, 0, 0}
77: };
78: c = getopt_long(argc, argv, "s:ph?nv", long_options,
79: &option_index);
80: if (c == -1)
81: break;
82:
83: switch (c) {
84: case 's':
85: ffs_chain.romfs_size = str_to_num(optarg);
86: break;
87: case 'p':
88: smart_pad = 1;
89: break;
90: case 'n':
91: notime = 1;
92: break;
93: case 'v':
94: verbose = 1;
95: break;
96: case '?':
97: case 'h':
98: print_usage();
99: return EXIT_SUCCESS;
100: default:
101: printf("?? getopt returned character code 0%o ??\n", c);
102: }
103: }
104:
105: /* two files must always be specified: config-file and output-file */
106: if (optind + 2 != argc) {
107: print_usage();
108: return EXIT_FAILURE;
109: }
110:
111: config_file = argv[optind++];
112: output_file = argv[optind++];
113:
114: dprintf("ROMFS FILESYSTEM CREATION V0.3 (bad parser)\n"
115: "Build directory structure...\n"
116: " smart padding %s, maximum romfs size %d bytes\n",
117: smart_pad ? "enabled" : "disabled", ffs_chain.romfs_size);
118:
119: conf_file = open(config_file, O_RDONLY);
120: if (0 >= conf_file) {
121: perror("load config file:");
122: return EXIT_FAILURE;
123: }
124:
125: rc = read_config(conf_file, &ffs_chain);
126: close(conf_file);
127: if (rc < 1) {
128: fprintf(stderr, "flash cannot be built due to config errors\n");
129: return EXIT_FAILURE;
130: }
131:
132: rc = EXIT_SUCCESS;
133:
134: if (verbose)
135: dump_fs_contents(&ffs_chain);
136: if (smart_pad)
137: /* FIXME: size is only verified during reorder */
138: rc = reorder_ffs_chain(&ffs_chain);
139:
140: if (rc == EXIT_FAILURE)
141: goto out;
142:
143: dprintf("Build ffs and write to image file...\n");
144: if (build_ffs(&ffs_chain, output_file, notime) != 0) {
145: fprintf(stderr, "build ffs failed\n");
146: rc = EXIT_FAILURE;
147: } else {
148: rc = EXIT_SUCCESS;
149: }
150:
151: /* Check if there are any duplicate entries in the image,
152: print warning if this is the case. */
153: find_duplicates(&ffs_chain);
154: free_chain_memory(&ffs_chain);
155: dprintf("\n");
156:
157: out:
158: /* If the build failed, remove the target image file */
159: if (rc == EXIT_FAILURE)
160: unlink(output_file);
161:
162: return rc;
163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.