From 34c8fb057dd04a62131410d607d5d605f27115f1 Mon Sep 17 00:00:00 2001 From: pancake Date: Sat, 23 Jun 2012 10:43:20 +0200 Subject: * Apply Pali Rohár patch - Add support for device and hw revisions specified in hw pieces - Updated documentation - Fixed problems when unpacking - Ready for mmc and cold flashing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fiasco.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 79 insertions(+), 14 deletions(-) (limited to 'src/fiasco.c') diff --git a/src/fiasco.c b/src/fiasco.c index bb9a69a..7fccc4b 100644 --- a/src/fiasco.c +++ b/src/fiasco.c @@ -1,6 +1,7 @@ /* * 0xFFFF - Open Free Fiasco Firmware Flasher * Copyright (C) 2007-2011 pancake + * Copyright (C) 2011-2012 Pali Rohár * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,6 +40,7 @@ int openfiasco(const char *name, const char *piece_grep, int v) off_t off, here; int i; + memset(&header, 0, sizeof(header)); header.fd = open(name, O_RDONLY); if (header.fd == -1) { @@ -77,9 +79,11 @@ int openfiasco(const char *name, const char *piece_grep, int v) i = 0; while(1) { - if (read(header.fd, buf, 7)<7) + if (read(header.fd, buf, 7)<7) { + printf("Next valid header not found\n"); return close(header.fd); - if (buf[0] == 0x54 /*&& buf[1] == 0x04*/ && buf[2] == 0x2E && buf[3] == 0x19 && buf[4] == 0x01 && buf[5] == 0x01 && buf[6] == 0x00) + } + if (buf[0] == 0x54 && buf[2] == 0x2E && buf[3] == 0x19 && buf[4] == 0x01 && buf[5] == 0x01 && buf[6] == 0x00) break; lseek(header.fd, -6, SEEK_CUR); ++i; @@ -99,7 +103,7 @@ int openfiasco(const char *name, const char *piece_grep, int v) printf(" [eof]\n"); break; } else if (v) printf(" %s\n", data); - strcpy(header.name, (char *)data); + strcpy(header.type, (char *)data); if (v) { printf(" header: "); @@ -108,7 +112,7 @@ int openfiasco(const char *name, const char *piece_grep, int v) } if (read(header.fd, buf, 9)<9) - break; + return close(header.fd); memcpy(&header.size, buf,4); header.size = ntohl(header.size); if (v) { @@ -120,23 +124,61 @@ int openfiasco(const char *name, const char *piece_grep, int v) // buf[4], buf[5], buf[6], buf[7], buf[8]); /* XXX this is not ok */ //printf("BUF8: %02x\n", buf[8]); - while (buf[8] && buf[8]>'0' && buf[8] < '9') { + memset(header.device, 0, sizeof(header.device)); + memset(header.hwrev, 0, sizeof(header.hwrev)); + memset(header.version, 0, sizeof(header.version)); + if (header.layout) { + free(header.layout); + header.layout = NULL; + } + while ((buf[8] >= '1' && buf[8] <= '4') || buf[8] == '/') { if (read(header.fd, data, 1)<1) - break; + return close(header.fd); i = data[0]; if (read(header.fd, data, i) %s\n", header.name); if (fiasco_callback != NULL) { fiasco_callback(&header); + if (header.layout) { + free(header.layout); + header.layout = NULL; + } free(header.data); continue; } else { @@ -171,6 +232,10 @@ int openfiasco(const char *name, const char *piece_grep, int v) // XXX dup lseek(header.fd, off, SEEK_SET); lseek(header.fd, header.size, SEEK_CUR); + if (header.layout) { + free(header.layout); + header.layout = NULL; + } } return close(header.fd); } -- cgit v1.2.3