|
|
@ -14,6 +14,7 @@ |
|
|
|
#include <stdint.h> |
|
|
|
#include <stdint.h> |
|
|
|
#include <stdio.h> |
|
|
|
#include <stdio.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
#include <string.h> |
|
|
|
#include <unistd.h> |
|
|
|
#include <unistd.h> |
|
|
|
|
|
|
|
|
|
|
|
#if __BYTE_ORDER == __BIG_ENDIAN |
|
|
|
#if __BYTE_ORDER == __BIG_ENDIAN |
|
|
@ -39,14 +40,6 @@ struct trx_header { |
|
|
|
uint32_t offset[3]; |
|
|
|
uint32_t offset[3]; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
enum mode { |
|
|
|
|
|
|
|
MODE_UNKNOWN, |
|
|
|
|
|
|
|
MODE_CHECK, |
|
|
|
|
|
|
|
MODE_EXTRACT, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum mode mode = MODE_UNKNOWN; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char *trx_path; |
|
|
|
char *trx_path; |
|
|
|
size_t trx_offset = 0; |
|
|
|
size_t trx_offset = 0; |
|
|
|
char *partition[TRX_MAX_PARTS] = {}; |
|
|
|
char *partition[TRX_MAX_PARTS] = {}; |
|
|
@ -137,7 +130,19 @@ uint32_t otrx_crc32(uint8_t *buf, size_t len) { |
|
|
|
* Check |
|
|
|
* Check |
|
|
|
**************************************************/ |
|
|
|
**************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
static int otrx_check() { |
|
|
|
static void otrx_check_parse_options(int argc, char **argv) { |
|
|
|
|
|
|
|
int c; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((c = getopt(argc, argv, "o:")) != -1) { |
|
|
|
|
|
|
|
switch (c) { |
|
|
|
|
|
|
|
case 'o': |
|
|
|
|
|
|
|
trx_offset = atoi(optarg); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int otrx_check(int argc, char **argv) { |
|
|
|
FILE *trx; |
|
|
|
FILE *trx; |
|
|
|
struct trx_header hdr; |
|
|
|
struct trx_header hdr; |
|
|
|
size_t bytes, length; |
|
|
|
size_t bytes, length; |
|
|
@ -145,6 +150,16 @@ static int otrx_check() { |
|
|
|
uint32_t crc32; |
|
|
|
uint32_t crc32; |
|
|
|
int err = 0; |
|
|
|
int err = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (argc < 3) { |
|
|
|
|
|
|
|
fprintf(stderr, "No TRX file passed\n"); |
|
|
|
|
|
|
|
err = -EINVAL; |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
trx_path = argv[2]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
optind = 3; |
|
|
|
|
|
|
|
otrx_check_parse_options(argc, argv); |
|
|
|
|
|
|
|
|
|
|
|
trx = fopen(trx_path, "r"); |
|
|
|
trx = fopen(trx_path, "r"); |
|
|
|
if (!trx) { |
|
|
|
if (!trx) { |
|
|
|
fprintf(stderr, "Couldn't open %s\n", trx_path); |
|
|
|
fprintf(stderr, "Couldn't open %s\n", trx_path); |
|
|
@ -209,6 +224,27 @@ out: |
|
|
|
* Extract |
|
|
|
* Extract |
|
|
|
**************************************************/ |
|
|
|
**************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void otrx_extract_parse_options(int argc, char **argv) { |
|
|
|
|
|
|
|
int c; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((c = getopt(argc, argv, "c:e:o:1:2:3:")) != -1) { |
|
|
|
|
|
|
|
switch (c) { |
|
|
|
|
|
|
|
case 'o': |
|
|
|
|
|
|
|
trx_offset = atoi(optarg); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case '1': |
|
|
|
|
|
|
|
partition[0] = optarg; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case '2': |
|
|
|
|
|
|
|
partition[1] = optarg; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case '3': |
|
|
|
|
|
|
|
partition[2] = optarg; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int otrx_extract_copy(FILE *trx, size_t offset, size_t length, char *out_path) { |
|
|
|
static int otrx_extract_copy(FILE *trx, size_t offset, size_t length, char *out_path) { |
|
|
|
FILE *out; |
|
|
|
FILE *out; |
|
|
|
size_t bytes; |
|
|
|
size_t bytes; |
|
|
@ -254,13 +290,23 @@ out: |
|
|
|
return err; |
|
|
|
return err; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int otrx_extract() { |
|
|
|
static int otrx_extract(int argc, char **argv) { |
|
|
|
FILE *trx; |
|
|
|
FILE *trx; |
|
|
|
struct trx_header hdr; |
|
|
|
struct trx_header hdr; |
|
|
|
size_t bytes; |
|
|
|
size_t bytes; |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
int err = 0; |
|
|
|
int err = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (argc < 3) { |
|
|
|
|
|
|
|
fprintf(stderr, "No TRX file passed\n"); |
|
|
|
|
|
|
|
err = -EINVAL; |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
trx_path = argv[2]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
optind = 3; |
|
|
|
|
|
|
|
otrx_extract_parse_options(argc, argv); |
|
|
|
|
|
|
|
|
|
|
|
trx = fopen(trx_path, "r"); |
|
|
|
trx = fopen(trx_path, "r"); |
|
|
|
if (!trx) { |
|
|
|
if (!trx) { |
|
|
|
fprintf(stderr, "Couldn't open %s\n", trx_path); |
|
|
|
fprintf(stderr, "Couldn't open %s\n", trx_path); |
|
|
@ -310,61 +356,29 @@ out: |
|
|
|
* Start |
|
|
|
* Start |
|
|
|
**************************************************/ |
|
|
|
**************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
static void parse_options(int argc, char **argv) { |
|
|
|
|
|
|
|
int c; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((c = getopt(argc, argv, "c:e:o:1:2:3:")) != -1) { |
|
|
|
|
|
|
|
switch (c) { |
|
|
|
|
|
|
|
case 'c': |
|
|
|
|
|
|
|
mode = MODE_CHECK; |
|
|
|
|
|
|
|
trx_path = optarg; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 'e': |
|
|
|
|
|
|
|
mode = MODE_EXTRACT; |
|
|
|
|
|
|
|
trx_path = optarg; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 'o': |
|
|
|
|
|
|
|
trx_offset = atoi(optarg); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case '1': |
|
|
|
|
|
|
|
partition[0] = optarg; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case '2': |
|
|
|
|
|
|
|
partition[1] = optarg; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case '3': |
|
|
|
|
|
|
|
partition[2] = optarg; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void usage() { |
|
|
|
static void usage() { |
|
|
|
printf("Usage:\n"); |
|
|
|
printf("Usage:\n"); |
|
|
|
printf("\n"); |
|
|
|
printf("\n"); |
|
|
|
printf("Checking TRX file:\n"); |
|
|
|
printf("Checking TRX file:\n"); |
|
|
|
printf("\t-c file\t\tcheck if file is a valid TRX\n"); |
|
|
|
printf("\totrx check <file> [options]\tcheck if file is a valid TRX\n"); |
|
|
|
printf("\t-o offset\toffset of TRX data in file (default: 0)\n"); |
|
|
|
printf("\t-o offset\t\t\toffset of TRX data in file (default: 0)\n"); |
|
|
|
printf("\n"); |
|
|
|
printf("\n"); |
|
|
|
printf("Extracting from TRX file:\n"); |
|
|
|
printf("Extracting from TRX file:\n"); |
|
|
|
printf("\t-e file\t\tfile with TRX to extract from\n"); |
|
|
|
printf("\totrx extract <file> [options]\textract partitions from TRX file\n"); |
|
|
|
printf("\t-o offset\toffset of TRX data in file (default: 0)\n"); |
|
|
|
printf("\t-o offset\t\t\toffset of TRX data in file (default: 0)\n"); |
|
|
|
printf("\t-1 file\t\tfile to extract 1st partition to (optional)\n"); |
|
|
|
printf("\t-1 file\t\t\t\tfile to extract 1st partition to (optional)\n"); |
|
|
|
printf("\t-2 file\t\tfile to extract 2nd partition to (optional)\n"); |
|
|
|
printf("\t-2 file\t\t\t\tfile to extract 2nd partition to (optional)\n"); |
|
|
|
printf("\t-3 file\t\tfile to extract 3rd partition to (optional)\n"); |
|
|
|
printf("\t-3 file\t\t\t\tfile to extract 3rd partition to (optional)\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv) { |
|
|
|
int main(int argc, char **argv) { |
|
|
|
parse_options(argc, argv); |
|
|
|
if (argc > 1) { |
|
|
|
|
|
|
|
if (!strcmp(argv[1], "check")) |
|
|
|
switch (mode) { |
|
|
|
return otrx_check(argc, argv); |
|
|
|
case MODE_CHECK: |
|
|
|
else if (!strcmp(argv[1], "extract")) |
|
|
|
return otrx_check(); |
|
|
|
return otrx_extract(argc, argv); |
|
|
|
case MODE_EXTRACT: |
|
|
|
|
|
|
|
return otrx_extract(); |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
usage(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
usage(); |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|