File: cat.c | Size: 1,728 bytes | Download file | Back to directory listing | BWPOW's homepage
#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];
extern FS_DIR fs_dir;
extern FS_DIR_ENTRY fs_dir_entry[MAX_DIR_ENTRY];
 
int cat_block_stack(int deep,unsigned int num,int l,int *ll)
{
  int r,i,max;
  unsigned char *buf;
  unsigned int *buf2;
  buf=(unsigned char *)malloc(info.block_size);
  if(buf==0) return -1;
  (unsigned char *)buf2=buf;
 
  if(deep<0) deep=0;
  if(buf==0) return -2;
  if(deep<=0){
    if(l>info.block_size) r=info.block_size;
    else r=l;
    if(read_block(num,r,buf)!=0){
      free(buf);
      return -2;
    }
    for(i=0;i<r;i++) printf("%c",buf[i]);
    l-=info.block_size;
  }
  else{
    max=info.block_size>>2;
    if(read_block(num,info.block_size,buf)!=0){
      free(buf);
      return -3;
    }
    i=0;
    while(l>0){
      if(cat_block_stack(deep-1,buf2[i],l,&r)!=0){
        free(buf);
        return -4;
      }
      l=r;
      i++;
      if(i>=max) break;
    }
  }
  *ll=l;
  free(buf);
  return 0;
}
 
int cat_blocks(unsigned int i_block[15],int l)
{
  int i=0,r;
  while(l>0){
    if(cat_block_stack(i-11,i_block[i],l,&r)!=0) return -1;
    l=r;
    i++;
    if(i>14) break;
  }
  printf("\n");
  return 0;
}
int function_cat(char *text)
{
  int i,a;
  S_INODE inode;
 
  a=-1;
  for(i=0;i<fs_dir.num;i++){
    if(!strcmp(fs_dir_entry[i].name,text)){
      a=i;
      break;
    }
  }
  if(a<0) return -1;
  if(fs_dir_entry[a].file_type!=EXT2_FT_REG_FILE) return -2;
  if(read_inode(fs_dir_entry[a].inode,&inode)!=0) return -3;
 
  return cat_blocks(inode.i_block,inode.i_size);
}