- if (length > 0) {
- write_file(name, pos, length);
- if (*((unsigned int*)pos) == LZ_MAGIC) {
+ return NULL;
+ }
+
+
+ name_length = *((unsigned int*)pos);
+ pos += 4;
+
+ fent.length = *((unsigned int*)pos);
+ pos += 4;
+
+ if ((fent.length > (end - pos)) ||
+ (name_length > (end - pos))) {
+ printf("EOF reached without hitting EOF marker, aborting "
+ "(unknown: 0x%02x, namelen: 0x%08x, contentlen: 0x%08x!\n",
+ fent.unknown, name_length, fent.length);
+ exit(1);
+ }
+
+ fent.name = (char*)pos;
+ pos += name_length;
+
+ fent.start = pos;
+ pos += fent.length;
+
+ return &fent;
+}
+
+void extract_files(unsigned char *fw, int len)
+{
+ struct file_entry *fent;
+
+ fent = get_next_file(fw, len);
+
+ while (fent) {
+ printf("%s: unknown: 0x%02x, length: %d",
+ fent->name, fent->unknown, fent->length);
+
+ if (fent->length > 0) {
+ write_file(fent->name, fent->start, fent->length);
+ if (*((unsigned int*)fent->start) == LZ_MAGIC) {