File: check.c | Size: 4,108 bytes | Download file | Back to directory listing | BWPOW's homepage
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
#include "ext2sim.h"
 
extern S_SUPERBLOCK superblock;
extern FS_INFO info;
extern S_GROUP_DESCRIPTOR group_desc[MAX_GROUPS];
extern char *block_bitmap;
extern char *inode_bitmap;
 
int check(void)
{
  int i,a,r,j;
  int free_block_count;
  int free_inodes_count;
  if(superblock.s_inodes_count<1){
    printf("Check: s_inodes_count is too small!\n");
    return -1;
  }
  if(superblock.s_block_count<1){
    printf("Check: s_block_count is too small!\n");
    return -1;
  }
  if(superblock.s_r_blocks_count>superblock.s_block_count){
    printf("Check: s_r_blocks_count is to much!\n");
    return -1;
  }
  if(superblock.s_free_blocks_count>superblock.s_block_count){
    printf("Check: s_free_blocks_count is bigger than s_block_count!\n");
    return -1;
  }
  if(superblock.s_free_inodes_count>superblock.s_inodes_count){
    printf("Check: s_free_blocks_count is bigger than s_block_count!\n");
    return -1;
  }
  if(superblock.s_log_block_size==0&&superblock.s_first_data_block!=1){
    printf("Check: s_first_data_block is incorrect!\n");
    return -1;
  }
  if(superblock.s_log_block_size!=0&&superblock.s_first_data_block!=0){
    printf("Check: s_first_data_block is incorrect!\n");
    return -1;
  }
  if(superblock.s_log_block_size>4){
    printf("Check: s_log_block_size is too big!\n");
    return -1;
  }
  if(superblock.s_magic!=0xEF53){
    printf("Check: incorrect s_magic value!\n");
    return -1;
  }
  if(superblock.s_inode_size!=128){
    printf("Check: s_inode_size should be 128\n");
    return -1;
  }
  for(i=0;i<16;i++)
    if(superblock.s_volume_name[i]==0) break;
  if(i==16){
    printf("Check: bad s_volume_name!\n");
    return -1;
  }
 
  free_block_count=superblock.s_free_blocks_count;
  free_inodes_count=superblock.s_free_inodes_count;
 
  a=superblock.s_first_data_block;   //zac. 1. grupy
  for(i=0;i<info.group_count;i++){
    a=superblock.s_blocks_per_group*i+superblock.s_first_data_block;
    r=group_desc[i].bg_block_bitmap;    //zac. block bitmapu danej grupy
 
//    printf("Groupa %d : bg_inode_table = %d\n",i,group_desc[i].bg_inode_table);
//    printf("Groupa %d : start = %d\n",i,a);
 
    if(r<a){
      printf("Check: Group %d has bad bg_block_bitmap address! %d,%d\n",i,r,a);
      return -1;
    }
    a=r+1;
 
    r=group_desc[i].bg_inode_bitmap;
    if(r!=a){
      printf("Check: Group %d has bad bg_inode_bitmap address!\n",i);
      return -1;
    }
    a=r+1;
 
    r=group_desc[i].bg_inode_table;
    if(r<a){
      printf("Check: Group %d has bad bg_inode_table address!\n",i);
      return -1;
    }
 
    free_block_count-=group_desc[i].bg_free_block_count;
    if(free_block_count<0){
      printf("Check: Group %d has bad bg_free_block_count!\n",i);
      return -1;
    }
 
    free_inodes_count-=group_desc[i].bg_free_inodes_count;
    if(free_inodes_count<0){
      printf("Check: Group %d has bad bg_free_inodes_count!\n",i);
      return -1;
    }
 
    read_bitmaps(i);    //block bmp vs. gr. desc.
    r=0;
    for(j=0;j<superblock.s_blocks_per_group;j++){
      if(block_bitmap[j]==0) r++;
    }
    if(r!=group_desc[i].bg_free_block_count){
      printf("Check: Group %d has wrong bg_free_block_count in association with block_bitmap %d!=%d !\n",i,r,group_desc[i].bg_free_block_count);
      return -1;
    }
 
    r=0;
    for(j=0;j<superblock.s_inodes_per_group;j++){
      if(inode_bitmap[j]==0) r++;
    }
    if(r!=group_desc[i].bg_free_inodes_count){
      printf("Check: Group %d has wrong bg_free_inodes_count in association with inode_bitmap!\n",i);
      return -1;
    }
 
  }
 
  if(free_block_count!=0){
    printf("Check: Free blocks count from superblock and groups differs.\n");
    return -1;
  }
  if(free_inodes_count!=0){
    printf("Check: Free inodes count from superblock and groups differs.\n");
    return -1;
  }
 
 
  printf("Check: Everything seems to be OK.\n");
  return 0;
}