如何从映射内存中读取ext2根目录?

时间:2012-05-15 17:30:55

标签: directory root ext2

我正在为我的大学制作一个远程文件系统服务器,我在阅读根目录时遇到了一些麻烦...这就是: 我已经阅读了根inode(inode 2)并且它具有一致的数据,我的意思是,例如,所有者用户Id字段设置为'1000'。然后我继续读取inode数据块的内容,但是当我尝试访问有问题的数据块时(在我的调试中,唯一一个在inode i_block数组中寻址的地址,240),所有字节都设置为'0 ”。谁能帮我这个?这非常重要。注意:我不能用映射内存做另一种方式,我不打开真正的磁盘,而是打开.disk linux文件。它是使用命令行

创建的

mkfs.ext2 -F -r 0 -b 1024 ext2.disk 30000

这是我的代码:

#include <linux/ext2_fs.h>

typedef struct s_inode *pinode;         /* Pointer to inode struct  */
typedef struct s_direct *pdir;          /* Pointer to direct struct */

int main(int argv, char *argc[]){
   int *data;
   pdir root = malloc(sizeof(struct s_direct));

   /* Code for mpping .disk file, fetching supernode, and other ext2 data */
   /* fsys is a global variable that holds general ext2 system data       */
   fsys->root           = get_inode(2);
   data                 = get_cont(fsys->root);
   root                 = (pdir)getblock(data[0]);

}

pinode get_inode(int idx){
    pinode inod;
    int grp, offs;

    grp =  (idx-1)/fsys->superblock->s_inodes_per_group;
    offs = (idx-1)%fsys->superblock->s_inodes_per_group;
    inod = (pinode)&fsys->diskmap[(fsys->group[grp]->itab)+offs*sizeof(struct s_inode)];

    return inod;
}

int *get_cont(pinode inod){
    int *cont; 
    int *idx;
    int i=0;
    int *block;

    idx  = malloc(sizeof(int)); 
    cont = malloc(sizeof(int));

    while(i < inod->i_blocks && i<13) {
            realloc(cont, i*sizeof(int));
            cont[i]=inod->i_block[i];
            i++;
    }

    if(i < inod->i_blocks){
        *idx=13;
        block=(int*)getblock(inod->i_block[*idx]);
        fetchcont(block, idx, cont, inod->i_blocks, 0);
    }
    if(i < inod->i_blocks){
        block=(int*)getblock(inod->i_block[*idx]);
        fetchcont(block, idx, cont, inod->i_blocks, 1);
    }
    if(i < inod->i_blocks){
        block=(int*)getblock(inod->i_block[*idx]);
        fetchcont(block, idx, cont, inod->i_blocks, 2);
    }

    return cont;

}

int fetchcont(int *block, int *idx, int *cont, int lim, int lvl){
    int i=0;

    if(lvl == 0){
        while((*idx) < lim && i<fsys->bsize){
            realloc(cont, (*idx)*sizeof(int));
            cont[*idx]=block[i];
            (*idx)++;
            i++;
        }
        if(i>=fsys->bsize){
            return 1;
        }else{
            return 0;
        }
    }else{
        lvl--;
        while(i<fsys->bsize){
            if(!fetchcont((int*)getblock(block[i]), idx, cont, lim, lvl)){
                return 0;
            }
            i++;
        }

    }
}

void *getblock(int idx){
    char *block;
    int grp, offs;

    grp   = (idx-1)/fsys->superblock->s_blocks_per_group;
    offs  = (idx-1)%fsys->superblock->s_blocks_per_group;
    block =  &fsys->diskmap[fsys->group[grp]->blocks+offs*fsys->bsize];

    return block; 
}

1 个答案:

答案 0 :(得分:1)

解决了这个问题。我假设块n是n数据块,但偏移量包括所有块。我已将getblock函数更改为

void *getblock(int idx){

    return &fsys->diskmap[fsys->bsize*idx];
}

并且工作了!