void readImg3Root(AbstractFile* file, Img3Element* element) { Img3Element* children; Img3Element* current; uint32_t remaining; AppleImg3RootHeader* header; children = NULL; header = (AppleImg3RootHeader*) realloc(element->header, sizeof(AppleImg3RootHeader)); element->header = (AppleImg3Header*) header; file->read(file, &(header->extra), sizeof(AppleImg3RootExtra)); flipAppleImg3RootExtra(&(header->extra)); remaining = header->base.dataSize; while(remaining > 0) { if(children != NULL) { current->next = readImg3Element(file); current = current->next; } else { current = readImg3Element(file); children = current; } remaining -= current->header->size; } element->data = (void*) children; element->write = writeImg3Root; element->free = freeImg3Root; }
void writeImg3Root(AbstractFile * file, Img3Element * element, Img3Info * info) { AppleImg3RootHeader *header; Img3Element *current; off_t curPos; curPos = file->tell(file); curPos -= sizeof(AppleImg3Header); file->seek(file, curPos + sizeof(AppleImg3RootHeader)); header = (AppleImg3RootHeader *) element->header; current = (Img3Element *) element->data; while (current != NULL) { if (current->header->magic == IMG3_SHSH_MAGIC) { header->extra.shshOffset = (uint32_t) (file->tell(file) - sizeof(AppleImg3RootHeader)); } if (current->header->magic != IMG3_KBAG_MAGIC || info->encrypted) { writeImg3Element(file, current, info); } current = current->next; } header->base.dataSize = file->tell(file) - (curPos + sizeof(AppleImg3RootHeader)); header->base.size = sizeof(AppleImg3RootHeader) + header->base.dataSize; file->seek(file, curPos); flipAppleImg3Header(&(header->base)); flipAppleImg3RootExtra(&(header->extra)); file->write(file, header, sizeof(AppleImg3RootHeader)); flipAppleImg3RootExtra(&(header->extra)); flipAppleImg3Header(&(header->base)); file->seek(file, header->base.size); }