/* * * adfUnMount * * free bitmap structures * free current dir */ void adfUnMount(struct Volume *vol) { if (!vol) { (*adfEnv.eFct)("adfUnMount : vol is null"); return; } adfFreeBitmap(vol); vol->mounted = FALSE; }
/* * 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; }
/* * adfCreateVol * * */ struct Volume* adfCreateVol( struct Device* dev, int32_t start, int32_t len, char* volName, int volType,struct DateTime * voldate ) { struct bBootBlock boot; struct bRootBlock root; /* struct bDirCacheBlock dirc;*/ SECTNUM blkList[2]; struct Volume* vol; int nlen; if (adfEnv.useProgressBar) (*adfEnv.progressBar)(0); vol=(struct Volume*)calloc(1,sizeof(struct Volume)); if (!vol) { (*adfEnv.eFct)("adfCreateVol : malloc vol"); return NULL; } vol->dev = dev; vol->firstBlock = (dev->heads * dev->sectors)*start; vol->lastBlock = (vol->firstBlock + (dev->heads * dev->sectors)*len)-1; vol->rootBlock = (vol->lastBlock - vol->firstBlock+1)/2; /*printf("first=%ld last=%ld root=%ld\n",vol->firstBlock, vol->lastBlock, vol->rootBlock); */ vol->curDirPtr = vol->rootBlock; vol->readOnly = dev->readOnly; vol->mounted = TRUE; nlen = min( MAXNAMELEN, strlen(volName) ); vol->volName = (char*)calloc(1,nlen+1); if (!vol->volName) { (*adfEnv.eFct)("adfCreateVol : malloc"); free(vol); return NULL; } memcpy(vol->volName, volName, nlen); vol->volName[nlen]='\0'; if (adfEnv.useProgressBar) (*adfEnv.progressBar)(25); memset(&boot, 0, 1024); boot.dosType[3] = volType; /*printf("first=%d last=%d\n", vol->firstBlock, vol->lastBlock); printf("name=%s root=%d\n", vol->volName, vol->rootBlock); */ if (adfWriteBootBlock(vol, &boot)!=RC_OK) { free(vol->volName); free(vol); return NULL; } if (adfEnv.useProgressBar) (*adfEnv.progressBar)(20); if (adfCreateBitmap( vol )!=RC_OK) { free(vol->volName); free(vol); return NULL; } if (adfEnv.useProgressBar) (*adfEnv.progressBar)(40); /*for(i=0; i<127; i++) printf("%3d %x, ",i,vol->bitmapTable[0]->map[i]); */ if ( isDIRCACHE(volType) ) adfGetFreeBlocks( vol, 2, blkList ); else adfGetFreeBlocks( vol, 1, blkList ); /*printf("[0]=%d [1]=%d\n",blkList[0],blkList[1]);*/ memset(&root, 0, LOGICAL_BLOCK_SIZE); if (strlen(volName)>MAXNAMELEN) volName[MAXNAMELEN]='\0'; root.nameLen = (char)strlen(volName); memcpy(root.diskName,volName,root.nameLen); if(voldate) { adfTime2AmigaTime(*voldate,&(root.coDays),&(root.coMins),&(root.coTicks)); } else { adfTime2AmigaTime(adfGiveCurrentTime(),&(root.coDays),&(root.coMins),&(root.coTicks)); } /* dircache block */ if ( isDIRCACHE(volType) ) { root.extension = 0L; root.secType = ST_ROOT; /* needed by adfCreateEmptyCache() */ adfCreateEmptyCache(vol, (struct bEntryBlock*)&root, blkList[1]); } if (adfEnv.useProgressBar) (*adfEnv.progressBar)(60); if (adfWriteRootBlock(vol, blkList[0], &root)!=RC_OK) { free(vol->volName); free(vol); return NULL; } /* fills root->bmPages[] and writes filled bitmapExtBlocks */ if (adfWriteNewBitmap(vol)!=RC_OK) return NULL; if (adfEnv.useProgressBar) (*adfEnv.progressBar)(80); if (adfUpdateBitmap(vol)!=RC_OK) return NULL; if (adfEnv.useProgressBar) (*adfEnv.progressBar)(100); /*printf("free blocks %ld\n",adfCountFreeBlocks(vol));*/ /* will be managed by adfMount() later */ adfFreeBitmap(vol); vol->mounted = FALSE; return(vol); }