[ipaccess] Read the " SDP" and version first and then the rest of the header

Read everything we need to determine the version first and then
the rest. This will allow to be able to poke into the other SDP
bits.
diff --git a/openbsc/src/ipaccess/ipaccess-firmware.c b/openbsc/src/ipaccess/ipaccess-firmware.c
index 8b5a9d5..1325e55 100644
--- a/openbsc/src/ipaccess/ipaccess-firmware.c
+++ b/openbsc/src/ipaccess/ipaccess-firmware.c
@@ -32,9 +32,12 @@
 
 #define PART_LENGTH 138
 
-struct sdp_firmware {
+struct sdp_firmware_start {
 	char magic[4];
 	char more_magic[4];
+} __attribute__((packed));
+
+struct sdp_firmware {
 	u_int32_t header_length;
 	u_int32_t file_length;
 	char sw_part[20];
@@ -57,6 +60,7 @@
 } __attribute__((packed));
 
 static_assert(sizeof(struct sdp_header_entry) == 138, right_entry);
+static_assert(sizeof(struct sdp_firmware_start) + sizeof(struct sdp_firmware) == 160, _right_header_length);
 
 /* more magic, the second "int" in the header */
 static char more_magic[] = { 0x10, 0x02, 0x00, 0x0 };
@@ -64,27 +68,39 @@
 
 static void analyze_file(int fd, const unsigned int st_size, const unsigned int base_offset)
 {
+	struct sdp_firmware_start *firmware_start;
 	struct sdp_firmware *firmware_header;
 	char buf[4096];
 	int rc, i;
+	unsigned int start_offset = 0;
 
-	rc = read(fd, buf, sizeof(*firmware_header));
+	rc = read(fd, buf, sizeof(*firmware_start));
 	if (rc < 0) {
-		perror("can not read header");
+		perror("Can not read header start.");
 		return;
 	}
 
-	firmware_header = (struct sdp_firmware *) &buf[0];
-	if (strncmp(firmware_header->magic, " SDP", 4) != 0) {
+	firmware_start = (struct sdp_firmware_start *) &buf[0];
+	if (strncmp(firmware_start->magic, " SDP", 4) != 0) {
 		fprintf(stderr, "Wrong magic.\n");
 		return;
 	}
 
-	if (memcmp(firmware_header->more_magic, more_magic, 4) != 0) {
+	if (memcmp(firmware_start->more_magic, more_magic, 4) != 0) {
 		fprintf(stderr, "Wrong more magic.\n");
 		return;
 	}
 
+
+	start_offset = sizeof(*firmware_start);
+	rc = read(fd, &buf[start_offset], sizeof(*firmware_header));
+	if (rc < 0) {
+		perror("Can not read header.");
+		return;
+	}
+	firmware_header = (struct sdp_firmware *) &buf[start_offset];
+	start_offset += sizeof(*firmware_header);
+
 	printf("Printing header information:\n");
 	printf("header_length: %u\n", ntohl(firmware_header->header_length));
 	printf("file_length: %u\n", ntohl(firmware_header->file_length));
@@ -106,7 +122,7 @@
 	/* 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) + base_offset;
+		unsigned int offset = start_offset + base_offset;
 		offset += i * 138;
 
 		if (lseek(fd, offset, SEEK_SET) != offset) {