* adfReadBitmap * */
| 96 | * |
| 97 | */ |
| 98 | RETCODE adfReadBitmap(struct Volume* vol, int32_t nBlock, struct bRootBlock* root) |
| 99 | { |
| 100 | int32_t mapSize, nSect; |
| 101 | int32_t j, i; |
| 102 | struct bBitmapExtBlock bmExt; |
| 103 | |
| 104 | mapSize = nBlock / (127*32); |
| 105 | if ( (nBlock%(127*32))!=0 ) |
| 106 | mapSize++; |
| 107 | vol->bitmapSize = mapSize; |
| 108 | |
| 109 | vol->bitmapTable = (struct bBitmapBlock**) malloc(sizeof(struct bBitmapBlock*)*mapSize); |
| 110 | if (!vol->bitmapTable) { |
| 111 | (*adfEnv.eFct)("adfReadBitmap : malloc, vol->bitmapTable"); |
| 112 | return RC_MALLOC; |
| 113 | } |
| 114 | vol->bitmapBlocks = (SECTNUM*) malloc(sizeof(SECTNUM)*mapSize); |
| 115 | if (!vol->bitmapBlocks) { |
| 116 | free(vol->bitmapTable); |
| 117 | (*adfEnv.eFct)("adfReadBitmap : malloc, vol->bitmapBlocks"); |
| 118 | return RC_MALLOC; |
| 119 | } |
| 120 | vol->bitmapBlocksChg = (BOOL*) malloc(sizeof(BOOL)*mapSize); |
| 121 | if (!vol->bitmapBlocksChg) { |
| 122 | free(vol->bitmapTable); free(vol->bitmapBlocks); |
| 123 | (*adfEnv.eFct)("adfReadBitmap : malloc, vol->bitmapBlocks"); |
| 124 | return RC_MALLOC; |
| 125 | } |
| 126 | for(i=0; i<mapSize; i++) { |
| 127 | vol->bitmapBlocksChg[i] = FALSE; |
| 128 | |
| 129 | vol->bitmapTable[i] = (struct bBitmapBlock*)malloc(sizeof(struct bBitmapBlock)); |
| 130 | if (!vol->bitmapTable[i]) { |
| 131 | free(vol->bitmapBlocksChg); free(vol->bitmapBlocks); |
| 132 | for(j=0; j<i; j++) |
| 133 | free(vol->bitmapTable[j]); |
| 134 | free(vol->bitmapTable); |
| 135 | (*adfEnv.eFct)("adfReadBitmap : malloc, vol->bitmapBlocks"); |
| 136 | return RC_MALLOC; |
| 137 | } |
| 138 | } |
| 139 | |
| 140 | j=0; i=0; |
| 141 | /* bitmap pointers in rootblock : 0 <= i <BM_SIZE */ |
| 142 | while(i<BM_SIZE && root->bmPages[i]!=0) { |
| 143 | vol->bitmapBlocks[j] = nSect = root->bmPages[i]; |
| 144 | if ( !isSectNumValid(vol,nSect) ) { |
| 145 | (*adfEnv.wFct)("adfReadBitmap : sector out of range"); |
| 146 | } |
| 147 | |
| 148 | if (adfReadBitmapBlock(vol, nSect, vol->bitmapTable[j])!=RC_OK) { |
| 149 | adfFreeBitmap(vol); |
| 150 | return RC_ERROR; |
| 151 | } |
| 152 | j++; i++; |
| 153 | } |
| 154 | nSect = root->bmExt; |
| 155 | while(nSect!=0) { |
no test coverage detected