#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); }