Beispiel #1
0
dentry_t* ext2_lookup(struct _fs_instance_t *instance, struct _dentry_t* dentry, const char * name) {
        int flags = 0; // XXX


        int inode = getinode_from_name((ext2_fs_instance_t*)instance, dentry->d_inode->i_ino, name);


        if (inode == -ENOENT && (flags & O_CREAT)) {

                //inode = ext2_mknod2((ext2_fs_instance_t*)instance, name, 00644 | 0x8000, 0); //FIXME!
        } else if (inode <= 0) {

                return NULL;
        } else if (flags & O_EXCL && flags & O_CREAT) {
                return NULL;
        }
       

        struct ext2_inode *einode = read_inode((ext2_fs_instance_t*)instance, inode);


        dentry_t *d =(dentry_t*) kmalloc(sizeof(dentry_t),0);
        char *n = strdup(name);
        d->d_name = (const char*)n;
        d->d_pdentry = dentry;
        d->d_inode = (inode_t*)kmalloc(sizeof(inode_t),0);
        ext2inode_2_inode(d->d_inode, instance, inode, einode);
        d->d_inode->i_count = 0;

        if (flags & O_TRUNC) {
                ext2_truncate(d->d_inode, 0);
        }
        return d;
}
Beispiel #2
0
dentry_t* ext2_lookup(struct _fs_instance_t *instance, struct _dentry_t* dentry, const char * name) {
	int flags = 0; // XXX

	int inode = getinode_from_name((ext2_fs_instance_t*)instance, dentry->d_inode->i_ino, name);
	if (inode == -ENOENT && (flags & O_CREAT)) {
		//inode = ext2_mknod2((ext2_fs_instance_t*)instance, name, 00644 | 0x8000, 0); //FIXME!
		// Plusieurs choses : getinode_from_name retourne ENOTDIR et pas ENOENT, 
		// flags vaut 0, et ce mknod est réalisé plus haut, peut-être qu'on devrait
		// supprimer ce cas tout simplement ?
	} else if (inode <= 0) {
		return NULL;
	} else if (flags & O_EXCL && flags & O_CREAT) {
		return NULL;
	}
	
	struct ext2_inode *einode = read_inode((ext2_fs_instance_t*)instance, inode);

	dentry_t *d = kmalloc(sizeof(dentry_t));
	char *n = strdup(name);
	d->d_name = (const char*)n;
	d->d_pdentry = dentry;
	d->d_inode = kmalloc(sizeof(inode_t));
	ext2inode_2_inode(d->d_inode, instance, inode, einode);
	d->d_inode->i_count = 0;

	if (flags & O_TRUNC) {
		ext2_truncate(d->d_inode, 0);
	}

	return d;
}