File: bitmap.c | Size: 2,686 bytes | Download file | Back to directory listing | BWPOW's homepage
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ext2sim.h"
 
extern S_SUPERBLOCK superblock;
extern FS_INFO info;
extern S_GROUP_DESCRIPTOR group_desc[MAX_GROUPS];
 
char *block_bitmap;
char *inode_bitmap;
char bitmaps_initialised;
 
int initialise_bitmaps(void)
{
  if(bitmaps_initialised) deinitialise_bitmaps();
  block_bitmap=(char *)malloc(superblock.s_blocks_per_group);
  inode_bitmap=(char *)malloc(superblock.s_inodes_per_group);
  bitmaps_initialised=1;
  clear_bitmaps();
  return 0;
}
 
void deinitialise_bitmaps(void)
{
  if(!bitmaps_initialised) return;
  free(block_bitmap);
  free(inode_bitmap);
  bitmaps_initialised=0;
}
 
void clear_bitmaps(void)
{
  if(!bitmaps_initialised) return;
  memset(block_bitmap,0,superblock.s_blocks_per_group);
  memset(inode_bitmap,0,superblock.s_inodes_per_group);
}
 
int write_bitmaps(int num)
{
  unsigned char *buf;
  int i,r;
 
  buf=(unsigned char *)malloc(info.block_size);
 
  memset(buf,0,info.block_size);
 
  for(i=0;i<superblock.s_inodes_per_group;i++){
    if((i>>3)>=info.block_size){
      free(buf);
      return -1;
    }
    buf[i>>3]+=(inode_bitmap[i]<<(i&7));
    r=(i>>3)+1;
  }
 
  r=write_block(group_desc[num].bg_inode_bitmap,r,buf);
  if(r!=0){
    free(buf);
    return r;
  }
 
  memset(buf,0,info.block_size);
 
  for(i=0;i<superblock.s_blocks_per_group;i++){
    if((i>>3)>=info.block_size){
      free(buf);
      return -1;
    }
    buf[i>>3]+=(block_bitmap[i]<<(i&7));
    if(block_bitmap[i]!=0) printf("ale je %d = %d, %d\n",i,buf[i>>3],block_bitmap[i]);
    r=(i>>3)+1;
  }
 
  r=write_block(group_desc[num].bg_block_bitmap,r,buf);
  if(r!=0){
    free(buf);
    return r;
  }
 
  free(buf);
  return 0;
}
 
int read_bitmaps(int num)
{
  unsigned char *buf;
  int i,r;
 
  buf=(unsigned char *)malloc(info.block_size);
 
  memset(buf,0,info.block_size);
 
  r=read_block(group_desc[num].bg_inode_bitmap,info.block_size,buf);
  if(r!=0){
    free(buf);
    return r;
  }
 
  for(i=0;i<superblock.s_inodes_per_group;i++){
    if((i>>3)>=info.block_size){
      free(buf);
      return -1;
    }
    inode_bitmap[i]=!(!(buf[i>>3]&(1<<(i&7))));
  }
 
  memset(buf,0,info.block_size);
 
  r=read_block(group_desc[num].bg_block_bitmap,info.block_size,buf);
  if(r!=0){
    free(buf);
    return r;
  }
 
  for(i=0;i<superblock.s_blocks_per_group;i++){
    if((i>>3)>=info.block_size){
      free(buf);
      return -1;
    }
    block_bitmap[i]=!(!(buf[i>>3]&(1<<(i&7))));
//    if(block_bitmap[i]!=0) printf("%d: zle je %d\n",num,buf[i>>3]);
  }
 
  free(buf);
  return 0;
}