summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/imxtools/sb.c46
-rw-r--r--utils/imxtools/sb.h5
2 files changed, 39 insertions, 12 deletions
diff --git a/utils/imxtools/sb.c b/utils/imxtools/sb.c
index 8e4b98b1a9..db6763c400 100644
--- a/utils/imxtools/sb.c
+++ b/utils/imxtools/sb.c
@@ -630,32 +630,55 @@ static uint32_t guess_alignment(uint32_t off)
630struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, 630struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u,
631 sb_color_printf cprintf, enum sb_error_t *err) 631 sb_color_printf cprintf, enum sb_error_t *err)
632{ 632{
633 uint8_t *buf = NULL; 633 return sb_read_file_ex(filename, 0, -1, raw_mode, u, cprintf, err);
634 struct sb_file_t *sb_file = NULL; 634}
635 635
636 #define printf(c, ...) cprintf(u, false, c, __VA_ARGS__) 636struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u,
637 sb_color_printf cprintf, enum sb_error_t *err)
638{
637 #define fatal(e, ...) \ 639 #define fatal(e, ...) \
638 do { if(err) *err = e; \ 640 do { if(err) *err = e; \
639 cprintf(u, true, GREY, __VA_ARGS__); \ 641 cprintf(u, true, GREY, __VA_ARGS__); \
640 free(buf); \ 642 free(buf); \
641 sb_free(sb_file); \
642 return NULL; } while(0) 643 return NULL; } while(0)
643 #define print_hex(c, p, len, nl) \
644 do { printf(c, ""); print_hex(p, len, nl); } while(0)
645 644
646 FILE *f = fopen(filename, "rb"); 645 FILE *f = fopen(filename, "rb");
646 void *buf = NULL;
647 if(f == NULL) 647 if(f == NULL)
648 fatal(SB_OPEN_ERROR, "Cannot open file for reading\n"); 648 fatal(SB_OPEN_ERROR, "Cannot open file for reading\n");
649 fseek(f, 0, SEEK_END); 649 fseek(f, 0, SEEK_END);
650 long filesize = ftell(f); 650 size_t read_size = ftell(f);
651 fseek(f, 0, SEEK_SET); 651 fseek(f, offset, SEEK_SET);
652 buf = xmalloc(filesize); 652 if(size != (size_t)-1)
653 if(fread(buf, filesize, 1, f) != 1) 653 read_size = size;
654 buf = xmalloc(read_size);
655 if(fread(buf, read_size, 1, f) != 1)
654 { 656 {
655 fclose(f); 657 fclose(f);
656 fatal(SB_READ_ERROR, "Cannot read file\n"); 658 fatal(SB_READ_ERROR, "Cannot read file\n");
657 } 659 }
658 fclose(f); 660 fclose(f);
661
662 struct sb_file_t *ret = sb_read_memory(buf, read_size, raw_mode, u, cprintf, err);
663 free(buf);
664 return ret;
665
666 #undef fatal
667}
668
669struct sb_file_t *sb_read_memory(void *buf, size_t filesize, bool raw_mode, void *u,
670 sb_color_printf cprintf, enum sb_error_t *err)
671{
672 struct sb_file_t *sb_file = NULL;
673
674 #define printf(c, ...) cprintf(u, false, c, __VA_ARGS__)
675 #define fatal(e, ...) \
676 do { if(err) *err = e; \
677 cprintf(u, true, GREY, __VA_ARGS__); \
678 sb_free(sb_file); \
679 return NULL; } while(0)
680 #define print_hex(c, p, len, nl) \
681 do { printf(c, ""); print_hex(p, len, nl); } while(0)
659 682
660 struct sha_1_params_t sha_1_params; 683 struct sha_1_params_t sha_1_params;
661 sb_file = xmalloc(sizeof(struct sb_file_t)); 684 sb_file = xmalloc(sizeof(struct sb_file_t));
@@ -1048,7 +1071,6 @@ struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u,
1048 printf(RED, " Failed\n"); 1071 printf(RED, " Failed\n");
1049 fatal(SB_CHECKSUM_ERROR, "File SHA-1 error\n"); 1072 fatal(SB_CHECKSUM_ERROR, "File SHA-1 error\n");
1050 } 1073 }
1051 free(buf);
1052 1074
1053 return sb_file; 1075 return sb_file;
1054 #undef printf 1076 #undef printf
diff --git a/utils/imxtools/sb.h b/utils/imxtools/sb.h
index e0f25b68a4..74d86f303a 100644
--- a/utils/imxtools/sb.h
+++ b/utils/imxtools/sb.h
@@ -228,6 +228,11 @@ enum sb_error_t sb_write_file(struct sb_file_t *sb, const char *filename);
228typedef void (*sb_color_printf)(void *u, bool err, color_t c, const char *f, ...); 228typedef void (*sb_color_printf)(void *u, bool err, color_t c, const char *f, ...);
229struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, 229struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u,
230 sb_color_printf printf, enum sb_error_t *err); 230 sb_color_printf printf, enum sb_error_t *err);
231/* use size_t(-1) to use maximum size */
232struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u,
233 sb_color_printf printf, enum sb_error_t *err);
234struct sb_file_t *sb_read_memory(void *buffer, size_t size, bool raw_mode, void *u,
235 sb_color_printf printf, enum sb_error_t *err);
231 236
232void sb_fill_section_name(char name[5], uint32_t identifier); 237void sb_fill_section_name(char name[5], uint32_t identifier);
233void sb_dump(struct sb_file_t *file, void *u, sb_color_printf printf); 238void sb_dump(struct sb_file_t *file, void *u, sb_color_printf printf);