/* * adfReadFileExtBlock * */ RETCODE adfReadFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext) { unsigned char buf[sizeof(struct bFileExtBlock)]; RETCODE rc = RC_OK; adfReadBlock(vol, nSect,buf); /*printf("read fext=%d\n",nSect);*/ memcpy(fext,buf,sizeof(struct bFileExtBlock)); #ifdef LITT_ENDIAN swapEndian((unsigned char*)fext, SWBL_FEXT); #endif if (fext->checkSum!=adfNormalSum(buf,20,sizeof(struct bFileExtBlock))) (*adfEnv.wFct)("adfReadFileExtBlock : invalid checksum"); if (fext->type!=T_LIST) (*adfEnv.wFct)("adfReadFileExtBlock : type T_LIST not found"); if (fext->secType!=ST_FILE) (*adfEnv.wFct)("adfReadFileExtBlock : stype ST_FILE not found"); if (fext->headerKey!=nSect) (*adfEnv.wFct)("adfReadFileExtBlock : headerKey!=nSect"); if (fext->highSeq<0 || fext->highSeq>MAX_DATABLK) (*adfEnv.wFct)("adfReadFileExtBlock : highSeq out of range"); if ( !isSectNumValid(vol, fext->parent) ) (*adfEnv.wFct)("adfReadFileExtBlock : parent out of range"); if ( fext->extension!=0 && !isSectNumValid(vol, fext->extension) ) (*adfEnv.wFct)("adfReadFileExtBlock : extension out of range"); return rc; }
/* * adfReadDataBlock * */ RETCODE adfReadDataBlock(struct Volume *vol, SECTNUM nSect, void *data) { unsigned char buf[512]; struct bOFSDataBlock *dBlock; RETCODE rc = RC_OK; adfReadBlock(vol, nSect,buf); memcpy(data,buf,512); if (isOFS(vol->dosType)) { #ifdef LITT_ENDIAN swapEndian(data, SWBL_DATA); #endif dBlock = (struct bOFSDataBlock*)data; /*printf("adfReadDataBlock %ld\n",nSect);*/ if (dBlock->checkSum!=adfNormalSum(buf,20,sizeof(struct bOFSDataBlock))) (*adfEnv.wFct)("adfReadDataBlock : invalid checksum"); if (dBlock->type!=T_DATA) (*adfEnv.wFct)("adfReadDataBlock : id T_DATA not found"); if (dBlock->dataSize<0 || dBlock->dataSize>488) (*adfEnv.wFct)("adfReadDataBlock : dataSize incorrect"); if ( !isSectNumValid(vol,dBlock->headerKey) ) (*adfEnv.wFct)("adfReadDataBlock : headerKey out of range"); if ( !isSectNumValid(vol,dBlock->nextData) ) (*adfEnv.wFct)("adfReadDataBlock : nextData out of range"); } return rc; }
/* * adfReadBitmap * */ RETCODE adfReadBitmap(struct Volume* vol, int32_t nBlock, struct bRootBlock* root) { int32_t mapSize, nSect; int32_t j, i; struct bBitmapExtBlock bmExt; mapSize = nBlock / (127*32); if ( (nBlock%(127*32))!=0 ) mapSize++; vol->bitmapSize = mapSize; vol->bitmapTable = (struct bBitmapBlock**) malloc(sizeof(struct bBitmapBlock*)*mapSize); if (!vol->bitmapTable) { (*adfEnv.eFct)("adfReadBitmap : malloc, vol->bitmapTable"); return RC_MALLOC; } vol->bitmapBlocks = (SECTNUM*) malloc(sizeof(SECTNUM)*mapSize); if (!vol->bitmapBlocks) { free(vol->bitmapTable); (*adfEnv.eFct)("adfReadBitmap : malloc, vol->bitmapBlocks"); return RC_MALLOC; } vol->bitmapBlocksChg = (BOOL*) malloc(sizeof(BOOL)*mapSize); if (!vol->bitmapBlocksChg) { free(vol->bitmapTable); free(vol->bitmapBlocks); (*adfEnv.eFct)("adfReadBitmap : malloc, vol->bitmapBlocks"); return RC_MALLOC; } for(i=0; i<mapSize; i++) { vol->bitmapBlocksChg[i] = FALSE; vol->bitmapTable[i] = (struct bBitmapBlock*)malloc(sizeof(struct bBitmapBlock)); if (!vol->bitmapTable[i]) { free(vol->bitmapBlocksChg); free(vol->bitmapBlocks); for(j=0; j<i; j++) free(vol->bitmapTable[j]); free(vol->bitmapTable); (*adfEnv.eFct)("adfReadBitmap : malloc, vol->bitmapBlocks"); return RC_MALLOC; } } j=0; i=0; /* bitmap pointers in rootblock : 0 <= i <BM_SIZE */ while(i<BM_SIZE && root->bmPages[i]!=0) { vol->bitmapBlocks[j] = nSect = root->bmPages[i]; if ( !isSectNumValid(vol,nSect) ) { (*adfEnv.wFct)("adfReadBitmap : sector out of range"); } if (adfReadBitmapBlock(vol, nSect, vol->bitmapTable[j])!=RC_OK) { adfFreeBitmap(vol); return RC_ERROR; } j++; i++; } nSect = root->bmExt; while(nSect!=0) { /* bitmap pointers in bitmapExtBlock, j <= mapSize */ if (adfReadBitmapExtBlock(vol, nSect, &bmExt)!=RC_OK) { adfFreeBitmap(vol); return RC_ERROR; } i=0; while(i<127 && j<mapSize) { nSect = bmExt.bmPages[i]; if ( !isSectNumValid(vol,nSect) ) (*adfEnv.wFct)("adfReadBitmap : sector out of range"); vol->bitmapBlocks[j] = nSect; if (adfReadBitmapBlock(vol, nSect, vol->bitmapTable[j])!=RC_OK) { adfFreeBitmap(vol); return RC_ERROR; } i++; j++; } nSect = bmExt.nextBlock; } return RC_OK; }