/* * adfUndelFile * */ RETCODE adfUndelFile(struct Volume* vol, SECTNUM pSect, SECTNUM nSect, struct bFileHeaderBlock* entry) { long i; char name[MAXNAMELEN+1]; struct bEntryBlock parent; RETCODE rc; struct FileBlocks fileBlocks; /* check if the given parent sector pointer seems OK */ if ( (rc=adfCheckParent(vol,pSect)) != RC_OK) return rc; if (pSect!=entry->parent) { (*adfEnv.wFct)("adfUndelFile : the given parent sector isn't the entry parent"); return RC_ERROR; } adfGetFileBlocks(vol, entry, &fileBlocks); for(i=0; i<fileBlocks.nbData; i++) if ( !adfIsBlockFree(vol,fileBlocks.data[i]) ) return RC_ERROR; else adfSetBlockUsed(vol, fileBlocks.data[i]); for(i=0; i<fileBlocks.nbExtens; i++) if ( !adfIsBlockFree(vol,fileBlocks.extens[i]) ) return RC_ERROR; else adfSetBlockUsed(vol, fileBlocks.extens[i]); free(fileBlocks.data); free(fileBlocks.extens); if (adfReadEntryBlock(vol, pSect, &parent)!=RC_OK) return RC_ERROR; strncpy(name, entry->fileName, entry->nameLen); name[(int)entry->nameLen] = '\0'; /* insert the entry in the parent hashTable, with the headerKey sector pointer */ adfCreateEntry(vol, &parent, name, entry->headerKey); if (isDIRCACHE(vol->dosType)) adfAddInCache(vol, &parent, (struct bEntryBlock *)entry); adfUpdateBitmap(vol); return RC_OK; }
/* * adfGetFreeBlocks * */ BOOL adfGetFreeBlocks(struct Volume* vol, int nbSect, SECTNUM* sectList) { int i, j; BOOL diskFull; int32_t block = vol->rootBlock; i = 0; diskFull = FALSE; /*printf("lastblock=%ld\n",vol->lastBlock);*/ while( i<nbSect && !diskFull ) { if ( adfIsBlockFree(vol, block) ) { sectList[i] = block; i++; } /* if ( block==vol->lastBlock ) block = vol->firstBlock+2;*/ if ( (block+vol->firstBlock)==vol->lastBlock ) block = 2; else if (block==vol->rootBlock-1) diskFull = TRUE; else block++; } if (!diskFull) for(j=0; j<nbSect; j++) adfSetBlockUsed( vol, sectList[j] ); return (i==nbSect); }
/* * adfUndelDir * */ RETCODE adfUndelDir(struct Volume* vol, SECTNUM pSect, SECTNUM nSect, struct bDirBlock* entry) { RETCODE rc; struct bEntryBlock parent; char name[MAXNAMELEN+1]; /* check if the given parent sector pointer seems OK */ if ( (rc=adfCheckParent(vol,pSect)) != RC_OK) return rc; if (pSect!=entry->parent) { (*adfEnv.wFct)("adfUndelDir : the given parent sector isn't the entry parent"); return RC_ERROR; } if (!adfIsBlockFree(vol, entry->headerKey)) return RC_ERROR; if (isDIRCACHE(vol->dosType) && !adfIsBlockFree(vol,entry->extension)) return RC_ERROR; if (adfReadEntryBlock(vol, pSect, &parent)!=RC_OK) return RC_ERROR; strncpy(name, entry->dirName, entry->nameLen); name[(int)entry->nameLen] = '\0'; /* insert the entry in the parent hashTable, with the headerKey sector pointer */ adfSetBlockUsed(vol,entry->headerKey); adfCreateEntry(vol, &parent, name, entry->headerKey); if (isDIRCACHE(vol->dosType)) { adfAddInCache(vol, &parent, (struct bEntryBlock *)entry); adfSetBlockUsed(vol,entry->extension); } adfUpdateBitmap(vol); return RC_OK; }