#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]; FS_DIR fs_dir; FS_DIR_ENTRY fs_dir_entry[MAX_DIR_ENTRY]; int dir_read_inodetype(int num,unsigned int *size,unsigned short *mode) { S_INODE inode; if(read_inode(num,&inode)!=0) return -1; *mode=inode.i_mode; *size=inode.i_size; return 0; } int dir_read(int num,char *name) { S_INODE inode; unsigned char *buf; unsigned int size; unsigned short mode; S_DIR s_dir; int i,a,poc,zac,l; if(read_inode(num,&inode)!=0) return -1; if(inode.i_mode==0) return 0; if(!inode.i_mode&EXT2_S_IFDIR) return 0; if(!strcmp(name,".")) return 0; buf=(unsigned char *)malloc(inode.i_size); if(read_blocks(inode.i_block,inode.i_size,buf)!=0){ free(buf); return -2; } fs_dir.num=0; fs_dir.inode=num; if(!strcmp(name,"..")){ l=strlen(fs_dir.name)-1; a=-1; for(i=l;i>=0;i--){ if(fs_dir.name[i]=='/'){ a=i; break; } } fs_dir.name[a+1]=0; } else{ l=strlen(fs_dir.name)-1; if(l>=0&&fs_dir.name[l]!='/') strcat(fs_dir.name,"/"); strcat(fs_dir.name,name); } strcpy(fs_dir.actual_name,name); zac=0;poc=0; while(1){ memcpy((unsigned char *)&s_dir,buf+zac,8); if(s_dir.inode==0) break; for(i=0;i<s_dir.name_len;i++) fs_dir_entry[fs_dir.num].name[i]=buf[zac+i+8]; fs_dir_entry[fs_dir.num].name[i]=0; fs_dir_entry[fs_dir.num].inode=s_dir.inode; fs_dir_entry[fs_dir.num].file_type=s_dir.file_type; if(dir_read_inodetype(s_dir.inode,&size,&mode)!=0) return -3; fs_dir_entry[fs_dir.num].size=size; fs_dir_entry[fs_dir.num].i_mode=mode; fs_dir.num++; if(fs_dir.num>=MAX_DIR_ENTRY) break; zac+=s_dir.rec_len; if(zac>=inode.i_size) break; } free(buf); return 0; } int function_cd(char *text) { int i,a; 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].i_mode&EXT2_S_IFDIR)) return -2; return dir_read(fs_dir_entry[a].inode,fs_dir_entry[a].name); } void function_ls(void) { int i,a; printf("Current directory: %s\n",fs_dir.name); for(i=0;i<fs_dir.num;i++){ a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IFDIR)){ printf("d"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IRUSR)){ printf("r"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IWUSR)){ printf("w"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_ISUID)){ printf("S"); a=1; } if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IXUSR)){ printf("x"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IRGRP)){ printf("r"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IWGRP)){ printf("w"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_ISGID)){ printf("s"); a=1; } if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IXGRP)){ printf("x"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IROTH)){ printf("r"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IWOTH)){ printf("w"); a=1; } if(a==0) printf("-"); a=0; if(a==0&&(fs_dir_entry[i].i_mode&EXT2_S_IXOTH)){ printf("x"); a=1; } if(a==0) printf("-"); printf("%10d %s\n",fs_dir_entry[i].size,fs_dir_entry[i].name); } }