Ejemplo n.º 1
0
/*
 * 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);
    }
}
Ejemplo n.º 2
0
/*
 * 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;
}
Ejemplo n.º 3
0
/*
 * 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;
}