OpenWrt – Diff between revs 2 and 3
?pathlinks?
Rev 2 | Rev 3 | |||
---|---|---|---|---|
Line 41... | Line 41... | |||
41 | }; |
41 | }; |
|
Line 42... | Line 42... | |||
42 | |
42 | |
|
43 | static FILE *signature_file, *metadata_file, *firmware_file; |
43 | static FILE *signature_file, *metadata_file, *firmware_file; |
|
44 | static int file_mode = MODE_DEFAULT; |
44 | static int file_mode = MODE_DEFAULT; |
|
45 | static bool truncate_file; |
- | ||
46 | static bool write_truncated; |
45 | static bool truncate_file; |
|
Line 47... | Line 46... | |||
47 | static bool quiet = false; |
46 | static bool quiet = false; |
|
Line 48... | Line 47... | |||
48 | |
47 | |
|
Line 63... | Line 62... | |||
63 | " -S <file>: Append signature file to firmware image\n" |
62 | " -S <file>: Append signature file to firmware image\n" |
|
64 | " -I <file>: Append metadata file to firmware image\n" |
63 | " -I <file>: Append metadata file to firmware image\n" |
|
65 | " -s <file>: Extract signature file from firmware image\n" |
64 | " -s <file>: Extract signature file from firmware image\n" |
|
66 | " -i <file>: Extract metadata file from firmware image\n" |
65 | " -i <file>: Extract metadata file from firmware image\n" |
|
67 | " -t: Remove extracted chunks from firmare image (using -s, -i)\n" |
66 | " -t: Remove extracted chunks from firmare image (using -s, -i)\n" |
|
68 | " -T: Output firmware image without extracted chunks to stdout (using -s, -i)\n" |
- | ||
69 | " -q: Quiet (suppress error messages)\n" |
67 | " -q: Quiet (suppress error messages)\n" |
|
70 | "\n", progname); |
68 | "\n", progname); |
|
71 | return 1; |
69 | return 1; |
|
72 | } |
70 | } |
|
Line 280... | Line 278... | |||
280 | { |
278 | { |
|
281 | struct fwimage_header *hdr; |
279 | struct fwimage_header *hdr; |
|
282 | struct fwimage_trailer tr; |
280 | struct fwimage_trailer tr; |
|
283 | struct data_buf dbuf = {}; |
281 | struct data_buf dbuf = {}; |
|
284 | uint32_t crc32 = ~0; |
282 | uint32_t crc32 = ~0; |
|
285 | int data_len = 0; |
- | ||
286 | int ret = 1; |
283 | int ret = 1; |
|
287 | void *buf; |
284 | void *buf; |
|
288 | bool metadata_keep = false; |
- | ||
Line 289... | Line 285... | |||
289 | |
285 | |
|
290 | firmware_file = open_file(name, false); |
286 | firmware_file = open_file(name, false); |
|
291 | if (!firmware_file) { |
287 | if (!firmware_file) { |
|
292 | msg("Failed to open firmware file\n"); |
288 | msg("Failed to open firmware file\n"); |
|
Line 303... | Line 299... | |||
303 | return 1; |
299 | return 1; |
|
Line 304... | Line 300... | |||
304 | |
300 | |
|
305 | do { |
301 | do { |
|
Line 306... | Line -... | |||
306 | char *tmp = dbuf.cur; |
- | ||
307 | |
- | ||
308 | if (write_truncated && dbuf.prev) |
- | ||
309 | fwrite(dbuf.prev, 1, BUFLEN, stdout); |
302 | char *tmp = dbuf.cur; |
|
310 | |
303 | |
|
Line 311... | Line 304... | |||
311 | dbuf.cur = dbuf.prev; |
304 | dbuf.cur = dbuf.prev; |
|
312 | dbuf.prev = tmp; |
305 | dbuf.prev = tmp; |
|
Line 322... | Line 315... | |||
322 | dbuf.cur_len = fread(dbuf.cur, 1, BUFLEN, firmware_file); |
315 | dbuf.cur_len = fread(dbuf.cur, 1, BUFLEN, firmware_file); |
|
323 | dbuf.file_len += dbuf.cur_len; |
316 | dbuf.file_len += dbuf.cur_len; |
|
324 | } while (dbuf.cur_len == BUFLEN); |
317 | } while (dbuf.cur_len == BUFLEN); |
|
Line 325... | Line 318... | |||
325 | |
318 | |
|
- | 319 | while (1) { |
||
Line 326... | Line 320... | |||
326 | while (1) { |
320 | int data_len; |
|
327 | |
321 | |
|
Line 328... | Line 322... | |||
328 | if (extract_tail(&dbuf, &tr, sizeof(tr))) |
322 | if (extract_tail(&dbuf, &tr, sizeof(tr))) |
|
Line 351... | Line 345... | |||
351 | continue; |
345 | continue; |
|
352 | fwrite(buf, data_len, 1, signature_file); |
346 | fwrite(buf, data_len, 1, signature_file); |
|
353 | ret = 0; |
347 | ret = 0; |
|
354 | break; |
348 | break; |
|
355 | } else if (tr.type == FWIMAGE_INFO) { |
349 | } else if (tr.type == FWIMAGE_INFO) { |
|
356 | if (!metadata_file) { |
350 | if (!metadata_file) |
|
357 | dbuf.file_len += data_len + sizeof(tr); |
- | ||
358 | metadata_keep = true; |
- | ||
359 | break; |
351 | break; |
|
360 | } |
- | ||
Line 361... | Line 352... | |||
361 | |
352 | |
|
362 | hdr = buf; |
353 | hdr = buf; |
|
363 | data_len -= sizeof(*hdr); |
354 | data_len -= sizeof(*hdr); |
|
364 | if (validate_metadata(hdr, data_len)) |
355 | if (validate_metadata(hdr, data_len)) |
|
Line 373... | Line 364... | |||
373 | } |
364 | } |
|
Line 374... | Line 365... | |||
374 | |
365 | |
|
375 | if (!ret && truncate_file) |
366 | if (!ret && truncate_file) |
|
Line 376... | Line -... | |||
376 | ftruncate(fileno(firmware_file), dbuf.file_len); |
- | ||
377 | |
- | ||
378 | if (write_truncated) { |
- | ||
379 | if (dbuf.prev) |
- | ||
380 | fwrite(dbuf.prev, 1, BUFLEN, stdout); |
- | ||
381 | if (dbuf.cur) |
- | ||
382 | fwrite(dbuf.cur, 1, dbuf.cur_len, stdout); |
- | ||
383 | if (metadata_keep) { |
- | ||
384 | fwrite(buf, data_len, 1, stdout); |
- | ||
385 | fwrite(&tr, sizeof(tr), 1, stdout); |
- | ||
386 | } |
- | ||
387 | } |
367 | ftruncate(fileno(firmware_file), dbuf.file_len); |
|
388 | |
368 | |
|
389 | out: |
369 | out: |
|
390 | free(buf); |
370 | free(buf); |
|
391 | free(dbuf.cur); |
371 | free(dbuf.cur); |
|
Line 408... | Line 388... | |||
408 | const char *progname = argv[0]; |
388 | const char *progname = argv[0]; |
|
409 | int ret, ch; |
389 | int ret, ch; |
|
Line 410... | Line 390... | |||
410 | |
390 | |
|
Line 411... | Line 391... | |||
411 | crc32_filltable(crc_table); |
391 | crc32_filltable(crc_table); |
|
412 | |
392 | |
|
413 | while ((ch = getopt(argc, argv, "i:I:qs:S:tT")) != -1) { |
393 | while ((ch = getopt(argc, argv, "i:I:qs:S:t")) != -1) { |
|
414 | ret = 0; |
394 | ret = 0; |
|
415 | switch(ch) { |
395 | switch(ch) { |
|
416 | case 'S': |
396 | case 'S': |
|
Line 426... | Line 406... | |||
426 | ret = set_file(&metadata_file, optarg, MODE_EXTRACT); |
406 | ret = set_file(&metadata_file, optarg, MODE_EXTRACT); |
|
427 | break; |
407 | break; |
|
428 | case 't': |
408 | case 't': |
|
429 | truncate_file = true; |
409 | truncate_file = true; |
|
430 | break; |
410 | break; |
|
431 | case 'T': |
- | ||
432 | write_truncated = true; |
- | ||
433 | break; |
- | ||
434 | case 'q': |
411 | case 'q': |
|
435 | quiet = true; |
412 | quiet = true; |
|
436 | break; |
413 | break; |
|
437 | } |
414 | } |