otrx: change command line API to start with a mode
This will allow adding more modes without options conflict. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@45443 3c298f89-4303-0410-b956-a3cf2f4a3e73master
parent
bd81f54e15
commit
0d8a721eb1
|
@ -1,7 +1,7 @@
|
||||||
all: otrx
|
all: otrx
|
||||||
|
|
||||||
otrx:
|
otrx:
|
||||||
$(CC) $(CFLAGS) -o $@ otrx.c
|
$(CC) $(CFLAGS) -o $@ otrx.c -Wall
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f otrx
|
rm -f otrx
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,7 @@ platform_check_image() {
|
||||||
error=1
|
error=1
|
||||||
}
|
}
|
||||||
|
|
||||||
if ! otrx -c "$1" -o "$header_len"; then
|
if ! otrx check "$1" -o "$header_len"; then
|
||||||
echo "No valid TRX firmware in the CHK image"
|
echo "No valid TRX firmware in the CHK image"
|
||||||
error=1
|
error=1
|
||||||
fi
|
fi
|
||||||
|
@ -94,13 +94,13 @@ platform_check_image() {
|
||||||
error=1
|
error=1
|
||||||
}
|
}
|
||||||
|
|
||||||
if ! otrx -c "$1" -o 32; then
|
if ! otrx check "$1" -o 32; then
|
||||||
echo "No valid TRX firmware in the CyberTAN image"
|
echo "No valid TRX firmware in the CyberTAN image"
|
||||||
error=1
|
error=1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
"trx")
|
"trx")
|
||||||
if ! otrx -c "$1"; then
|
if ! otrx check "$1"; then
|
||||||
echo "Invalid (corrupted?) TRX firmware"
|
echo "Invalid (corrupted?) TRX firmware"
|
||||||
error=1
|
error=1
|
||||||
fi
|
fi
|
||||||
|
@ -140,7 +140,7 @@ platform_pre_upgrade() {
|
||||||
# Extract partitions from trx
|
# Extract partitions from trx
|
||||||
rm -fR $dir
|
rm -fR $dir
|
||||||
mkdir -p $dir
|
mkdir -p $dir
|
||||||
otrx -e "$trx" \
|
otrx extract "$trx" \
|
||||||
-1 $dir/kernel \
|
-1 $dir/kernel \
|
||||||
-2 $dir/root
|
-2 $dir/root
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@ platform_check_image() {
|
||||||
error=1
|
error=1
|
||||||
}
|
}
|
||||||
|
|
||||||
if ! otrx -c "$1" -o "$header_len"; then
|
if ! otrx check "$1" -o "$header_len"; then
|
||||||
echo "No valid TRX firmware in the CHK image"
|
echo "No valid TRX firmware in the CHK image"
|
||||||
error=1
|
error=1
|
||||||
fi
|
fi
|
||||||
|
@ -113,13 +113,13 @@ platform_check_image() {
|
||||||
error=1
|
error=1
|
||||||
}
|
}
|
||||||
|
|
||||||
if ! otrx -c "$1" -o 32; then
|
if ! otrx check "$1" -o 32; then
|
||||||
echo "No valid TRX firmware in the CyberTAN image"
|
echo "No valid TRX firmware in the CyberTAN image"
|
||||||
error=1
|
error=1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
"trx")
|
"trx")
|
||||||
if ! otrx -c "$1"; then
|
if ! otrx check "$1"; then
|
||||||
echo "Invalid (corrupted?) TRX firmware"
|
echo "Invalid (corrupted?) TRX firmware"
|
||||||
error=1
|
error=1
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Reference in New Issue