projects
/
openwrt
/
openwrt.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
firmware-utils: add otrx tool for handling TRX images
[openwrt/openwrt.git]
/
tools
/
firmware-utils
/
src
/
trx.c
diff --git
a/tools/firmware-utils/src/trx.c
b/tools/firmware-utils/src/trx.c
index 8e95d98d7ae64c6dd14598f34e46a8a9295b058e..dc5bb672aeba3ff0b108da9f1db7cbed8f2dac6b 100644
(file)
--- a/
tools/firmware-utils/src/trx.c
+++ b/
tools/firmware-utils/src/trx.c
@@
-68,7
+68,7
@@
uint32_t crc32buf(char *buf, size_t len);
#define TRX_MAGIC 0x30524448 /* "HDR0" */
#define TRX_MAX_LEN 0x720000
#define TRX_MAGIC 0x30524448 /* "HDR0" */
#define TRX_MAX_LEN 0x720000
-#define TRX_NO_HEADER 1 /* Do not write TRX header */
+#define TRX_NO_HEADER 1 /* Do not write TRX header */
struct trx_header {
uint32_t magic; /* "HDR0" */
struct trx_header {
uint32_t magic; /* "HDR0" */
@@
-100,7
+100,7
@@
int main(int argc, char **argv)
int c, i, append = 0;
size_t n;
ssize_t n2;
int c, i, append = 0;
size_t n;
ssize_t n2;
- uint32_t cur_len, fsmark=0;
+ uint32_t cur_len, fsmark=0
, magic
;
unsigned long maxlen = TRX_MAX_LEN;
struct trx_header *p;
char trx_version = 1;
unsigned long maxlen = TRX_MAX_LEN;
struct trx_header *p;
char trx_version = 1;
@@
-121,7
+121,7
@@
int main(int argc, char **argv)
in = NULL;
i = 0;
in = NULL;
i = 0;
- while ((c = getopt(argc, argv, "-:2o:m:a:x:b:f:A:F:")) != -1) {
+ while ((c = getopt(argc, argv, "-:2o:m:a:x:b:f:A:F:
M:
")) != -1) {
switch (c) {
case '2':
/* take care that nothing was written to buf so far */
switch (c) {
case '2':
/* take care that nothing was written to buf so far */
@@
-242,6
+242,15
@@
int main(int argc, char **argv)
cur_len += n2;
}
cur_len += n2;
}
+ break;
+ case 'M':
+ errno = 0;
+ magic = strtoul(optarg, &e, 0);
+ if (errno || (e == optarg) || *e) {
+ fprintf(stderr, "illegal numeric string\n");
+ usage();
+ }
+ p->magic = STORE32_LE(magic);
break;
default:
usage();
break;
default:
usage();
@@
-262,7
+271,7
@@
int main(int argc, char **argv)
cur_len += ROUND - n;
}
cur_len += ROUND - n;
}
- /* for TRXv2 set bin-header Flags to 0xFF for CRC calculation like CFE does */
+ /* for TRXv2 set bin-header Flags to 0xFF for CRC calculation like CFE does */
if (trx_version == 2) {
if(cur_len - LOAD32_LE(p->offsets[3]) < sizeof(binheader)) {
fprintf(stderr, "TRXv2 binheader too small!\n");
if (trx_version == 2) {
if(cur_len - LOAD32_LE(p->offsets[3]) < sizeof(binheader)) {
fprintf(stderr, "TRXv2 binheader too small!\n");
@@
-273,11
+282,10
@@
int main(int argc, char **argv)
}
p->crc32 = crc32buf((char *) &p->flag_version,
}
p->crc32 = crc32buf((char *) &p->flag_version,
- (
fsmark)?fsmark:cur_len
- offsetof(struct trx_header, flag_version));
+ (
(fsmark)?fsmark:cur_len)
- offsetof(struct trx_header, flag_version));
p->crc32 = STORE32_LE(p->crc32);
p->len = STORE32_LE((fsmark) ? fsmark : cur_len);
p->crc32 = STORE32_LE(p->crc32);
p->len = STORE32_LE((fsmark) ? fsmark : cur_len);
- p->len = STORE32_LE(p->len);
/* restore TRXv2 bin-header */
if (trx_version == 2) {
/* restore TRXv2 bin-header */
if (trx_version == 2) {
@@
-290,7
+298,7
@@
int main(int argc, char **argv)
}
fclose(out);
}
fclose(out);
-
+
return EXIT_SUCCESS;
}
return EXIT_SUCCESS;
}