Implement support for block and char dev nodes, fifos and sockets.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
This commit is contained in:
Jo-Philipp Wich 2015-04-04 23:01:57 +02:00
parent 62768dbac9
commit c657f39e16
3 changed files with 40 additions and 1 deletions

View File

@ -244,6 +244,40 @@ u32 make_link(const char *link)
return inode_num;
}
/* Creates a special file on disk. Returns the inode number of the new file */
u32 make_special(const char *path)
{
struct ext4_inode *inode;
struct stat s;
u32 inode_num;
if (stat(path, &s)) {
error("failed to stat file\n");
return EXT4_ALLOCATE_FAILED;
}
inode_num = allocate_inode(info);
if (inode_num == EXT4_ALLOCATE_FAILED) {
error("failed to allocate inode\n");
return EXT4_ALLOCATE_FAILED;
}
inode = get_inode(inode_num);
if (inode == NULL) {
error("failed to get inode %u", inode_num);
return EXT4_ALLOCATE_FAILED;
}
inode->i_mode = s.st_mode & S_IFMT;
inode->i_links_count = 1;
inode->i_flags |= aux_info.default_i_flags;
((u8 *)inode->i_block)[0] = major(s.st_rdev);
((u8 *)inode->i_block)[1] = minor(s.st_rdev);
return inode_num;
}
int inode_set_permissions(u32 inode_num, u16 mode, u16 uid, u16 gid, u32 mtime)
{
struct ext4_inode *inode = get_inode(inode_num);

View File

@ -37,6 +37,7 @@ u32 make_directory(u32 dir_inode_num, u32 entries, struct dentry *dentries,
u32 dirs);
u32 make_file(const char *filename, u64 len);
u32 make_link(const char *link);
u32 make_special(const char *path);
int inode_set_permissions(u32 inode_num, u16 mode, u16 uid, u16 gid, u32 mtime);
int inode_set_selinux(u32 inode_num, const char *secon);
int inode_set_capabilities(u32 inode_num, uint64_t capabilities);

View File

@ -44,7 +44,6 @@
/* TODO: Not implemented:
Allocating blocks in the same block group as the file inode
Hash or binary tree directories
Special files: sockets, devices, fifos
*/
static int filter_dot(const struct dirent *d)
@ -235,6 +234,11 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path
free(subdir_dir_path);
} else if (dentries[i].file_type == EXT4_FT_SYMLINK) {
entry_inode = make_link(dentries[i].link);
} else if (dentries[i].file_type == EXT4_FT_CHRDEV ||
dentries[i].file_type == EXT4_FT_BLKDEV ||
dentries[i].file_type == EXT4_FT_SOCK ||
dentries[i].file_type == EXT4_FT_FIFO) {
entry_inode = make_special(dentries[i].full_path);
} else {
error("unknown file type on %s", dentries[i].path);
entry_inode = 0;