/* * adfFileSeek * */ void adfFileSeek(struct File *file, uint32_t pos) { SECTNUM extBlock, nSect; uint32_t nPos; int i; nPos = min(pos, file->fileHdr->byteSize); file->pos = nPos; extBlock = adfPos2DataBlock(nPos, file->volume->datablockSize, &(file->posInExtBlk), &(file->posInDataBlk), &(file->curDataPtr) ); if (extBlock==-1) { adfReadDataBlock(file->volume, file->fileHdr->dataBlocks[MAX_DATABLK-1-file->curDataPtr], file->currentData); } else { nSect = file->fileHdr->extension; if(!file->currentExt) { file->currentExt=(struct bFileExtBlock*)calloc(1,sizeof(struct bFileExtBlock)); if (!file->currentExt) (*adfEnv.eFct)("adfReadNextFileBlock : malloc"); } i = 0; while( i<extBlock && nSect!=0 ) { adfReadFileExtBlock(file->volume, nSect, file->currentExt ); nSect = file->currentExt->extension; } if (i!=extBlock) (*adfEnv.wFct)("error"); adfReadDataBlock(file->volume, file->currentExt->dataBlocks[file->posInExtBlk], file->currentData); } }
/* * adfCheckFile * */ RETCODE adfCheckFile(struct Volume* vol, SECTNUM nSect, struct bFileHeaderBlock* file, int level) { struct bFileExtBlock extBlock; struct bOFSDataBlock dataBlock; struct FileBlocks fileBlocks; int n; adfGetFileBlocks(vol,file,&fileBlocks); //printf("data %ld ext %ld\n",fileBlocks.nbData,fileBlocks.nbExtens); if (isOFS(vol->dosType)) { /* checks OFS datablocks */ for(n=0; n<fileBlocks.nbData; n++) { //printf("%ld\n",fileBlocks.data[n]); adfReadDataBlock(vol,fileBlocks.data[n],&dataBlock); if (dataBlock.headerKey!=fileBlocks.header) (*adfEnv.wFct)("adfCheckFile : headerKey incorrect"); if (dataBlock.seqNum!=n+1) (*adfEnv.wFct)("adfCheckFile : seqNum incorrect"); if (n<fileBlocks.nbData-1) { if (dataBlock.nextData!=fileBlocks.data[n+1]) (*adfEnv.wFct)("adfCheckFile : nextData incorrect"); if (dataBlock.dataSize!=vol->datablockSize) (*adfEnv.wFct)("adfCheckFile : dataSize incorrect"); } else { /* last datablock */ if (dataBlock.nextData!=0) (*adfEnv.wFct)("adfCheckFile : nextData incorrect"); } } } for(n=0; n<fileBlocks.nbExtens; n++) { adfReadFileExtBlock(vol,fileBlocks.extens[n],&extBlock); if (extBlock.parent!=file->headerKey) (*adfEnv.wFct)("adfCheckFile : extBlock parent incorrect"); if (n<fileBlocks.nbExtens-1) { if (extBlock.extension!=fileBlocks.extens[n+1]) (*adfEnv.wFct)("adfCheckFile : nextData incorrect"); } else if (extBlock.extension!=0) (*adfEnv.wFct)("adfCheckFile : nextData incorrect"); } free(fileBlocks.data); free(fileBlocks.extens); return RC_OK; }
/* * adfReadNextFileBlock * */ RETCODE adfReadNextFileBlock(struct File* file) { SECTNUM nSect; struct bOFSDataBlock *data; RETCODE rc = RC_OK; data =(struct bOFSDataBlock *) file->currentData; if (file->nDataBlock==0) { nSect = file->fileHdr->firstData; } else if (isOFS(file->volume->dosType)) { nSect = data->nextData; } else { if (file->nDataBlock<MAX_DATABLK) nSect = file->fileHdr->dataBlocks[MAX_DATABLK-1-file->nDataBlock]; else { if (file->nDataBlock==MAX_DATABLK) { file->currentExt=(struct bFileExtBlock*)calloc(1,sizeof(struct bFileExtBlock)); if (!file->currentExt) (*adfEnv.eFct)("adfReadNextFileBlock : malloc"); adfReadFileExtBlock(file->volume, file->fileHdr->extension, file->currentExt); file->posInExtBlk = 0; } else if (file->posInExtBlk==MAX_DATABLK) { adfReadFileExtBlock(file->volume, file->currentExt->extension, file->currentExt); file->posInExtBlk = 0; } nSect = file->currentExt->dataBlocks[MAX_DATABLK-1-file->posInExtBlk]; file->posInExtBlk++; } } adfReadDataBlock(file->volume,nSect,file->currentData); if (isOFS(file->volume->dosType) && data->seqNum!=file->nDataBlock+1) (*adfEnv.wFct)("adfReadNextFileBlock : seqnum incorrect"); file->nDataBlock++; return rc; }