From: Rafał Miłecki <zajec5@gmail.com>
Date: Tue, 14 Apr 2015 20:50:46 +0000 (+0000)
Subject: otrx: change command line API to start with a mode
X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=3cb8bf44e69d5ab72a456b15965b28cc656eadde;p=openwrt%2Fstaging%2Fsvanheule.git

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>

SVN-Revision: 45443
---

diff --git a/package/utils/otrx/src/Makefile b/package/utils/otrx/src/Makefile
index 81c85e27da..df50ea446d 100644
--- a/package/utils/otrx/src/Makefile
+++ b/package/utils/otrx/src/Makefile
@@ -1,7 +1,7 @@
 all: otrx
 
 otrx:
-	$(CC) $(CFLAGS) -o $@ otrx.c
+	$(CC) $(CFLAGS) -o $@ otrx.c -Wall
 
 clean:
 	rm -f otrx
diff --git a/package/utils/otrx/src/otrx.c b/package/utils/otrx/src/otrx.c
index e42aacaf0e..25e0592737 100644
--- a/package/utils/otrx/src/otrx.c
+++ b/package/utils/otrx/src/otrx.c
@@ -14,6 +14,7 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -39,14 +40,6 @@ struct trx_header {
 	uint32_t offset[3];
 };
 
-enum mode {
-	MODE_UNKNOWN,
-	MODE_CHECK,
-	MODE_EXTRACT,
-};
-
-enum mode mode = MODE_UNKNOWN;
-
 char *trx_path;
 size_t trx_offset = 0;
 char *partition[TRX_MAX_PARTS] = {};
@@ -137,7 +130,19 @@ uint32_t otrx_crc32(uint8_t *buf, size_t len) {
  * 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;
 	struct trx_header hdr;
 	size_t bytes, length;
@@ -145,6 +150,16 @@ static int otrx_check() {
 	uint32_t crc32;
 	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");
 	if (!trx) {
 		fprintf(stderr, "Couldn't open %s\n", trx_path);
@@ -209,6 +224,27 @@ out:
  * 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) {
 	FILE *out;
 	size_t bytes;
@@ -254,13 +290,23 @@ out:
 	return err;
 }
 
-static int otrx_extract() {
+static int otrx_extract(int argc, char **argv) {
 	FILE *trx;
 	struct trx_header hdr;
 	size_t bytes;
 	int i;
 	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");
 	if (!trx) {
 		fprintf(stderr, "Couldn't open %s\n", trx_path);
@@ -310,61 +356,29 @@ out:
  * 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() {
 	printf("Usage:\n");
 	printf("\n");
 	printf("Checking TRX file:\n");
-	printf("\t-c file\t\tcheck if file is a valid TRX\n");
-	printf("\t-o offset\toffset of TRX data in file (default: 0)\n");
+	printf("\totrx check <file> [options]\tcheck if file is a valid TRX\n");
+	printf("\t-o offset\t\t\toffset of TRX data in file (default: 0)\n");
 	printf("\n");
 	printf("Extracting from TRX file:\n");
-	printf("\t-e file\t\tfile with TRX to extract from\n");
-	printf("\t-o offset\toffset of TRX data in file (default: 0)\n");
-	printf("\t-1 file\t\tfile to extract 1st partition to (optional)\n");
-	printf("\t-2 file\t\tfile to extract 2nd partition to (optional)\n");
-	printf("\t-3 file\t\tfile to extract 3rd partition to (optional)\n");
+	printf("\totrx extract <file> [options]\textract partitions from TRX file\n");
+	printf("\t-o offset\t\t\toffset of TRX data in file (default: 0)\n");
+	printf("\t-1 file\t\t\t\tfile to extract 1st partition to (optional)\n");
+	printf("\t-2 file\t\t\t\tfile to extract 2nd 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) {
-	parse_options(argc, argv);
-
-	switch (mode) {
-	case MODE_CHECK:
-		return otrx_check();
-	case MODE_EXTRACT:
-		return otrx_extract();
-	default:
-		usage();
+	if (argc > 1) {
+		if (!strcmp(argv[1], "check"))
+			return otrx_check(argc, argv);
+		else if (!strcmp(argv[1], "extract"))
+			return otrx_extract(argc, argv);
 	}
 
+	usage();
 	return 0;
 }
diff --git a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
index f5505219b0..876da4d6f8 100644
--- a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
@@ -79,7 +79,7 @@ platform_check_image() {
 				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"
 				error=1
 			fi
@@ -94,13 +94,13 @@ platform_check_image() {
 				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"
 				error=1
 			fi
 		;;
 		"trx")
-			if ! otrx -c "$1"; then
+			if ! otrx check "$1"; then
 				echo "Invalid (corrupted?) TRX firmware"
 				error=1
 			fi
@@ -140,7 +140,7 @@ platform_pre_upgrade() {
 	# Extract partitions from trx
 	rm -fR $dir
 	mkdir -p $dir
-	otrx -e "$trx" \
+	otrx extract "$trx" \
 		-1 $dir/kernel \
 		-2 $dir/root
 
diff --git a/target/linux/brcm47xx/base-files/lib/upgrade/platform.sh b/target/linux/brcm47xx/base-files/lib/upgrade/platform.sh
index 9b21e319bb..83d3dee625 100644
--- a/target/linux/brcm47xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/brcm47xx/base-files/lib/upgrade/platform.sh
@@ -98,7 +98,7 @@ platform_check_image() {
 				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"
 				error=1
 			fi
@@ -113,13 +113,13 @@ platform_check_image() {
 				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"
 				error=1
 			fi
 		;;
 		"trx")
-			if ! otrx -c "$1"; then
+			if ! otrx check "$1"; then
 				echo "Invalid (corrupted?) TRX firmware"
 				error=1
 			fi