int ext4fs_open(struct ext2_data *data, const char *filename, struct ext2fs_node **inode) { struct ext2fs_node *fdiro = NULL; int status, ret; int type; status = ext4fs_find_file(filename, &data->diropen, &fdiro, &type); if (status) goto fail; if (type != FILETYPE_REG) return -EINVAL; if (!fdiro->inode_read) { ret = ext4fs_read_inode(fdiro->data, fdiro->ino, &fdiro->inode); if (ret) goto fail; } *inode = fdiro; return 0; fail: ext4fs_free_node(fdiro, &data->diropen); return -ENOENT; }
static DIR *ext_opendir(struct device_d *dev, const char *pathname) { struct ext_filesystem *fs = dev->priv; struct ext4fs_dir *ext4_dir; int type, ret; ext4_dir = xzalloc(sizeof(*ext4_dir)); ret = ext4fs_find_file(pathname, &fs->data->diropen, &ext4_dir->dirnode, &type); if (ret) { free(ext4_dir); return NULL; } if (type != FILETYPE_DIRECTORY) return NULL; ext4_dir->dir.priv = ext4_dir; ret = ext4fs_read_inode(ext4_dir->dirnode->data, ext4_dir->dirnode->ino, &ext4_dir->dirnode->inode); if (ret) { ext4fs_free_node(ext4_dir->dirnode, &fs->data->diropen); free(ext4_dir); return NULL; } return &ext4_dir->dir; }
static int ext_readlink(struct device_d *dev, const char *pathname, char *buf, size_t bufsiz) { struct ext_filesystem *fs = dev->priv; struct ext2fs_node *node; char *symlink; int ret, len, type; ret = ext4fs_find_file(pathname, &fs->data->diropen, &node, &type); if (ret) return ret; if (type != FILETYPE_SYMLINK) return -EINVAL; symlink = ext4fs_read_symlink(node); if (!symlink) return -ENOENT; len = min(bufsiz, strlen(symlink)); memcpy(buf, symlink, len); free(symlink); return 0; }
int ext4fs_open(const char *filename) { struct ext2fs_node *fdiro = NULL; int status; int len; if (ext4fs_root == NULL) return -1; ext4fs_file = NULL; status = ext4fs_find_file(filename, &ext4fs_root->diropen, &fdiro, FILETYPE_REG); if (status == 0) goto fail; if (!fdiro->inode_read) { status = ext4fs_read_inode(fdiro->data, fdiro->ino, &fdiro->inode); if (status == 0) goto fail; } len = __le32_to_cpu(fdiro->inode.size); ext4fs_file = fdiro; return len; fail: ext4fs_free_node(fdiro, &ext4fs_root->diropen); return -1; }
static int ext_stat(struct device_d *dev, const char *filename, struct stat *s) { struct ext_filesystem *fs = dev->priv; struct ext2fs_node *node; int status, ret; status = ext4fs_find_file(filename, &fs->data->diropen, &node, NULL); if (status) return -ENOENT; ret = ext4fs_read_inode(node->data, node->ino, &node->inode); if (ret) return ret; s->st_size = __le32_to_cpu(node->inode.size); s->st_mode = __le16_to_cpu(node->inode.mode); ext4fs_free_node(node, &fs->data->diropen); return 0; }