From 08c5754785ed390d3bbbe458edba7c55a391700e Mon Sep 17 00:00:00 2001 From: wbx Date: Thu, 14 Jul 2005 01:25:08 +0000 Subject: check if firmware is in trx format, before writing it to the flash git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@1431 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/openwrt/mtd.c | 65 +++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 28 deletions(-) (limited to 'package/openwrt/mtd.c') diff --git a/package/openwrt/mtd.c b/package/openwrt/mtd.c index f0c127b72..a73e0afd1 100644 --- a/package/openwrt/mtd.c +++ b/package/openwrt/mtd.c @@ -42,25 +42,18 @@ #include -/* trx header */ #define TRX_MAGIC 0x30524448 /* "HDR0" */ -#define TRX_VERSION 1 -#define TRX_MAX_LEN 0x3A0000 -#define TRX_NO_HEADER 1 /* Do not write TRX header */ - +#define BUFSIZE (10 * 1024) #define MAX_ARGS 8 struct trx_header { - uint32_t magic; /* "HDR0" */ - uint32_t len; /* Length of file including header */ - uint32_t crc32; /* 32-bit CRC from flag_version to end of file */ - uint32_t flag_version; /* 0:15 flags, 16:31 version */ + uint32_t magic; /* "HDR0" */ + uint32_t len; /* Length of file including header */ + uint32_t crc32; /* 32-bit CRC from flag_version to end of file */ + uint32_t flag_version; /* 0:15 flags, 16:31 version */ uint32_t offsets[3]; /* Offsets of partitions from start of header */ }; -#define BUFSIZE (10 * 1024) - - int mtd_unlock(const char *mtd) { @@ -84,7 +77,6 @@ mtd_unlock(const char *mtd) mtdLockInfo.start = 0; mtdLockInfo.length = mtdInfo.size; if(ioctl(fd, MEMUNLOCK, &mtdLockInfo)) { - fprintf(stderr, "Could not unlock MTD device: %s\n", mtd); close(fd); return 0; } @@ -156,38 +148,55 @@ mtd_erase(const char *mtd) int mtd_write(const char *trxfile, const char *mtd) { - int fd; - int trxfd; - int i; - size_t result,size,written; + int fd,trxfd,i; + struct trx_header trx; + size_t count,result,size,written; struct mtd_info_user mtdInfo; struct erase_info_user mtdEraseInfo; struct stat trxstat; unsigned char src[BUFSIZE],dest[BUFSIZE]; - fd = mtd_open(mtd, O_RDWR); - if(fd < 0) { - fprintf(stderr, "Could not open mtd device: %s\n", mtd); + trxfd = open(trxfile,O_RDONLY); + if(trxfd < 0) { + fprintf(stderr, "Could not open trx image: %s\n", trxfile); exit(1); } - if(ioctl(fd, MEMGETINFO, &mtdInfo)) { - fprintf(stderr, "Could not get MTD device info from %s\n", mtd); - close(fd); + if (fstat(trxfd,&trxstat) < 0) { + fprintf(stderr, "Could not get trx image file status: %s\n", trxfile); + close(trxfd); exit(1); } - trxfd = open(trxfile,O_RDONLY); - if(trxfd < 0) { - fprintf(stderr, "Could not open trx image: %s\n", trxfile); + count = read(trxfd, &trx, sizeof(struct trx_header)); + if (count < sizeof(struct trx_header)) { + fprintf(stderr, "Could not trx header, file too small (%ld bytes)\n", count); + close(trxfd); exit(1); } - if (fstat (trxfd,&trxstat) < 0) { - fprintf(stderr, "Could not get trx image file status: %s\n", trxfile); + if (trx.magic != TRX_MAGIC || trx.len < sizeof(struct trx_header)) { + fprintf(stderr, "Bad trx header\n"); + fprintf(stderr, "If this is a firmware in bin format, like some of the\n" + "original firmware files are, use following command to convert to trx:\n" + "dd if=firmware.bin of=firmware.trx bs=32 skip=1\n"); close(trxfd); exit(1); } + + lseek(trxfd, 0, SEEK_SET); + + fd = mtd_open(mtd, O_RDWR); + if(fd < 0) { + fprintf(stderr, "Could not open mtd device: %s\n", mtd); + exit(1); + } + + if(ioctl(fd, MEMGETINFO, &mtdInfo)) { + fprintf(stderr, "Could not get MTD device info from %s\n", mtd); + close(fd); + exit(1); + } if(mtdInfo.size < trxstat.st_size) { fprintf(stderr, "Image too big for partition: %s\n", mtd); -- cgit v1.2.3