]> cvs.zerfleddert.de Git - rsbs2/blobdiff - firmware.c
fix syslog debug setup
[rsbs2] / firmware.c
index 40c2b56c32e7d794f3654f9e39be5ff677bc44f6..fb5b007e5b2b8e9e3968c740286b90d01f8a8ed2 100644 (file)
@@ -8,7 +8,7 @@
 #include <string.h>
 #include <strings.h>
 #include "rsb-crc.h"
-#include "rsb-lz.h"
+#include "extract.h"
 
 #define FINDSTR(addr, str) (!strncmp((char*)addr, str, strlen(str)))
 
@@ -46,18 +46,17 @@ struct propaction {
 
 void show_properties(unsigned char *fw, int len)
 {
-       int i;
+       struct file_entry *fent;
 
-       for (i = 0; i < (len-100 /* XXX */); i++) {
-               if (FINDSTR(fw+i, "/default/fw_prop/") ||
-                   FINDSTR(fw+i, "/default/fw_setup/") ||
-                   FINDSTR(fw+i, "/default/oem_prop/")) {
+       for (fent = get_next_file(fw, len); fent != NULL; fent = get_next_file(NULL, 0)) {
+               if (FINDSTR(fent->name, "/default/fw_prop/") ||
+                   FINDSTR(fent->name, "/default/fw_setup/") ||
+                   FINDSTR(fent->name, "/default/oem_prop/")) {
                        struct properties *prop;
-                       unsigned char *pos = fw + i;
 
-                       printf("0x%08x: found setting: %s ", i, pos);
+                       printf("0x%08x: found setting: %s ", fent->start - fw, fent->name);
 
-                       prop = (struct properties*)(pos + strlen((char*)pos) + 1);
+                       prop = (struct properties*)fent->start;
                        
                        if (prop->magic != 0x83011111) {
                                printf("ignoring...\n");
@@ -82,29 +81,28 @@ void show_properties(unsigned char *fw, int len)
                        } else {
                                printf("(UNK 0x%02x 0x%02x)", prop->right_rw, prop->rw_mask);
                        }
-                       printf(", length: %d\n", *((unsigned int*)(fw + i - 4)));
+                       printf(", length: %d\n", fent->length);
                }
        }
 }
 
 void change_properties(unsigned char *fw, int len, struct propaction *paction)
 {
-       int i;
+       struct file_entry *fent;
        struct propaction *cpaction;
 
-       for (i = 0; i < (len-100 /* XXX */); i++) {
+       for (fent = get_next_file(fw, len); fent != NULL; fent = get_next_file(NULL, 0)) {
                cpaction = paction;
                while (cpaction != NULL) {
-                       if (FINDSTR(fw + i, cpaction->property)) {
+                       if (FINDSTR(fent->name, cpaction->property)) {
                                break;
                        }
                        cpaction = cpaction->next;
                }
                if (cpaction != NULL) {
                        struct properties *prop;
-                       unsigned char *pos = fw + i;
 
-                       prop = (struct properties*)(pos + strlen((char*)pos) + 1);
+                       prop = (struct properties*)fent->start;
 
                        if (prop->magic != 0x83011111) {
                                continue;
@@ -218,34 +216,43 @@ void print_boarddescription(unsigned char *bd)
 
 void handle_boarddescription(unsigned char *fw, int len, int patch)
 {
-       int i;
+       struct file_entry *fent;
+       unsigned char *pos;
        
-       for (i = len - (strlen("pdata")+1); i > 0; i--) {
-               if (FINDSTR(fw+i, "pdata")) {
-                       unsigned char *pos = fw + i + strlen("pdata") + 1;
+       for (fent = get_next_file(fw, len); fent != NULL; fent = get_next_file(NULL, 0)) {
+               if (!strcmp(fent->name, "pdata"))
+                       break;
+       }
 
-                       /* MAGIC? */
-                       if (*((unsigned int*)pos) != 0x00002802) {
-                               continue;
-                       }
+       if (fent == NULL) {
+               fprintf(stderr, "pdata file not found, aborting!\n");
+               exit(1);
+       }
 
-                       pos += 26;
 
-                       /* MAGIC2? */
-                       if (*((unsigned int*)pos) != 0x00500101) {
-                               continue;
-                       }
+       pos = fent->start;
+       /* MAGIC? */
+       if (*((unsigned int*)pos) != 0x00002802) {
+               fprintf(stderr, "pdata magic does not match, aborting!\n");
+               exit(1);
+       }
 
-                       if (patch) {
-                               /* Enable relay power switching */
-                               BD_SET(pos, PWRRELAY);
-                       }
-                       printf("0x%08x: BOARD_DESCRIPTION: ", pos-fw);
-                       print_boarddescription(pos);
+       pos += 26;
 
-                       break;
-               }
+       /* MAGIC2? */
+       if (*((unsigned int*)pos) != 0x00500101) {
+               fprintf(stderr, "pdata magic2 does not match, aborting!\n");
+               exit(1);
        }
+
+       if (patch) {
+               /* Enable ATX and relay power switching */
+               BD_SET(pos, PWRATX);
+               BD_SET(pos, PWRRELAY);
+       }
+
+       printf("0x%08x: BOARD_DESCRIPTION: ", fent->start - fw);
+       print_boarddescription(pos);
 }
 
 void syntax(char *name)
@@ -338,6 +345,24 @@ int check_crc(unsigned char *fw, int len)
        return ret;
 }
 
+int check_image(unsigned char *fw, int len)
+{
+       struct file_entry *fent;
+       char *last_name = NULL;
+
+       fent = get_next_file(fw, len);
+       while (fent != NULL) {
+               last_name = fent->name;
+               fent = get_next_file(NULL, 0);
+       }
+
+       if (strcmp(last_name, "pdata")) {
+               return 1;
+       }
+
+       return 0;
+}
+
 int main(int argc, char **argv)
 {
        struct stat statbuf;
@@ -423,6 +448,12 @@ int main(int argc, char **argv)
        ret = check_crc(fw, statbuf.st_size);
        if ((ret != 0) && (!update_crc)) {
                fprintf(stderr,"Checksum incorrect, aborting...\n");
+               exit(1);
+       }
+
+       if (check_image(fw, statbuf.st_size-4) != 0) {
+               fprintf(stderr, "corrupt firmware image found (pdata is not last entry), aborting!\n");
+               exit(1);
        }
 
        if (patch_fw) {
@@ -461,7 +492,7 @@ int main(int argc, char **argv)
        }
 
        if (extract) {
-               search_lz_sections(fw, statbuf.st_size - 4);
+               extract_files(fw, statbuf.st_size - 4);
        }
 
        if (update_crc || patch_fw || patch_bd) {
Impressum, Datenschutz