From eac07b18d9bca9af60bf81dda0df27dea475cc72 Mon Sep 17 00:00:00 2001 From: Pali Rohár Date: Sat, 23 Jun 2012 18:49:07 +0200 Subject: Added option to use only image pieces for specific device / hw revision --- src/fiasco.c | 46 +++++++++++++++++++++++++++++++++++++++------- src/main.c | 23 ++++++++++++++++------- src/main.h | 2 +- 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/fiasco.c b/src/fiasco.c index 3446364..d3b323d 100644 --- a/src/fiasco.c +++ b/src/fiasco.c @@ -32,7 +32,7 @@ char *strdup(const char *s); int (*fiasco_callback)(struct header_t *header) = NULL; -int openfiasco(const char *name, const char *piece_grep, int v) +int openfiasco(const char *name, const char *type, const char *device, const char *hwrev, const char *version, int v) { struct header_t header; unsigned char buf[256]; @@ -42,6 +42,7 @@ int openfiasco(const char *name, const char *piece_grep, int v) unsigned int blockcount; off_t off, here; int subsections; + int match; int i; memset(&header, 0, sizeof(header)); @@ -251,7 +252,7 @@ int openfiasco(const char *name, const char *piece_grep, int v) strcat(header.name, "-"); strcat(header.name, header.version); } - /* callback */ + off = lseek(header.fd, 0, SEEK_CUR); if (v) { printf(" version: %s\n", header.version); @@ -260,11 +261,40 @@ int openfiasco(const char *name, const char *piece_grep, int v) printf(" name: %s\n", header.name); printf(" body-at: 0x%08x\n", (unsigned int)off); } - if (piece_grep==NULL || (strstr(header.name, piece_grep))) { - if (piece_grep) - printf("==> (%s) %s\n", piece_grep, header.name); - else - printf("==> %s\n", header.name); + + match = 1; + + if (match && type && strcmp(header.type, type) != 0) + match = 0; + + if (match && device && strcmp(header.device, device) != 0) + match = 0; + + if (match && version && strcmp(header.version, version) != 0) + match = 0; + + if (match && hwrev) { + char *tmp1 = malloc(strlen(header.hwrevs)+3); + char *tmp2 = malloc(strlen(hwrev)+3); + + if (!tmp1 || !tmp2) { + printf("malloc error\n"); + return close(header.fd); + } + + sprintf(tmp1, ",%s,", header.hwrevs); + sprintf(tmp2, ",%s,", hwrev); + + if (!strstr(tmp1, tmp2)) + match = 0; + + free(tmp1); + free(tmp2); + } + + /* callback */ + if (match) { + printf("==> %s\n", header.name); if (fiasco_callback != NULL) { fiasco_callback(&header); if (header.layout) { @@ -277,6 +307,8 @@ int openfiasco(const char *name, const char *piece_grep, int v) } else { // ??huh } + } else { + printf("ignored %s\n", header.name); } // XXX dup lseek(header.fd, off, SEEK_SET); diff --git a/src/main.c b/src/main.c index 67f78a7..0ac86ef 100644 --- a/src/main.c +++ b/src/main.c @@ -224,6 +224,15 @@ int unpack_callback(struct header_t *header) if (nomode) return 1; + printf("Unpacking file: %s\n", header->name); + printf(" type: %s\n", header->type); + if (header->device[0]) printf(" device: %s\n", header->device); + if (header->hwrevs[0]) printf(" hw revisions: %s\n", header->hwrevs); + if (header->version[0]) printf(" version: %s\n", header->version); + if (header->layout) printf(" layout file: %s\n", header->layout); + printf(" size: %d\n", header->size); + printf(" hash: %04x\n", header->hash); + fd = fopen(header->name, "wb"); if (fd == NULL) { printf("Cannot open file.\n"); @@ -260,7 +269,7 @@ void unpack_fiasco_image(char *file) { printf("Dumping firmware pieces to disk.\n"); fiasco_callback = &unpack_callback; - openfiasco(file, NULL ,1); + openfiasco(file, NULL, NULL, NULL, NULL, 0); } int fiasco_flash(const char *file) @@ -292,11 +301,11 @@ int fiasco_flash(const char *file) printf("\n"); fiasco_callback = &flash_callback; - openfiasco(file, "xloader", 0); - openfiasco(file, "secondary", 0); - openfiasco(file, "kernel", 0); - openfiasco(file, "initfs", 0); - openfiasco(file, "rootfs", 0); + openfiasco(file, "xloader", NULL, NULL, NULL, 0); + openfiasco(file, "secondary", NULL, NULL, NULL, 0); + openfiasco(file, "kernel", NULL, NULL, NULL, 0); + openfiasco(file, "initfs", NULL, NULL, NULL, 0); + openfiasco(file, "rootfs", NULL, NULL, NULL, 0); return 0; } @@ -470,7 +479,7 @@ int main(int argc, char **argv) type = fpid_file(optarg); printf("%s: %s\n", type, optarg); if (type && strcmp(type, "fiasco") == 0) - openfiasco(optarg, NULL, 1); + openfiasco(optarg, NULL, NULL, NULL, NULL, 1); identify = 1; break; case 'C': diff --git a/src/main.h b/src/main.h index 8a48da3..ba31720 100644 --- a/src/main.h +++ b/src/main.h @@ -119,7 +119,7 @@ extern char *modes[]; extern char *root_devices[]; // fiasco -int openfiasco(const char *name, const char *grep, int v); +int openfiasco(const char *name, const char *type, const char *device, const char *hwrev, const char *version, int v); int fiasco_new(const char *filename, const char *name); void fiasco_data_read(struct header_t *header); int fiasco_add_eof(int fd); -- cgit v1.2.3