diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2009-12-30 06:10:56 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2009-12-30 06:42:16 +0100 |
commit | c9f8a6dca32be1b2037707f59e681767fd32951f (patch) | |
tree | a80545341ee44f873a43d53d38b13f69bfa022e4 | |
parent | 4a98cad85e196ee3e23c527862d8c524e150366a (diff) |
[ipaccess] Expose the sub header list as well..
-rw-r--r-- | openbsc/include/openbsc/ipaccess.h | 25 | ||||
-rw-r--r-- | openbsc/src/ipaccess/ipaccess-firmware.c | 40 |
2 files changed, 49 insertions, 16 deletions
diff --git a/openbsc/include/openbsc/ipaccess.h b/openbsc/include/openbsc/ipaccess.h index 5040de02f..31393811c 100644 --- a/openbsc/include/openbsc/ipaccess.h +++ b/openbsc/include/openbsc/ipaccess.h @@ -69,9 +69,32 @@ struct sdp_firmware { /* stuff i don't know */ } __attribute__((packed)); +struct sdp_header_entry { + u_int16_t something1; + char text1[64]; + char time[12]; + char date[14]; + char text2[10]; + char version[20]; + u_int32_t length; + u_int32_t addr1; + u_int32_t addr2; + u_int32_t start; +} __attribute__((packed)); + +struct sdp_header_entry_list { + struct sdp_header_entry header_entry; + struct llist_head entry; +}; + struct sdp_header { struct sdp_firmware firmware_info; - struct llist_head list; + + /* for more_magic a list of sdp_header_entry_list */ + struct llist_head header_list; + + /* the entry of the sdp_header */ + struct llist_head entry; }; int ipaccess_analyze_file(int fd, const unsigned int st_size, const unsigned base_offset, struct llist_head *list); diff --git a/openbsc/src/ipaccess/ipaccess-firmware.c b/openbsc/src/ipaccess/ipaccess-firmware.c index 6edef91d5..2fb7befe0 100644 --- a/openbsc/src/ipaccess/ipaccess-firmware.c +++ b/openbsc/src/ipaccess/ipaccess-firmware.c @@ -33,19 +33,6 @@ #define PART_LENGTH 138 -struct sdp_header_entry { - u_int16_t something1; - char text1[64]; - char time[12]; - char date[14]; - char text2[10]; - char version[20]; - u_int32_t length; - u_int32_t addr1; - u_int32_t addr2; - u_int32_t start; -} __attribute__((packed)); - static_assert(sizeof(struct sdp_header_entry) == 138, right_entry); static_assert(sizeof(struct sdp_firmware) == 160, _right_header_length); @@ -90,7 +77,8 @@ int ipacces_analyze_file(int fd, const unsigned int st_size, const unsigned int /* add the firmware */ header = malloc(sizeof(*header)); header->firmware_info = *firmware_header; - llist_add(&header->list, list); + INIT_LLIST_HEAD(&header->header_list); + llist_add(&header->entry, list); /* this semantic appears to be only the case for 0x0000 */ if (firmware_header->more_more_magic != 0) @@ -104,6 +92,7 @@ int ipacces_analyze_file(int fd, const unsigned int st_size, const unsigned int /* look into each firmware now */ for (i = 0; i < ntohs(firmware_header->part_length) / PART_LENGTH; ++i) { struct sdp_header_entry entry; + struct sdp_header_entry_list *header_entry; unsigned int offset = base_offset + sizeof(struct sdp_firmware); offset += i * 138; @@ -125,6 +114,10 @@ int ipacces_analyze_file(int fd, const unsigned int st_size, const unsigned int return -1; } + header_entry = malloc(sizeof(*header_entry)); + header_entry->header_entry = entry; + llist_add(&header_entry->entry, &header->header_list); + ipacces_analyze_file(fd, ntohl(entry.length), offset, list); } @@ -138,6 +131,7 @@ int main(int argc, char** argv) for (i = 1; i < argc; ++i) { struct sdp_header *header; + struct sdp_header_entry_list *sub_entry; struct llist_head entry; INIT_LLIST_HEAD(&entry); @@ -156,7 +150,7 @@ int main(int argc, char** argv) ipacces_analyze_file(fd, stat.st_size, 0, &entry); - llist_for_each_entry(header, &entry, list) { + llist_for_each_entry(header, &entry, entry) { printf("Printing header information:\n"); printf("more_more_magic: 0x%x\n", ntohs(header->firmware_info.more_more_magic)); printf("header_length: %u\n", ntohl(header->firmware_info.header_length)); @@ -167,7 +161,23 @@ int main(int argc, char** argv) printf("date: %.14s\n", header->firmware_info.date); printf("text2: %.10s\n", header->firmware_info.text2); printf("version: %.20s\n", header->firmware_info.version); + printf("subitems...\n"); + + llist_for_each_entry(sub_entry, &header->header_list, entry) { + printf("\tsomething1: %u\n", sub_entry->header_entry.something1); + printf("\ttext1: %.64s\n", sub_entry->header_entry.text1); + printf("\ttime: %.12s\n", sub_entry->header_entry.time); + printf("\tdate: %.14s\n", sub_entry->header_entry.date); + printf("\ttext2: %.10s\n", sub_entry->header_entry.text2); + printf("\tversion: %.20s\n", sub_entry->header_entry.version); + printf("\tlength: %u\n", ntohl(sub_entry->header_entry.length)); + printf("\taddr1: 0x%x\n", ntohl(sub_entry->header_entry.addr1)); + printf("\taddr2: 0x%x\n", ntohl(sub_entry->header_entry.addr2)); + printf("\tstart: 0x%x\n", ntohl(sub_entry->header_entry.start)); + printf("\n\n"); + } printf("\n\n"); + } } |