otrx: change command line API to start with a mode
authorrmilecki <rmilecki@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Tue, 14 Apr 2015 20:50:46 +0000 (20:50 +0000)
committerrmilecki <rmilecki@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Tue, 14 Apr 2015 20:50:46 +0000 (20:50 +0000)
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-a3cf2f4a3e73

package/utils/otrx/src/Makefile
package/utils/otrx/src/otrx.c
target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
target/linux/brcm47xx/base-files/lib/upgrade/platform.sh

index 81c85e2..df50ea4 100644 (file)
@@ -1,7 +1,7 @@
 all: otrx
 
 otrx:
-       $(CC) $(CFLAGS) -o $@ otrx.c
+       $(CC) $(CFLAGS) -o $@ otrx.c -Wall
 
 clean:
        rm -f otrx
index e42aaca..25e0592 100644 (file)
@@ -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;
 }
index f550521..876da4d 100644 (file)
@@ -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
 
index 9b21e31..83d3dee 100644 (file)
@@ -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