in dmg/dmglib.c [10:48]
int extractDmg(AbstractFile* abstractIn, AbstractFile* abstractOut, int partNum)
{
io_func* dmgfile = openDmgFile(abstractIn);
if (!dmgfile) {
fprintf(stderr, "cannot open dmg file\n");
return FALSE;
}
DMG* dmg = (DMG*)dmgfile->data;
ResourceKey* resources = dmg->resources;
ResourceData* blkxData;
printf("Writing out data..\n"); fflush(stdout);
/* reasonable assumption that 2 is the main partition, given that that's usually the case in SPUD layouts */
if(partNum < 0) {
blkxData = getResourceByKey(resources, "blkx")->data;
while(blkxData != NULL) {
if(strstr(blkxData->name, "Apple_HFS") != NULL) {
break;
}
blkxData = blkxData->next;
}
} else {
blkxData = getDataByID(getResourceByKey(resources, "blkx"), partNum);
}
if(blkxData) {
extractBLKX(abstractIn, abstractOut, (BLKXTable*)(blkxData->data));
} else {
printf("BLKX not found!\n"); fflush(stdout);
}
abstractOut->close(abstractOut);
dmgfile->close(dmgfile); // will also close abstractIn
return TRUE;
}