File: dir.c | Size: 3,739 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];
 
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);
  }
}