/* * 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); }
/* * adfCountFreeBlocks * */ int32_t adfCountFreeBlocks(struct Volume* vol) { int32_t freeBlocks; int j; freeBlocks = 0L; for(j=vol->firstBlock+2; j<=(vol->lastBlock - vol->firstBlock); j++) if ( adfIsBlockFree(vol,j) ) freeBlocks++; return freeBlocks; }
/* * 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; }
/* * adfCheckParent * */ RETCODE adfCheckParent(struct Volume* vol, SECTNUM pSect) { struct GenBlock block; if (adfIsBlockFree(vol, pSect)) { (*adfEnv.wFct)("adfCheckParent : parent doesn't exists"); return RC_ERROR; } /* verify if parent is a DIR or ROOT */ adfReadGenBlock(vol, pSect, &block); if ( block.type!=T_HEADER || (block.secType!=ST_DIR && block.secType!=ST_ROOT) ) { (*adfEnv.wFct)("adfCheckParent : parent secType is incorrect"); return RC_ERROR; } return RC_OK; }
/* * adfGetDelEnt * */ struct List* adfGetDelEnt(struct Volume *vol) { struct GenBlock *block; long i; struct List *list, *head; BOOL delEnt; list = head = NULL; block = NULL; delEnt = TRUE; for(i=vol->firstBlock; i<=vol->lastBlock; i++) { if (adfIsBlockFree(vol, i)) { if (delEnt) { block = (struct GenBlock*)malloc(sizeof(struct GenBlock)); if (!block) return NULL; //printf("%p\n",block); } adfReadGenBlock(vol, i, block); delEnt = (block->type==T_HEADER && (block->secType==ST_DIR || block->secType==ST_FILE) ); if (delEnt) { if (head==NULL) list = head = newCell(NULL, (void*)block); else list = newCell(list, (void*)block); } } } if (block!=NULL && list!=NULL && block!=list->content) { free(block); // printf("%p\n",block); } return head; }