summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Miłecki2016-05-09 18:10:30 +0000
committerRafał Miłecki2016-05-09 18:10:30 +0000
commit514da480173e185bacf61a2305284760dc279eb4 (patch)
treeb7bf39a82eac090130c1e0e2d7ea43dc2ee99eb8
parent32026f75fb429e98103891fedd99c6db773dc208 (diff)
downloadopenwrt-514da480173e185bacf61a2305284760dc279eb4.tar.gz
mtd: trx: use separated buffer for TRX header
We plan to adjust usage of the main buffer to allow reading custom amount of data for CRC32. This means we need another buffer that will be always block aligned. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> SVN-Revision: 49316
-rw-r--r--package/system/mtd/src/trx.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/package/system/mtd/src/trx.c b/package/system/mtd/src/trx.c
index 00c4d6c0b5..f310f51087 100644
--- a/package/system/mtd/src/trx.c
+++ b/package/system/mtd/src/trx.c
@@ -152,6 +152,7 @@ mtd_fixtrx(const char *mtd, size_t offset)
{
int fd;
struct trx_header *trx;
+ char *first_block;
char *buf;
ssize_t res;
size_t block_offset;
@@ -173,19 +174,19 @@ mtd_fixtrx(const char *mtd, size_t offset)
exit(1);
}
- buf = malloc(erasesize);
- if (!buf) {
+ first_block = malloc(erasesize);
+ if (!first_block) {
perror("malloc");
exit(1);
}
- res = pread(fd, buf, erasesize, block_offset);
+ res = pread(fd, first_block, erasesize, block_offset);
if (res != erasesize) {
perror("pread");
exit(1);
}
- trx = (struct trx_header *) (buf + offset);
+ trx = (struct trx_header *)(first_block + offset);
if (trx->magic != STORE32_LE(0x30524448)) {
fprintf(stderr, "No trx magic found\n");
exit(1);
@@ -198,6 +199,18 @@ mtd_fixtrx(const char *mtd, size_t offset)
return 0;
}
+ buf = malloc(erasesize);
+ if (!buf) {
+ perror("malloc");
+ exit(1);
+ }
+
+ res = pread(fd, buf, erasesize, block_offset);
+ if (res != erasesize) {
+ perror("pread");
+ exit(1);
+ }
+
trx->len = STORE32_LE(erasesize - offset);
trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4));
@@ -209,7 +222,7 @@ mtd_fixtrx(const char *mtd, size_t offset)
if (quiet < 2)
fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32);
- if (pwrite(fd, buf, erasesize, block_offset) != erasesize) {
+ if (pwrite(fd, first_block, erasesize, block_offset) != erasesize) {
fprintf(stderr, "Error writing block (%s)\n", strerror(errno));
exit(1);
}