OpenWrt – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | /* |
2 | File autogenerated by gengetopt version 2.22.5 |
||
3 | generated with the following command: |
||
4 | gengetopt -i imagetag.ggo -f imagetag_cmdline --file-name=imagetag_cmdline |
||
5 | |||
6 | The developers of gengetopt consider the fixed text that goes in all |
||
7 | gengetopt output files to be in the public domain: |
||
8 | we make no copyright claims on it. |
||
9 | */ |
||
10 | |||
11 | /* If we use autoconf. */ |
||
12 | #ifdef HAVE_CONFIG_H |
||
13 | #include "config.h" |
||
14 | #endif |
||
15 | |||
16 | #include <stdio.h> |
||
17 | #include <stdlib.h> |
||
18 | #include <string.h> |
||
19 | |||
20 | #ifndef FIX_UNUSED |
||
21 | #define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ |
||
22 | #endif |
||
23 | |||
24 | #include <getopt.h> |
||
25 | |||
26 | #include "imagetag_cmdline.h" |
||
27 | |||
28 | const char *gengetopt_args_info_purpose = "Generate image with CFE imagetag for Broadcom 63xx routers."; |
||
29 | |||
30 | const char *gengetopt_args_info_usage = "Usage: imagetag [OPTIONS]..."; |
||
31 | |||
32 | const char *gengetopt_args_info_description = "Copyright (C) 2008 Axel Gembe\nCopyright (C) 2009-2010 Daniel Dickinson\nLicensed unter the terms of the Gnu General Public License.\n\nGiven a root filesystem, a linux kernel, and an optional CFE, generates an \nimage with an imagetag for a Broadcom 63xx-based router. Additional parameters \nto be specified depend on the specfic brand and model of router."; |
||
33 | |||
34 | const char *gengetopt_args_info_help[] = { |
||
35 | " -h, --help Print help and exit", |
||
36 | " -V, --version Print version and exit", |
||
37 | " -i, --kernel=filename File with LZMA compressed kernel to include in \n the image.", |
||
38 | " -f, --rootfs=filename File with RootFS to include in the image.", |
||
39 | " -o, --output=filename Name of output file.", |
||
40 | " --cfe=filename File with CFE to include in the image.", |
||
41 | " -b, --boardid=STRING Board ID to set in the image (must match what \n router expects, e.g. \"96345GW2\").", |
||
42 | " -c, --chipid=STRING Chip ID to set in the image (must match the \n actual hardware, e.g. \"6345\").", |
||
43 | " -s, --flash-start=address Flash start address. (default=`0xBFC00000')", |
||
44 | " -n, --image-offset=offset Offset from start address for the first byte \n after the CFE (in memory). \n (default=`0x10000')", |
||
45 | " -v, --tag-version=STRING Version number for imagetag format. \n (default=`6')", |
||
46 | " -a, --signature=STRING Magic string (signature), for boards that need \n it. (default=`Broadcom Corporatio')", |
||
47 | " -m, --signature2=STRING Second magic string (signature2). \n (default=`ver. 2.0')", |
||
48 | " -k, --block-size=STRING Flash erase block size. (default=`0x10000')", |
||
49 | " -l, --load-addr=address Kernel load address.", |
||
50 | " -e, --entry=address Address where the kernel entry point will be \n for booting.", |
||
51 | " -y, --layoutver=STRING Flash layout version (version 2.2x of the \n Broadcom code requires this).", |
||
52 | " -1, --info1=STRING String for first vendor information section.", |
||
53 | " --altinfo=STRING String for vendor information section \n (alternate/pirelli).", |
||
54 | " -2, --info2=STRING String for second vendor information section.", |
||
55 | " --root-first Put the rootfs before the kernel (only for \n stock images, e.g. captured from the router's \n flash memory). (default=off)", |
||
56 | " -r, --rsa-signature=STRING String for RSA Signature section.", |
||
57 | " --second-image-flag=flag-value\n Dual Image Flag (2=not-specified). (possible \n values=\"0\", \"1\", \"2\" default=`2')", |
||
58 | " --inactive=flag-value Inactive Flag (2=not-specified). (possible \n values=\"0\", \"1\", \"2\" default=`2')", |
||
59 | " --reserved2=STRING String for second reserved section.", |
||
60 | " --kernel-file-has-header Indicates that the kernel file includes the \n kernel header with correct load address and \n entry point, so no changes are needed \n (default=off)", |
||
61 | " -p, --pad=size (in MiB) Pad the image to this size if smaller (in MiB)", |
||
62 | " --align-rootfs Align the rootfs start to erase block size \n (default=off)", |
||
63 | |||
64 | }; |
||
65 | |||
66 | typedef enum {ARG_NO |
||
67 | , ARG_FLAG |
||
68 | , ARG_STRING |
||
69 | , ARG_INT |
||
70 | } imagetag_cmdline_arg_type; |
||
71 | |||
72 | static |
||
73 | void clear_given (struct gengetopt_args_info *args_info); |
||
74 | static |
||
75 | void clear_args (struct gengetopt_args_info *args_info); |
||
76 | |||
77 | static int |
||
78 | imagetag_cmdline_internal (int argc, char **argv, struct gengetopt_args_info *args_info, |
||
79 | struct imagetag_cmdline_params *params, const char *additional_error); |
||
80 | |||
81 | static int |
||
82 | imagetag_cmdline_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error); |
||
83 | |||
84 | const char *imagetag_cmdline_second_image_flag_values[] = {"0", "1", "2", 0}; /*< Possible values for second-image-flag. */ |
||
85 | const char *imagetag_cmdline_inactive_values[] = {"0", "1", "2", 0}; /*< Possible values for inactive. */ |
||
86 | |||
87 | static char * |
||
88 | gengetopt_strdup (const char *s); |
||
89 | |||
90 | static |
||
91 | void clear_given (struct gengetopt_args_info *args_info) |
||
92 | { |
||
93 | args_info->help_given = 0 ; |
||
94 | args_info->version_given = 0 ; |
||
95 | args_info->kernel_given = 0 ; |
||
96 | args_info->rootfs_given = 0 ; |
||
97 | args_info->output_given = 0 ; |
||
98 | args_info->cfe_given = 0 ; |
||
99 | args_info->boardid_given = 0 ; |
||
100 | args_info->chipid_given = 0 ; |
||
101 | args_info->flash_start_given = 0 ; |
||
102 | args_info->image_offset_given = 0 ; |
||
103 | args_info->tag_version_given = 0 ; |
||
104 | args_info->signature_given = 0 ; |
||
105 | args_info->signature2_given = 0 ; |
||
106 | args_info->block_size_given = 0 ; |
||
107 | args_info->load_addr_given = 0 ; |
||
108 | args_info->entry_given = 0 ; |
||
109 | args_info->layoutver_given = 0 ; |
||
110 | args_info->info1_given = 0 ; |
||
111 | args_info->altinfo_given = 0 ; |
||
112 | args_info->info2_given = 0 ; |
||
113 | args_info->root_first_given = 0 ; |
||
114 | args_info->rsa_signature_given = 0 ; |
||
115 | args_info->second_image_flag_given = 0 ; |
||
116 | args_info->inactive_given = 0 ; |
||
117 | args_info->reserved2_given = 0 ; |
||
118 | args_info->kernel_file_has_header_given = 0 ; |
||
119 | args_info->pad_given = 0 ; |
||
120 | args_info->align_rootfs_given = 0 ; |
||
121 | } |
||
122 | |||
123 | static |
||
124 | void clear_args (struct gengetopt_args_info *args_info) |
||
125 | { |
||
126 | FIX_UNUSED (args_info); |
||
127 | args_info->kernel_arg = NULL; |
||
128 | args_info->kernel_orig = NULL; |
||
129 | args_info->rootfs_arg = NULL; |
||
130 | args_info->rootfs_orig = NULL; |
||
131 | args_info->output_arg = NULL; |
||
132 | args_info->output_orig = NULL; |
||
133 | args_info->cfe_arg = NULL; |
||
134 | args_info->cfe_orig = NULL; |
||
135 | args_info->boardid_arg = NULL; |
||
136 | args_info->boardid_orig = NULL; |
||
137 | args_info->chipid_arg = NULL; |
||
138 | args_info->chipid_orig = NULL; |
||
139 | args_info->flash_start_arg = gengetopt_strdup ("0xBFC00000"); |
||
140 | args_info->flash_start_orig = NULL; |
||
141 | args_info->image_offset_arg = gengetopt_strdup ("0x10000"); |
||
142 | args_info->image_offset_orig = NULL; |
||
143 | args_info->tag_version_arg = gengetopt_strdup ("6"); |
||
144 | args_info->tag_version_orig = NULL; |
||
145 | args_info->signature_arg = gengetopt_strdup ("Broadcom Corporatio"); |
||
146 | args_info->signature_orig = NULL; |
||
147 | args_info->signature2_arg = gengetopt_strdup ("ver. 2.0"); |
||
148 | args_info->signature2_orig = NULL; |
||
149 | args_info->block_size_arg = gengetopt_strdup ("0x10000"); |
||
150 | args_info->block_size_orig = NULL; |
||
151 | args_info->load_addr_arg = NULL; |
||
152 | args_info->load_addr_orig = NULL; |
||
153 | args_info->entry_arg = NULL; |
||
154 | args_info->entry_orig = NULL; |
||
155 | args_info->layoutver_arg = NULL; |
||
156 | args_info->layoutver_orig = NULL; |
||
157 | args_info->info1_arg = NULL; |
||
158 | args_info->info1_orig = NULL; |
||
159 | args_info->altinfo_arg = NULL; |
||
160 | args_info->altinfo_orig = NULL; |
||
161 | args_info->info2_arg = NULL; |
||
162 | args_info->info2_orig = NULL; |
||
163 | args_info->root_first_flag = 0; |
||
164 | args_info->rsa_signature_arg = NULL; |
||
165 | args_info->rsa_signature_orig = NULL; |
||
166 | args_info->second_image_flag_arg = gengetopt_strdup ("2"); |
||
167 | args_info->second_image_flag_orig = NULL; |
||
168 | args_info->inactive_arg = gengetopt_strdup ("2"); |
||
169 | args_info->inactive_orig = NULL; |
||
170 | args_info->reserved2_arg = NULL; |
||
171 | args_info->reserved2_orig = NULL; |
||
172 | args_info->kernel_file_has_header_flag = 0; |
||
173 | args_info->pad_orig = NULL; |
||
174 | args_info->align_rootfs_flag = 0; |
||
175 | |||
176 | } |
||
177 | |||
178 | static |
||
179 | void init_args_info(struct gengetopt_args_info *args_info) |
||
180 | { |
||
181 | |||
182 | |||
183 | args_info->help_help = gengetopt_args_info_help[0] ; |
||
184 | args_info->version_help = gengetopt_args_info_help[1] ; |
||
185 | args_info->kernel_help = gengetopt_args_info_help[2] ; |
||
186 | args_info->rootfs_help = gengetopt_args_info_help[3] ; |
||
187 | args_info->output_help = gengetopt_args_info_help[4] ; |
||
188 | args_info->cfe_help = gengetopt_args_info_help[5] ; |
||
189 | args_info->boardid_help = gengetopt_args_info_help[6] ; |
||
190 | args_info->chipid_help = gengetopt_args_info_help[7] ; |
||
191 | args_info->flash_start_help = gengetopt_args_info_help[8] ; |
||
192 | args_info->image_offset_help = gengetopt_args_info_help[9] ; |
||
193 | args_info->tag_version_help = gengetopt_args_info_help[10] ; |
||
194 | args_info->signature_help = gengetopt_args_info_help[11] ; |
||
195 | args_info->signature2_help = gengetopt_args_info_help[12] ; |
||
196 | args_info->block_size_help = gengetopt_args_info_help[13] ; |
||
197 | args_info->load_addr_help = gengetopt_args_info_help[14] ; |
||
198 | args_info->entry_help = gengetopt_args_info_help[15] ; |
||
199 | args_info->layoutver_help = gengetopt_args_info_help[16] ; |
||
200 | args_info->info1_help = gengetopt_args_info_help[17] ; |
||
201 | args_info->altinfo_help = gengetopt_args_info_help[18] ; |
||
202 | args_info->info2_help = gengetopt_args_info_help[19] ; |
||
203 | args_info->root_first_help = gengetopt_args_info_help[20] ; |
||
204 | args_info->rsa_signature_help = gengetopt_args_info_help[21] ; |
||
205 | args_info->second_image_flag_help = gengetopt_args_info_help[22] ; |
||
206 | args_info->inactive_help = gengetopt_args_info_help[23] ; |
||
207 | args_info->reserved2_help = gengetopt_args_info_help[24] ; |
||
208 | args_info->kernel_file_has_header_help = gengetopt_args_info_help[25] ; |
||
209 | args_info->pad_help = gengetopt_args_info_help[26] ; |
||
210 | args_info->align_rootfs_help = gengetopt_args_info_help[27] ; |
||
211 | |||
212 | } |
||
213 | |||
214 | void |
||
215 | imagetag_cmdline_print_version (void) |
||
216 | { |
||
217 | printf ("%s %s\n", |
||
218 | (strlen(IMAGETAG_CMDLINE_PACKAGE_NAME) ? IMAGETAG_CMDLINE_PACKAGE_NAME : IMAGETAG_CMDLINE_PACKAGE), |
||
219 | IMAGETAG_CMDLINE_VERSION); |
||
220 | } |
||
221 | |||
222 | static void print_help_common(void) { |
||
223 | imagetag_cmdline_print_version (); |
||
224 | |||
225 | if (strlen(gengetopt_args_info_purpose) > 0) |
||
226 | printf("\n%s\n", gengetopt_args_info_purpose); |
||
227 | |||
228 | if (strlen(gengetopt_args_info_usage) > 0) |
||
229 | printf("\n%s\n", gengetopt_args_info_usage); |
||
230 | |||
231 | printf("\n"); |
||
232 | |||
233 | if (strlen(gengetopt_args_info_description) > 0) |
||
234 | printf("%s\n\n", gengetopt_args_info_description); |
||
235 | } |
||
236 | |||
237 | void |
||
238 | imagetag_cmdline_print_help (void) |
||
239 | { |
||
240 | int i = 0; |
||
241 | print_help_common(); |
||
242 | while (gengetopt_args_info_help[i]) |
||
243 | printf("%s\n", gengetopt_args_info_help[i++]); |
||
244 | } |
||
245 | |||
246 | void |
||
247 | imagetag_cmdline_init (struct gengetopt_args_info *args_info) |
||
248 | { |
||
249 | clear_given (args_info); |
||
250 | clear_args (args_info); |
||
251 | init_args_info (args_info); |
||
252 | } |
||
253 | |||
254 | void |
||
255 | imagetag_cmdline_params_init(struct imagetag_cmdline_params *params) |
||
256 | { |
||
257 | if (params) |
||
258 | { |
||
259 | params->override = 0; |
||
260 | params->initialize = 1; |
||
261 | params->check_required = 1; |
||
262 | params->check_ambiguity = 0; |
||
263 | params->print_errors = 1; |
||
264 | } |
||
265 | } |
||
266 | |||
267 | struct imagetag_cmdline_params * |
||
268 | imagetag_cmdline_params_create(void) |
||
269 | { |
||
270 | struct imagetag_cmdline_params *params = |
||
271 | (struct imagetag_cmdline_params *)malloc(sizeof(struct imagetag_cmdline_params)); |
||
272 | imagetag_cmdline_params_init(params); |
||
273 | return params; |
||
274 | } |
||
275 | |||
276 | static void |
||
277 | free_string_field (char **s) |
||
278 | { |
||
279 | if (*s) |
||
280 | { |
||
281 | free (*s); |
||
282 | *s = 0; |
||
283 | } |
||
284 | } |
||
285 | |||
286 | |||
287 | static void |
||
288 | imagetag_cmdline_release (struct gengetopt_args_info *args_info) |
||
289 | { |
||
290 | |||
291 | free_string_field (&(args_info->kernel_arg)); |
||
292 | free_string_field (&(args_info->kernel_orig)); |
||
293 | free_string_field (&(args_info->rootfs_arg)); |
||
294 | free_string_field (&(args_info->rootfs_orig)); |
||
295 | free_string_field (&(args_info->output_arg)); |
||
296 | free_string_field (&(args_info->output_orig)); |
||
297 | free_string_field (&(args_info->cfe_arg)); |
||
298 | free_string_field (&(args_info->cfe_orig)); |
||
299 | free_string_field (&(args_info->boardid_arg)); |
||
300 | free_string_field (&(args_info->boardid_orig)); |
||
301 | free_string_field (&(args_info->chipid_arg)); |
||
302 | free_string_field (&(args_info->chipid_orig)); |
||
303 | free_string_field (&(args_info->flash_start_arg)); |
||
304 | free_string_field (&(args_info->flash_start_orig)); |
||
305 | free_string_field (&(args_info->image_offset_arg)); |
||
306 | free_string_field (&(args_info->image_offset_orig)); |
||
307 | free_string_field (&(args_info->tag_version_arg)); |
||
308 | free_string_field (&(args_info->tag_version_orig)); |
||
309 | free_string_field (&(args_info->signature_arg)); |
||
310 | free_string_field (&(args_info->signature_orig)); |
||
311 | free_string_field (&(args_info->signature2_arg)); |
||
312 | free_string_field (&(args_info->signature2_orig)); |
||
313 | free_string_field (&(args_info->block_size_arg)); |
||
314 | free_string_field (&(args_info->block_size_orig)); |
||
315 | free_string_field (&(args_info->load_addr_arg)); |
||
316 | free_string_field (&(args_info->load_addr_orig)); |
||
317 | free_string_field (&(args_info->entry_arg)); |
||
318 | free_string_field (&(args_info->entry_orig)); |
||
319 | free_string_field (&(args_info->layoutver_arg)); |
||
320 | free_string_field (&(args_info->layoutver_orig)); |
||
321 | free_string_field (&(args_info->info1_arg)); |
||
322 | free_string_field (&(args_info->info1_orig)); |
||
323 | free_string_field (&(args_info->altinfo_arg)); |
||
324 | free_string_field (&(args_info->altinfo_orig)); |
||
325 | free_string_field (&(args_info->info2_arg)); |
||
326 | free_string_field (&(args_info->info2_orig)); |
||
327 | free_string_field (&(args_info->rsa_signature_arg)); |
||
328 | free_string_field (&(args_info->rsa_signature_orig)); |
||
329 | free_string_field (&(args_info->second_image_flag_arg)); |
||
330 | free_string_field (&(args_info->second_image_flag_orig)); |
||
331 | free_string_field (&(args_info->inactive_arg)); |
||
332 | free_string_field (&(args_info->inactive_orig)); |
||
333 | free_string_field (&(args_info->reserved2_arg)); |
||
334 | free_string_field (&(args_info->reserved2_orig)); |
||
335 | free_string_field (&(args_info->pad_orig)); |
||
336 | |||
337 | |||
338 | |||
339 | clear_given (args_info); |
||
340 | } |
||
341 | |||
342 | /** |
||
343 | * @param val the value to check |
||
344 | * @param values the possible values |
||
345 | * @return the index of the matched value: |
||
346 | * -1 if no value matched, |
||
347 | * -2 if more than one value has matched |
||
348 | */ |
||
349 | static int |
||
350 | check_possible_values(const char *val, const char *values[]) |
||
351 | { |
||
352 | int i, found, last; |
||
353 | size_t len; |
||
354 | |||
355 | if (!val) /* otherwise strlen() crashes below */ |
||
356 | return -1; /* -1 means no argument for the option */ |
||
357 | |||
358 | found = last = 0; |
||
359 | |||
360 | for (i = 0, len = strlen(val); values[i]; ++i) |
||
361 | { |
||
362 | if (strncmp(val, values[i], len) == 0) |
||
363 | { |
||
364 | ++found; |
||
365 | last = i; |
||
366 | if (strlen(values[i]) == len) |
||
367 | return i; /* exact macth no need to check more */ |
||
368 | } |
||
369 | } |
||
370 | |||
371 | if (found == 1) /* one match: OK */ |
||
372 | return last; |
||
373 | |||
374 | return (found ? -2 : -1); /* return many values or none matched */ |
||
375 | } |
||
376 | |||
377 | |||
378 | static void |
||
379 | write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) |
||
380 | { |
||
381 | int found = -1; |
||
382 | if (arg) { |
||
383 | if (values) { |
||
384 | found = check_possible_values(arg, values); |
||
385 | } |
||
386 | if (found >= 0) |
||
387 | fprintf(outfile, "%s=\"%s\" # %s\n", opt, arg, values[found]); |
||
388 | else |
||
389 | fprintf(outfile, "%s=\"%s\"\n", opt, arg); |
||
390 | } else { |
||
391 | fprintf(outfile, "%s\n", opt); |
||
392 | } |
||
393 | } |
||
394 | |||
395 | |||
396 | int |
||
397 | imagetag_cmdline_dump(FILE *outfile, struct gengetopt_args_info *args_info) |
||
398 | { |
||
399 | int i = 0; |
||
400 | |||
401 | if (!outfile) |
||
402 | { |
||
403 | fprintf (stderr, "%s: cannot dump options to stream\n", IMAGETAG_CMDLINE_PACKAGE); |
||
404 | return EXIT_FAILURE; |
||
405 | } |
||
406 | |||
407 | if (args_info->help_given) |
||
408 | write_into_file(outfile, "help", 0, 0 ); |
||
409 | if (args_info->version_given) |
||
410 | write_into_file(outfile, "version", 0, 0 ); |
||
411 | if (args_info->kernel_given) |
||
412 | write_into_file(outfile, "kernel", args_info->kernel_orig, 0); |
||
413 | if (args_info->rootfs_given) |
||
414 | write_into_file(outfile, "rootfs", args_info->rootfs_orig, 0); |
||
415 | if (args_info->output_given) |
||
416 | write_into_file(outfile, "output", args_info->output_orig, 0); |
||
417 | if (args_info->cfe_given) |
||
418 | write_into_file(outfile, "cfe", args_info->cfe_orig, 0); |
||
419 | if (args_info->boardid_given) |
||
420 | write_into_file(outfile, "boardid", args_info->boardid_orig, 0); |
||
421 | if (args_info->chipid_given) |
||
422 | write_into_file(outfile, "chipid", args_info->chipid_orig, 0); |
||
423 | if (args_info->flash_start_given) |
||
424 | write_into_file(outfile, "flash-start", args_info->flash_start_orig, 0); |
||
425 | if (args_info->image_offset_given) |
||
426 | write_into_file(outfile, "image-offset", args_info->image_offset_orig, 0); |
||
427 | if (args_info->tag_version_given) |
||
428 | write_into_file(outfile, "tag-version", args_info->tag_version_orig, 0); |
||
429 | if (args_info->signature_given) |
||
430 | write_into_file(outfile, "signature", args_info->signature_orig, 0); |
||
431 | if (args_info->signature2_given) |
||
432 | write_into_file(outfile, "signature2", args_info->signature2_orig, 0); |
||
433 | if (args_info->block_size_given) |
||
434 | write_into_file(outfile, "block-size", args_info->block_size_orig, 0); |
||
435 | if (args_info->load_addr_given) |
||
436 | write_into_file(outfile, "load-addr", args_info->load_addr_orig, 0); |
||
437 | if (args_info->entry_given) |
||
438 | write_into_file(outfile, "entry", args_info->entry_orig, 0); |
||
439 | if (args_info->layoutver_given) |
||
440 | write_into_file(outfile, "layoutver", args_info->layoutver_orig, 0); |
||
441 | if (args_info->info1_given) |
||
442 | write_into_file(outfile, "info1", args_info->info1_orig, 0); |
||
443 | if (args_info->altinfo_given) |
||
444 | write_into_file(outfile, "altinfo", args_info->altinfo_orig, 0); |
||
445 | if (args_info->info2_given) |
||
446 | write_into_file(outfile, "info2", args_info->info2_orig, 0); |
||
447 | if (args_info->root_first_given) |
||
448 | write_into_file(outfile, "root-first", 0, 0 ); |
||
449 | if (args_info->rsa_signature_given) |
||
450 | write_into_file(outfile, "rsa-signature", args_info->rsa_signature_orig, 0); |
||
451 | if (args_info->second_image_flag_given) |
||
452 | write_into_file(outfile, "second-image-flag", args_info->second_image_flag_orig, imagetag_cmdline_second_image_flag_values); |
||
453 | if (args_info->inactive_given) |
||
454 | write_into_file(outfile, "inactive", args_info->inactive_orig, imagetag_cmdline_inactive_values); |
||
455 | if (args_info->reserved2_given) |
||
456 | write_into_file(outfile, "reserved2", args_info->reserved2_orig, 0); |
||
457 | if (args_info->kernel_file_has_header_given) |
||
458 | write_into_file(outfile, "kernel-file-has-header", 0, 0 ); |
||
459 | if (args_info->pad_given) |
||
460 | write_into_file(outfile, "pad", args_info->pad_orig, 0); |
||
461 | if (args_info->align_rootfs_given) |
||
462 | write_into_file(outfile, "align-rootfs", 0, 0 ); |
||
463 | |||
464 | |||
465 | i = EXIT_SUCCESS; |
||
466 | return i; |
||
467 | } |
||
468 | |||
469 | int |
||
470 | imagetag_cmdline_file_save(const char *filename, struct gengetopt_args_info *args_info) |
||
471 | { |
||
472 | FILE *outfile; |
||
473 | int i = 0; |
||
474 | |||
475 | outfile = fopen(filename, "w"); |
||
476 | |||
477 | if (!outfile) |
||
478 | { |
||
479 | fprintf (stderr, "%s: cannot open file for writing: %s\n", IMAGETAG_CMDLINE_PACKAGE, filename); |
||
480 | return EXIT_FAILURE; |
||
481 | } |
||
482 | |||
483 | i = imagetag_cmdline_dump(outfile, args_info); |
||
484 | fclose (outfile); |
||
485 | |||
486 | return i; |
||
487 | } |
||
488 | |||
489 | void |
||
490 | imagetag_cmdline_free (struct gengetopt_args_info *args_info) |
||
491 | { |
||
492 | imagetag_cmdline_release (args_info); |
||
493 | } |
||
494 | |||
495 | /** @brief replacement of strdup, which is not standard */ |
||
496 | char * |
||
497 | gengetopt_strdup (const char *s) |
||
498 | { |
||
499 | char *result = 0; |
||
500 | if (!s) |
||
501 | return result; |
||
502 | |||
503 | result = (char*)malloc(strlen(s) + 1); |
||
504 | if (result == (char*)0) |
||
505 | return (char*)0; |
||
506 | strcpy(result, s); |
||
507 | return result; |
||
508 | } |
||
509 | |||
510 | int |
||
511 | imagetag_cmdline (int argc, char **argv, struct gengetopt_args_info *args_info) |
||
512 | { |
||
513 | return imagetag_cmdline2 (argc, argv, args_info, 0, 1, 1); |
||
514 | } |
||
515 | |||
516 | int |
||
517 | imagetag_cmdline_ext (int argc, char **argv, struct gengetopt_args_info *args_info, |
||
518 | struct imagetag_cmdline_params *params) |
||
519 | { |
||
520 | int result; |
||
521 | result = imagetag_cmdline_internal (argc, argv, args_info, params, 0); |
||
522 | |||
523 | if (result == EXIT_FAILURE) |
||
524 | { |
||
525 | imagetag_cmdline_free (args_info); |
||
526 | exit (EXIT_FAILURE); |
||
527 | } |
||
528 | |||
529 | return result; |
||
530 | } |
||
531 | |||
532 | int |
||
533 | imagetag_cmdline2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) |
||
534 | { |
||
535 | int result; |
||
536 | struct imagetag_cmdline_params params; |
||
537 | |||
538 | params.override = override; |
||
539 | params.initialize = initialize; |
||
540 | params.check_required = check_required; |
||
541 | params.check_ambiguity = 0; |
||
542 | params.print_errors = 1; |
||
543 | |||
544 | result = imagetag_cmdline_internal (argc, argv, args_info, ¶ms, 0); |
||
545 | |||
546 | if (result == EXIT_FAILURE) |
||
547 | { |
||
548 | imagetag_cmdline_free (args_info); |
||
549 | exit (EXIT_FAILURE); |
||
550 | } |
||
551 | |||
552 | return result; |
||
553 | } |
||
554 | |||
555 | int |
||
556 | imagetag_cmdline_required (struct gengetopt_args_info *args_info, const char *prog_name) |
||
557 | { |
||
558 | int result = EXIT_SUCCESS; |
||
559 | |||
560 | if (imagetag_cmdline_required2(args_info, prog_name, 0) > 0) |
||
561 | result = EXIT_FAILURE; |
||
562 | |||
563 | if (result == EXIT_FAILURE) |
||
564 | { |
||
565 | imagetag_cmdline_free (args_info); |
||
566 | exit (EXIT_FAILURE); |
||
567 | } |
||
568 | |||
569 | return result; |
||
570 | } |
||
571 | |||
572 | int |
||
573 | imagetag_cmdline_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error) |
||
574 | { |
||
575 | int error = 0; |
||
576 | FIX_UNUSED (additional_error); |
||
577 | |||
578 | /* checks for required options */ |
||
579 | if (! args_info->kernel_given) |
||
580 | { |
||
581 | fprintf (stderr, "%s: '--kernel' ('-i') option required%s\n", prog_name, (additional_error ? additional_error : "")); |
||
582 | error = 1; |
||
583 | } |
||
584 | |||
585 | if (! args_info->rootfs_given) |
||
586 | { |
||
587 | fprintf (stderr, "%s: '--rootfs' ('-f') option required%s\n", prog_name, (additional_error ? additional_error : "")); |
||
588 | error = 1; |
||
589 | } |
||
590 | |||
591 | if (! args_info->output_given) |
||
592 | { |
||
593 | fprintf (stderr, "%s: '--output' ('-o') option required%s\n", prog_name, (additional_error ? additional_error : "")); |
||
594 | error = 1; |
||
595 | } |
||
596 | |||
597 | if (! args_info->boardid_given) |
||
598 | { |
||
599 | fprintf (stderr, "%s: '--boardid' ('-b') option required%s\n", prog_name, (additional_error ? additional_error : "")); |
||
600 | error = 1; |
||
601 | } |
||
602 | |||
603 | if (! args_info->chipid_given) |
||
604 | { |
||
605 | fprintf (stderr, "%s: '--chipid' ('-c') option required%s\n", prog_name, (additional_error ? additional_error : "")); |
||
606 | error = 1; |
||
607 | } |
||
608 | |||
609 | if (! args_info->load_addr_given) |
||
610 | { |
||
611 | fprintf (stderr, "%s: '--load-addr' ('-l') option required%s\n", prog_name, (additional_error ? additional_error : "")); |
||
612 | error = 1; |
||
613 | } |
||
614 | |||
615 | if (! args_info->entry_given) |
||
616 | { |
||
617 | fprintf (stderr, "%s: '--entry' ('-e') option required%s\n", prog_name, (additional_error ? additional_error : "")); |
||
618 | error = 1; |
||
619 | } |
||
620 | |||
621 | |||
622 | /* checks for dependences among options */ |
||
623 | |||
624 | return error; |
||
625 | } |
||
626 | |||
627 | |||
628 | static char *package_name = 0; |
||
629 | |||
630 | /** |
||
631 | * @brief updates an option |
||
632 | * @param field the generic pointer to the field to update |
||
633 | * @param orig_field the pointer to the orig field |
||
634 | * @param field_given the pointer to the number of occurrence of this option |
||
635 | * @param prev_given the pointer to the number of occurrence already seen |
||
636 | * @param value the argument for this option (if null no arg was specified) |
||
637 | * @param possible_values the possible values for this option (if specified) |
||
638 | * @param default_value the default value (in case the option only accepts fixed values) |
||
639 | * @param arg_type the type of this option |
||
640 | * @param check_ambiguity @see imagetag_cmdline_params.check_ambiguity |
||
641 | * @param override @see imagetag_cmdline_params.override |
||
642 | * @param no_free whether to free a possible previous value |
||
643 | * @param multiple_option whether this is a multiple option |
||
644 | * @param long_opt the corresponding long option |
||
645 | * @param short_opt the corresponding short option (or '-' if none) |
||
646 | * @param additional_error possible further error specification |
||
647 | */ |
||
648 | static |
||
649 | int update_arg(void *field, char **orig_field, |
||
650 | unsigned int *field_given, unsigned int *prev_given, |
||
651 | char *value, const char *possible_values[], |
||
652 | const char *default_value, |
||
653 | imagetag_cmdline_arg_type arg_type, |
||
654 | int check_ambiguity, int override, |
||
655 | int no_free, int multiple_option, |
||
656 | const char *long_opt, char short_opt, |
||
657 | const char *additional_error) |
||
658 | { |
||
659 | char *stop_char = 0; |
||
660 | const char *val = value; |
||
661 | int found; |
||
662 | char **string_field; |
||
663 | FIX_UNUSED (field); |
||
664 | |||
665 | stop_char = 0; |
||
666 | found = 0; |
||
667 | |||
668 | if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) |
||
669 | { |
||
670 | if (short_opt != '-') |
||
671 | fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", |
||
672 | package_name, long_opt, short_opt, |
||
673 | (additional_error ? additional_error : "")); |
||
674 | else |
||
675 | fprintf (stderr, "%s: `--%s' option given more than once%s\n", |
||
676 | package_name, long_opt, |
||
677 | (additional_error ? additional_error : "")); |
||
678 | return 1; /* failure */ |
||
679 | } |
||
680 | |||
681 | if (possible_values && (found = check_possible_values((value ? value : default_value), possible_values)) < 0) |
||
682 | { |
||
683 | if (short_opt != '-') |
||
684 | fprintf (stderr, "%s: %s argument, \"%s\", for option `--%s' (`-%c')%s\n", |
||
685 | package_name, (found == -2) ? "ambiguous" : "invalid", value, long_opt, short_opt, |
||
686 | (additional_error ? additional_error : "")); |
||
687 | else |
||
688 | fprintf (stderr, "%s: %s argument, \"%s\", for option `--%s'%s\n", |
||
689 | package_name, (found == -2) ? "ambiguous" : "invalid", value, long_opt, |
||
690 | (additional_error ? additional_error : "")); |
||
691 | return 1; /* failure */ |
||
692 | } |
||
693 | |||
694 | if (field_given && *field_given && ! override) |
||
695 | return 0; |
||
696 | if (prev_given) |
||
697 | (*prev_given)++; |
||
698 | if (field_given) |
||
699 | (*field_given)++; |
||
700 | if (possible_values) |
||
701 | val = possible_values[found]; |
||
702 | |||
703 | switch(arg_type) { |
||
704 | case ARG_FLAG: |
||
705 | *((int *)field) = !*((int *)field); |
||
706 | break; |
||
707 | case ARG_INT: |
||
708 | if (val) *((int *)field) = strtol (val, &stop_char, 0); |
||
709 | break; |
||
710 | case ARG_STRING: |
||
711 | if (val) { |
||
712 | string_field = (char **)field; |
||
713 | if (!no_free && *string_field) |
||
714 | free (*string_field); /* free previous string */ |
||
715 | *string_field = gengetopt_strdup (val); |
||
716 | } |
||
717 | break; |
||
718 | default: |
||
719 | break; |
||
720 | }; |
||
721 | |||
722 | /* check numeric conversion */ |
||
723 | switch(arg_type) { |
||
724 | case ARG_INT: |
||
725 | if (val && !(stop_char && *stop_char == '\0')) { |
||
726 | fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val); |
||
727 | return 1; /* failure */ |
||
728 | } |
||
729 | break; |
||
730 | default: |
||
731 | ; |
||
732 | }; |
||
733 | |||
734 | /* store the original value */ |
||
735 | switch(arg_type) { |
||
736 | case ARG_NO: |
||
737 | case ARG_FLAG: |
||
738 | break; |
||
739 | default: |
||
740 | if (value && orig_field) { |
||
741 | if (no_free) { |
||
742 | *orig_field = value; |
||
743 | } else { |
||
744 | if (*orig_field) |
||
745 | free (*orig_field); /* free previous string */ |
||
746 | *orig_field = gengetopt_strdup (value); |
||
747 | } |
||
748 | } |
||
749 | }; |
||
750 | |||
751 | return 0; /* OK */ |
||
752 | } |
||
753 | |||
754 | |||
755 | int |
||
756 | imagetag_cmdline_internal ( |
||
757 | int argc, char **argv, struct gengetopt_args_info *args_info, |
||
758 | struct imagetag_cmdline_params *params, const char *additional_error) |
||
759 | { |
||
760 | int c; /* Character of the parsed option. */ |
||
761 | |||
762 | int error = 0; |
||
763 | struct gengetopt_args_info local_args_info; |
||
764 | |||
765 | int override; |
||
766 | int initialize; |
||
767 | int check_required; |
||
768 | int check_ambiguity; |
||
769 | |||
770 | package_name = argv[0]; |
||
771 | |||
772 | override = params->override; |
||
773 | initialize = params->initialize; |
||
774 | check_required = params->check_required; |
||
775 | check_ambiguity = params->check_ambiguity; |
||
776 | |||
777 | if (initialize) |
||
778 | imagetag_cmdline_init (args_info); |
||
779 | |||
780 | imagetag_cmdline_init (&local_args_info); |
||
781 | |||
782 | optarg = 0; |
||
783 | optind = 0; |
||
784 | opterr = params->print_errors; |
||
785 | optopt = '?'; |
||
786 | |||
787 | while (1) |
||
788 | { |
||
789 | int option_index = 0; |
||
790 | |||
791 | static struct option long_options[] = { |
||
792 | { "help", 0, NULL, 'h' }, |
||
793 | { "version", 0, NULL, 'V' }, |
||
794 | { "kernel", 1, NULL, 'i' }, |
||
795 | { "rootfs", 1, NULL, 'f' }, |
||
796 | { "output", 1, NULL, 'o' }, |
||
797 | { "cfe", 1, NULL, 0 }, |
||
798 | { "boardid", 1, NULL, 'b' }, |
||
799 | { "chipid", 1, NULL, 'c' }, |
||
800 | { "flash-start", 1, NULL, 's' }, |
||
801 | { "image-offset", 1, NULL, 'n' }, |
||
802 | { "tag-version", 1, NULL, 'v' }, |
||
803 | { "signature", 1, NULL, 'a' }, |
||
804 | { "signature2", 1, NULL, 'm' }, |
||
805 | { "block-size", 1, NULL, 'k' }, |
||
806 | { "load-addr", 1, NULL, 'l' }, |
||
807 | { "entry", 1, NULL, 'e' }, |
||
808 | { "layoutver", 1, NULL, 'y' }, |
||
809 | { "info1", 1, NULL, '1' }, |
||
810 | { "altinfo", 1, NULL, 0 }, |
||
811 | { "info2", 1, NULL, '2' }, |
||
812 | { "root-first", 0, NULL, 0 }, |
||
813 | { "rsa-signature", 1, NULL, 'r' }, |
||
814 | { "second-image-flag", 1, NULL, 0 }, |
||
815 | { "inactive", 1, NULL, 0 }, |
||
816 | { "reserved2", 1, NULL, 0 }, |
||
817 | { "kernel-file-has-header", 0, NULL, 0 }, |
||
818 | { "pad", 1, NULL, 'p' }, |
||
819 | { "align-rootfs", 0, NULL, 0 }, |
||
820 | { 0, 0, 0, 0 } |
||
821 | }; |
||
822 | |||
823 | c = getopt_long (argc, argv, "hVi:f:o:b:c:s:n:v:a:m:k:l:e:y:1:2:r:p:", long_options, &option_index); |
||
824 | |||
825 | if (c == -1) break; /* Exit from `while (1)' loop. */ |
||
826 | |||
827 | switch (c) |
||
828 | { |
||
829 | case 'h': /* Print help and exit. */ |
||
830 | imagetag_cmdline_print_help (); |
||
831 | imagetag_cmdline_free (&local_args_info); |
||
832 | exit (EXIT_SUCCESS); |
||
833 | |||
834 | case 'V': /* Print version and exit. */ |
||
835 | imagetag_cmdline_print_version (); |
||
836 | imagetag_cmdline_free (&local_args_info); |
||
837 | exit (EXIT_SUCCESS); |
||
838 | |||
839 | case 'i': /* File with LZMA compressed kernel to include in the image.. */ |
||
840 | |||
841 | |||
842 | if (update_arg( (void *)&(args_info->kernel_arg), |
||
843 | &(args_info->kernel_orig), &(args_info->kernel_given), |
||
844 | &(local_args_info.kernel_given), optarg, 0, 0, ARG_STRING, |
||
845 | check_ambiguity, override, 0, 0, |
||
846 | "kernel", 'i', |
||
847 | additional_error)) |
||
848 | goto failure; |
||
849 | |||
850 | break; |
||
851 | case 'f': /* File with RootFS to include in the image.. */ |
||
852 | |||
853 | |||
854 | if (update_arg( (void *)&(args_info->rootfs_arg), |
||
855 | &(args_info->rootfs_orig), &(args_info->rootfs_given), |
||
856 | &(local_args_info.rootfs_given), optarg, 0, 0, ARG_STRING, |
||
857 | check_ambiguity, override, 0, 0, |
||
858 | "rootfs", 'f', |
||
859 | additional_error)) |
||
860 | goto failure; |
||
861 | |||
862 | break; |
||
863 | case 'o': /* Name of output file.. */ |
||
864 | |||
865 | |||
866 | if (update_arg( (void *)&(args_info->output_arg), |
||
867 | &(args_info->output_orig), &(args_info->output_given), |
||
868 | &(local_args_info.output_given), optarg, 0, 0, ARG_STRING, |
||
869 | check_ambiguity, override, 0, 0, |
||
870 | "output", 'o', |
||
871 | additional_error)) |
||
872 | goto failure; |
||
873 | |||
874 | break; |
||
875 | case 'b': /* Board ID to set in the image (must match what router expects, e.g. \"96345GW2\").. */ |
||
876 | |||
877 | |||
878 | if (update_arg( (void *)&(args_info->boardid_arg), |
||
879 | &(args_info->boardid_orig), &(args_info->boardid_given), |
||
880 | &(local_args_info.boardid_given), optarg, 0, 0, ARG_STRING, |
||
881 | check_ambiguity, override, 0, 0, |
||
882 | "boardid", 'b', |
||
883 | additional_error)) |
||
884 | goto failure; |
||
885 | |||
886 | break; |
||
887 | case 'c': /* Chip ID to set in the image (must match the actual hardware, e.g. \"6345\").. */ |
||
888 | |||
889 | |||
890 | if (update_arg( (void *)&(args_info->chipid_arg), |
||
891 | &(args_info->chipid_orig), &(args_info->chipid_given), |
||
892 | &(local_args_info.chipid_given), optarg, 0, 0, ARG_STRING, |
||
893 | check_ambiguity, override, 0, 0, |
||
894 | "chipid", 'c', |
||
895 | additional_error)) |
||
896 | goto failure; |
||
897 | |||
898 | break; |
||
899 | case 's': /* Flash start address.. */ |
||
900 | |||
901 | |||
902 | if (update_arg( (void *)&(args_info->flash_start_arg), |
||
903 | &(args_info->flash_start_orig), &(args_info->flash_start_given), |
||
904 | &(local_args_info.flash_start_given), optarg, 0, "0xBFC00000", ARG_STRING, |
||
905 | check_ambiguity, override, 0, 0, |
||
906 | "flash-start", 's', |
||
907 | additional_error)) |
||
908 | goto failure; |
||
909 | |||
910 | break; |
||
911 | case 'n': /* Offset from start address for the first byte after the CFE (in memory).. */ |
||
912 | |||
913 | |||
914 | if (update_arg( (void *)&(args_info->image_offset_arg), |
||
915 | &(args_info->image_offset_orig), &(args_info->image_offset_given), |
||
916 | &(local_args_info.image_offset_given), optarg, 0, "0x10000", ARG_STRING, |
||
917 | check_ambiguity, override, 0, 0, |
||
918 | "image-offset", 'n', |
||
919 | additional_error)) |
||
920 | goto failure; |
||
921 | |||
922 | break; |
||
923 | case 'v': /* Version number for imagetag format.. */ |
||
924 | |||
925 | |||
926 | if (update_arg( (void *)&(args_info->tag_version_arg), |
||
927 | &(args_info->tag_version_orig), &(args_info->tag_version_given), |
||
928 | &(local_args_info.tag_version_given), optarg, 0, "6", ARG_STRING, |
||
929 | check_ambiguity, override, 0, 0, |
||
930 | "tag-version", 'v', |
||
931 | additional_error)) |
||
932 | goto failure; |
||
933 | |||
934 | break; |
||
935 | case 'a': /* Magic string (signature), for boards that need it.. */ |
||
936 | |||
937 | |||
938 | if (update_arg( (void *)&(args_info->signature_arg), |
||
939 | &(args_info->signature_orig), &(args_info->signature_given), |
||
940 | &(local_args_info.signature_given), optarg, 0, "Broadcom Corporatio", ARG_STRING, |
||
941 | check_ambiguity, override, 0, 0, |
||
942 | "signature", 'a', |
||
943 | additional_error)) |
||
944 | goto failure; |
||
945 | |||
946 | break; |
||
947 | case 'm': /* Second magic string (signature2).. */ |
||
948 | |||
949 | |||
950 | if (update_arg( (void *)&(args_info->signature2_arg), |
||
951 | &(args_info->signature2_orig), &(args_info->signature2_given), |
||
952 | &(local_args_info.signature2_given), optarg, 0, "ver. 2.0", ARG_STRING, |
||
953 | check_ambiguity, override, 0, 0, |
||
954 | "signature2", 'm', |
||
955 | additional_error)) |
||
956 | goto failure; |
||
957 | |||
958 | break; |
||
959 | case 'k': /* Flash erase block size.. */ |
||
960 | |||
961 | |||
962 | if (update_arg( (void *)&(args_info->block_size_arg), |
||
963 | &(args_info->block_size_orig), &(args_info->block_size_given), |
||
964 | &(local_args_info.block_size_given), optarg, 0, "0x10000", ARG_STRING, |
||
965 | check_ambiguity, override, 0, 0, |
||
966 | "block-size", 'k', |
||
967 | additional_error)) |
||
968 | goto failure; |
||
969 | |||
970 | break; |
||
971 | case 'l': /* Kernel load address.. */ |
||
972 | |||
973 | |||
974 | if (update_arg( (void *)&(args_info->load_addr_arg), |
||
975 | &(args_info->load_addr_orig), &(args_info->load_addr_given), |
||
976 | &(local_args_info.load_addr_given), optarg, 0, 0, ARG_STRING, |
||
977 | check_ambiguity, override, 0, 0, |
||
978 | "load-addr", 'l', |
||
979 | additional_error)) |
||
980 | goto failure; |
||
981 | |||
982 | break; |
||
983 | case 'e': /* Address where the kernel entry point will be for booting.. */ |
||
984 | |||
985 | |||
986 | if (update_arg( (void *)&(args_info->entry_arg), |
||
987 | &(args_info->entry_orig), &(args_info->entry_given), |
||
988 | &(local_args_info.entry_given), optarg, 0, 0, ARG_STRING, |
||
989 | check_ambiguity, override, 0, 0, |
||
990 | "entry", 'e', |
||
991 | additional_error)) |
||
992 | goto failure; |
||
993 | |||
994 | break; |
||
995 | case 'y': /* Flash layout version (version 2.2x of the Broadcom code requires this).. */ |
||
996 | |||
997 | |||
998 | if (update_arg( (void *)&(args_info->layoutver_arg), |
||
999 | &(args_info->layoutver_orig), &(args_info->layoutver_given), |
||
1000 | &(local_args_info.layoutver_given), optarg, 0, 0, ARG_STRING, |
||
1001 | check_ambiguity, override, 0, 0, |
||
1002 | "layoutver", 'y', |
||
1003 | additional_error)) |
||
1004 | goto failure; |
||
1005 | |||
1006 | break; |
||
1007 | case '1': /* String for first vendor information section.. */ |
||
1008 | |||
1009 | |||
1010 | if (update_arg( (void *)&(args_info->info1_arg), |
||
1011 | &(args_info->info1_orig), &(args_info->info1_given), |
||
1012 | &(local_args_info.info1_given), optarg, 0, 0, ARG_STRING, |
||
1013 | check_ambiguity, override, 0, 0, |
||
1014 | "info1", '1', |
||
1015 | additional_error)) |
||
1016 | goto failure; |
||
1017 | |||
1018 | break; |
||
1019 | case '2': /* String for second vendor information section.. */ |
||
1020 | |||
1021 | |||
1022 | if (update_arg( (void *)&(args_info->info2_arg), |
||
1023 | &(args_info->info2_orig), &(args_info->info2_given), |
||
1024 | &(local_args_info.info2_given), optarg, 0, 0, ARG_STRING, |
||
1025 | check_ambiguity, override, 0, 0, |
||
1026 | "info2", '2', |
||
1027 | additional_error)) |
||
1028 | goto failure; |
||
1029 | |||
1030 | break; |
||
1031 | case 'r': /* String for RSA Signature section.. */ |
||
1032 | |||
1033 | |||
1034 | if (update_arg( (void *)&(args_info->rsa_signature_arg), |
||
1035 | &(args_info->rsa_signature_orig), &(args_info->rsa_signature_given), |
||
1036 | &(local_args_info.rsa_signature_given), optarg, 0, 0, ARG_STRING, |
||
1037 | check_ambiguity, override, 0, 0, |
||
1038 | "rsa-signature", 'r', |
||
1039 | additional_error)) |
||
1040 | goto failure; |
||
1041 | |||
1042 | break; |
||
1043 | case 'p': /* Pad the image to this size if smaller (in MiB). */ |
||
1044 | |||
1045 | |||
1046 | if (update_arg( (void *)&(args_info->pad_arg), |
||
1047 | &(args_info->pad_orig), &(args_info->pad_given), |
||
1048 | &(local_args_info.pad_given), optarg, 0, 0, ARG_INT, |
||
1049 | check_ambiguity, override, 0, 0, |
||
1050 | "pad", 'p', |
||
1051 | additional_error)) |
||
1052 | goto failure; |
||
1053 | |||
1054 | break; |
||
1055 | |||
1056 | case 0: /* Long option with no short option */ |
||
1057 | /* File with CFE to include in the image.. */ |
||
1058 | if (strcmp (long_options[option_index].name, "cfe") == 0) |
||
1059 | { |
||
1060 | |||
1061 | |||
1062 | if (update_arg( (void *)&(args_info->cfe_arg), |
||
1063 | &(args_info->cfe_orig), &(args_info->cfe_given), |
||
1064 | &(local_args_info.cfe_given), optarg, 0, 0, ARG_STRING, |
||
1065 | check_ambiguity, override, 0, 0, |
||
1066 | "cfe", '-', |
||
1067 | additional_error)) |
||
1068 | goto failure; |
||
1069 | |||
1070 | } |
||
1071 | /* String for vendor information section (alternate/pirelli).. */ |
||
1072 | else if (strcmp (long_options[option_index].name, "altinfo") == 0) |
||
1073 | { |
||
1074 | |||
1075 | |||
1076 | if (update_arg( (void *)&(args_info->altinfo_arg), |
||
1077 | &(args_info->altinfo_orig), &(args_info->altinfo_given), |
||
1078 | &(local_args_info.altinfo_given), optarg, 0, 0, ARG_STRING, |
||
1079 | check_ambiguity, override, 0, 0, |
||
1080 | "altinfo", '-', |
||
1081 | additional_error)) |
||
1082 | goto failure; |
||
1083 | |||
1084 | } |
||
1085 | /* Put the rootfs before the kernel (only for stock images, e.g. captured from the router's flash memory).. */ |
||
1086 | else if (strcmp (long_options[option_index].name, "root-first") == 0) |
||
1087 | { |
||
1088 | |||
1089 | |||
1090 | if (update_arg((void *)&(args_info->root_first_flag), 0, &(args_info->root_first_given), |
||
1091 | &(local_args_info.root_first_given), optarg, 0, 0, ARG_FLAG, |
||
1092 | check_ambiguity, override, 1, 0, "root-first", '-', |
||
1093 | additional_error)) |
||
1094 | goto failure; |
||
1095 | |||
1096 | } |
||
1097 | /* Dual Image Flag (2=not-specified).. */ |
||
1098 | else if (strcmp (long_options[option_index].name, "second-image-flag") == 0) |
||
1099 | { |
||
1100 | |||
1101 | |||
1102 | if (update_arg( (void *)&(args_info->second_image_flag_arg), |
||
1103 | &(args_info->second_image_flag_orig), &(args_info->second_image_flag_given), |
||
1104 | &(local_args_info.second_image_flag_given), optarg, imagetag_cmdline_second_image_flag_values, "2", ARG_STRING, |
||
1105 | check_ambiguity, override, 0, 0, |
||
1106 | "second-image-flag", '-', |
||
1107 | additional_error)) |
||
1108 | goto failure; |
||
1109 | |||
1110 | } |
||
1111 | /* Inactive Flag (2=not-specified).. */ |
||
1112 | else if (strcmp (long_options[option_index].name, "inactive") == 0) |
||
1113 | { |
||
1114 | |||
1115 | |||
1116 | if (update_arg( (void *)&(args_info->inactive_arg), |
||
1117 | &(args_info->inactive_orig), &(args_info->inactive_given), |
||
1118 | &(local_args_info.inactive_given), optarg, imagetag_cmdline_inactive_values, "2", ARG_STRING, |
||
1119 | check_ambiguity, override, 0, 0, |
||
1120 | "inactive", '-', |
||
1121 | additional_error)) |
||
1122 | goto failure; |
||
1123 | |||
1124 | } |
||
1125 | /* String for second reserved section.. */ |
||
1126 | else if (strcmp (long_options[option_index].name, "reserved2") == 0) |
||
1127 | { |
||
1128 | |||
1129 | |||
1130 | if (update_arg( (void *)&(args_info->reserved2_arg), |
||
1131 | &(args_info->reserved2_orig), &(args_info->reserved2_given), |
||
1132 | &(local_args_info.reserved2_given), optarg, 0, 0, ARG_STRING, |
||
1133 | check_ambiguity, override, 0, 0, |
||
1134 | "reserved2", '-', |
||
1135 | additional_error)) |
||
1136 | goto failure; |
||
1137 | |||
1138 | } |
||
1139 | /* Indicates that the kernel file includes the kernel header with correct load address and entry point, so no changes are needed. */ |
||
1140 | else if (strcmp (long_options[option_index].name, "kernel-file-has-header") == 0) |
||
1141 | { |
||
1142 | |||
1143 | |||
1144 | if (update_arg((void *)&(args_info->kernel_file_has_header_flag), 0, &(args_info->kernel_file_has_header_given), |
||
1145 | &(local_args_info.kernel_file_has_header_given), optarg, 0, 0, ARG_FLAG, |
||
1146 | check_ambiguity, override, 1, 0, "kernel-file-has-header", '-', |
||
1147 | additional_error)) |
||
1148 | goto failure; |
||
1149 | |||
1150 | } |
||
1151 | /* Align the rootfs start to erase block size. */ |
||
1152 | else if (strcmp (long_options[option_index].name, "align-rootfs") == 0) |
||
1153 | { |
||
1154 | |||
1155 | |||
1156 | if (update_arg((void *)&(args_info->align_rootfs_flag), 0, &(args_info->align_rootfs_given), |
||
1157 | &(local_args_info.align_rootfs_given), optarg, 0, 0, ARG_FLAG, |
||
1158 | check_ambiguity, override, 1, 0, "align-rootfs", '-', |
||
1159 | additional_error)) |
||
1160 | goto failure; |
||
1161 | |||
1162 | } |
||
1163 | |||
1164 | break; |
||
1165 | case '?': /* Invalid option. */ |
||
1166 | /* `getopt_long' already printed an error message. */ |
||
1167 | goto failure; |
||
1168 | |||
1169 | default: /* bug: option not considered. */ |
||
1170 | fprintf (stderr, "%s: option unknown: %c%s\n", IMAGETAG_CMDLINE_PACKAGE, c, (additional_error ? additional_error : "")); |
||
1171 | abort (); |
||
1172 | } /* switch */ |
||
1173 | } /* while */ |
||
1174 | |||
1175 | |||
1176 | |||
1177 | if (check_required) |
||
1178 | { |
||
1179 | error += imagetag_cmdline_required2 (args_info, argv[0], additional_error); |
||
1180 | } |
||
1181 | |||
1182 | imagetag_cmdline_release (&local_args_info); |
||
1183 | |||
1184 | if ( error ) |
||
1185 | return (EXIT_FAILURE); |
||
1186 | |||
1187 | return 0; |
||
1188 | |||
1189 | failure: |
||
1190 | |||
1191 | imagetag_cmdline_release (&local_args_info); |
||
1192 | return (EXIT_FAILURE); |
||
1193 | } |