Changeset 280 for ap51-flash

Show
Ignore:
Timestamp:
12/01/11 07:54:33 (6 months ago)
Author:
marek
Message:

ap51-flash: update CE image parser to support OpenWrt? CE format v1

Signed-off-by: Marek Lindner <lindner_marek@…>

Location:
ap51-flash/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • ap51-flash/trunk/router_images.c

    r272 r280  
    2323#include <errno.h> 
    2424#include <unistd.h> 
     25#include <ctype.h> 
    2526 
    2627#include "types.h" 
     
    122123 
    123124static int uboot_verify(struct router_image *router_image, char *buff, 
    124                         int buff_len, int size) 
     125                        unsigned int buff_len, int size) 
    125126{ 
    126127        int ret; 
     
    174175 
    175176static int ubnt_verify(struct router_image *router_image, char *buff, 
    176                        int buff_len, int size) 
     177                       unsigned int buff_len, int size) 
    177178{ 
    178179        if (buff_len < 4) 
     
    220221 
    221222static int ci_verify(struct router_image *router_image, char *buff, 
    222                      int buff_len, int size) 
     223                     unsigned int buff_len, int size) 
    223224{ 
    224225        unsigned int kernel_size, rootfs_size; 
     
    284285 
    285286static int ce_verify_om2p(struct router_image *router_image, char *buff, 
    286                           int buff_len, int size) 
    287 { 
    288         char name_buff[21]; 
     287                          unsigned int buff_len, int size) 
     288{ 
     289        char name_buff[33], md5_buff[33]; 
    289290        unsigned int num_files, hdr_offset, file_offset, file_size; 
     291        unsigned int ce_version = 0, hdr_offset_sec; 
    290292        int ret; 
    291293 
    292         hdr_offset = 14; 
    293294        file_offset = 64 * 1024; 
    294295 
     
    300301                return 0; 
    301302 
    302         ret = sscanf(buff, "CE%10s%02x", name_buff, &num_files); 
    303         if (ret != 2) 
    304                 return 0; 
    305  
    306         if (strstr(name_buff, "OM2P") == NULL) 
    307                 return 0; 
    308  
    309         while (num_files > 0) { 
    310                 ret = sscanf(buff + hdr_offset, "%20s%08x", name_buff, &file_size); 
     303        /* the old format does not have a version field */ 
     304        if (isxdigit(buff[2]) && isxdigit(buff[3])) { 
     305                ret = sscanf(buff, "CE%02x", &ce_version); 
     306                if (ret != 1) 
     307                        return 0; 
     308        } 
     309 
     310        switch (ce_version) { 
     311        case 0: 
     312                ret = sscanf(buff, "CE%10s%02x", name_buff, &num_files); 
    311313                if (ret != 2) 
    312314                        return 0; 
     315 
     316                hdr_offset = 14; 
     317                hdr_offset_sec = 28; 
     318                break; 
     319        case 1: 
     320                ret = sscanf(buff, "CE%*02x%32s%02x", name_buff, &num_files); 
     321                if (ret != 2) 
     322                        return 0; 
     323 
     324                hdr_offset = 38; 
     325                hdr_offset_sec = 72; 
     326                break; 
     327        default: 
     328                /* unsupported version */ 
     329                return 0; 
     330        } 
     331 
     332        if (strstr(name_buff, "OM2P") == NULL) 
     333                return 0; 
     334 
     335        while (num_files > 0) { 
     336                if (hdr_offset + hdr_offset_sec > buff_len) { 
     337                        fprintf(stderr, "Error - buffer too small to parse CE header\n"); 
     338                        return 0; 
     339                } 
     340 
     341                switch (ce_version) { 
     342                case 0: 
     343                        ret = sscanf(buff + hdr_offset, "%20s%08x", name_buff, &file_size); 
     344                        if (ret != 2) 
     345                                return 0; 
     346 
     347                        break; 
     348                case 1: 
     349                        ret = sscanf(buff + hdr_offset, "%32s%08x%32s", name_buff, &file_size, md5_buff); 
     350                        if (ret != 3) 
     351                                return 0; 
     352 
     353                        break; 
     354                } 
    313355 
    314356                ret = router_image_add_file(router_image, name_buff, file_size, file_size, file_offset); 
     
    317359 
    318360                file_offset += file_size; 
    319                 hdr_offset += 28; 
     361                hdr_offset += hdr_offset_sec; 
    320362                num_files--; 
    321363        } 
     
    421463{ 
    422464        struct router_image **router_image; 
    423         char file_buff[100], found_consumer = 0; 
     465        char *file_buff = NULL, found_consumer = 0; 
     466        unsigned int file_buff_size = 300; 
    424467        int fd, file_size, ret = -1, len; 
     468 
     469        file_buff = malloc(file_buff_size); 
     470        if (!file_buff_size) 
     471                goto out; 
    425472 
    426473        fd = open(image_path, O_RDONLY | O_BINARY); 
     
    430477        } 
    431478 
    432         ret = read(fd, file_buff, sizeof(file_buff)); 
     479        ret = read(fd, file_buff, file_buff_size); 
    433480        if (ret < 0) { 
    434481                fprintf(stderr, "Error - can't read image file '%s': %s\n", image_path, strerror(errno)); 
     
    468515        close(fd); 
    469516out: 
     517        free(file_buff); 
    470518        return ret; 
    471519} 
  • ap51-flash/trunk/types.h

    r272 r280  
    105105 
    106106struct file_info { 
    107         char file_name[20]; 
     107        char file_name[33]; 
    108108        unsigned int file_offset; 
    109109        unsigned int file_size; 
     
    114114        char desc[DESC_MAX_LENGTH]; 
    115115        int (*image_init)(void); 
    116         int (*image_verify)(struct router_image *router_image, char *buff, int buff_len, int size); 
     116        int (*image_verify)(struct router_image *router_image, char *buff, unsigned int buff_len, int size); 
    117117        char *path; 
    118118        char *embedded_img;