aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/ipaccess/ipaccess-firmware.c
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2009-12-29 13:02:19 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2009-12-30 04:40:51 +0100
commite29be15ac57ecf88c45d14652d45c24e29272314 (patch)
tree2fa0ba8838c92fddffb629d369334a5b8c56edf7 /openbsc/src/ipaccess/ipaccess-firmware.c
parent086ffa51b4f56eb875e4918a2ee1802581c6cd67 (diff)
[ipaccess] The firmware format is recursive...
The something3 points to the next start of the SDP entry. The four bytes in front of the " SDP" are not known and just discarded. Prepare to be able to recursively parse the SDP header...
Diffstat (limited to 'openbsc/src/ipaccess/ipaccess-firmware.c')
-rw-r--r--openbsc/src/ipaccess/ipaccess-firmware.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/openbsc/src/ipaccess/ipaccess-firmware.c b/openbsc/src/ipaccess/ipaccess-firmware.c
index 7f9d27a28..8b5a9d511 100644
--- a/openbsc/src/ipaccess/ipaccess-firmware.c
+++ b/openbsc/src/ipaccess/ipaccess-firmware.c
@@ -50,10 +50,10 @@ struct sdp_header_entry {
char date[14];
char text2[10];
char text3[20];
- u_int32_t something2;
+ u_int32_t length;
u_int32_t addr1;
u_int32_t addr2;
- u_int32_t something3;
+ u_int32_t start;
} __attribute__((packed));
static_assert(sizeof(struct sdp_header_entry) == 138, right_entry);
@@ -62,10 +62,9 @@ static_assert(sizeof(struct sdp_header_entry) == 138, right_entry);
static char more_magic[] = { 0x10, 0x02, 0x00, 0x0 };
-static void analyze_file(int fd)
+static void analyze_file(int fd, const unsigned int st_size, const unsigned int base_offset)
{
struct sdp_firmware *firmware_header;
- struct stat stat;
char buf[4096];
int rc, i;
@@ -94,13 +93,7 @@ static void analyze_file(int fd)
printf("items: %u (rest %u)\n", ntohs(firmware_header->part_length) / PART_LENGTH,
ntohs(firmware_header->part_length) % PART_LENGTH);
- /* verify the file */
- if (fstat(fd, &stat) == -1) {
- perror("Can not stat the file");
- return;
- }
-
- if (ntohl(firmware_header->file_length) != stat.st_size) {
+ if (ntohl(firmware_header->file_length) != st_size) {
fprintf(stderr, "The filesize and the header do not match.\n");
return;
}
@@ -113,7 +106,7 @@ static void analyze_file(int fd)
/* look into each firmware now */
for (i = 0; i < ntohs(firmware_header->part_length) / PART_LENGTH; ++i) {
struct sdp_header_entry entry;
- unsigned int offset = sizeof(struct sdp_firmware);
+ unsigned int offset = sizeof(struct sdp_firmware) + base_offset;
offset += i * 138;
if (lseek(fd, offset, SEEK_SET) != offset) {
@@ -134,16 +127,32 @@ static void analyze_file(int fd)
printf("\tdate: %.14s\n", entry.date);
printf("\ttext2: %.10s\n", entry.text2);
printf("\ttext3: %.20s\n", entry.text3);
- printf("\tsomething2: 0x%x\n", ntohl(entry.something2));
printf("\taddr1: 0x%x\n", entry.addr1);
printf("\taddr2: 0x%x\n", entry.addr2);
- printf("\tsomething3: 0x%x\n", ntohl(entry.something3));
+ printf("\tstart: 0x%x\n", ntohl(entry.start));
+ printf("\tlength: 0x%x\n", ntohl(entry.length));
+
+ /* now we need to find the SDP file... */
+ offset = ntohl(entry.start) + 4 + base_offset;
+ if (lseek(fd, offset, SEEK_SET) != offset) {
+ perror("can't seek to sdp");
+ return;
+ }
+
+ rc = read(fd, &buf, 4);
+ if (rc != 4) {
+ perror("peek failed");
+ return;
+ }
+
+ printf("FOO %.4s\n", buf);
}
}
int main(int argc, char** argv)
{
int i, fd;
+ struct stat stat;
for (i = 1; i < argc; ++i) {
printf("Opening possible firmware '%s'\n", argv[i]);
@@ -153,7 +162,13 @@ int main(int argc, char** argv)
continue;
}
- analyze_file(fd);
+ /* verify the file */
+ if (fstat(fd, &stat) == -1) {
+ perror("Can not stat the file");
+ return EXIT_FAILURE;
+ }
+
+ analyze_file(fd, stat.st_size, 0);
}
return EXIT_SUCCESS;