Import backup from 2005-01-14

This commit is contained in:
josh committed 2017-07-25 22:23:49 -04:00
1 parent 05183a3949
commit ba5906c7a3
6 files changed
+104 -25

No files matched your search

+43 -19
View File
@@ -63,29 +63,35 @@ int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat)
u32_t inode_number = ext2_get_inode_number(mount, file);
if (!inode_number)
return -1;
ext2_inode_t inode = ext2_get_inode(mount, inode_number);
ext2_inode_t *inode = New(ext2_inode_t);
if ( ext2_read_inode(mount, inode_number, inode) )
{
kfree(inode);
return -2;
}
stat->dev = 0;
switch(inode.i_mode & EXT2_I_MODE_TYPE_MASK)
switch(inode->i_mode & EXT2_I_MODE_TYPE_MASK)
{
case EXT2_I_MODE_FIFO: stat->type = VFS_FT_FIFO; break;
case EXT2_I_MODE_CHAR: stat->type = VFS_FT_CHAR; stat->dev = inode.i_block[0]; break;
case EXT2_I_MODE_CHAR: stat->type = VFS_FT_CHAR; stat->dev = inode->i_block[0]; break;
case EXT2_I_MODE_DIR: stat->type = VFS_FT_DIR; break;
case EXT2_I_MODE_BLOCK: stat->type = VFS_FT_BLOCK; stat->dev = inode.i_block[0]; break;
case EXT2_I_MODE_BLOCK: stat->type = VFS_FT_BLOCK; stat->dev = inode->i_block[0]; break;
case EXT2_I_MODE_FILE: stat->type = VFS_FT_FILE; break;
case EXT2_I_MODE_SYM: stat->type = VFS_FT_SYMLINK; break;
case EXT2_I_MODE_SOCK: stat->type = VFS_FT_SOCK; break;
default: stat->type = VFS_FT_UNKNOWN; break;
}
stat->size = inode.i_size;
stat->size = inode->i_size;
stat->inode = inode_number;
stat->permissions = inode.i_mode & EXT2_I_MODE_ATTR_MASK;
stat->uid = inode.i_uid;
stat->gid = inode.i_gid;
stat->atime = inode.i_atime;
stat->mtime = inode.i_mtime;
stat->ctime = inode.i_ctime;
stat->links = inode.i_links_count;
stat->permissions = inode->i_mode & EXT2_I_MODE_ATTR_MASK;
stat->uid = inode->i_uid;
stat->gid = inode->i_gid;
stat->atime = inode->i_atime;
stat->mtime = inode->i_mtime;
stat->ctime = inode->i_ctime;
stat->links = inode->i_links_count;
kfree(inode);
return 0;
}
@@ -195,11 +201,12 @@ int ext2_close_dir(vfs_mount_t *mount, ext2_open_dir_t *open_dir)
// open an inode for reading
ext2_open_inode_t *ext2_open_inode(vfs_mount_t *mount, u32_t inode_number)
{
if (ext2_inode_status(mount, inode_number) != 1)
return NULL;
ext2_inode_t inode = ext2_get_inode(mount, inode_number);
ext2_open_inode_t *open_inode = New(ext2_open_inode_t);
open_inode->inode = inode;
if ( ext2_read_inode(mount, inode_number, &(open_inode->inode)) )
{
kfree(open_inode);
return NULL;
}
open_inode->block = 0;
open_inode->block_pointers = NULL;
open_inode->block_pointers_start = 0;
@@ -342,8 +349,10 @@ u32_t ext2_block_number(vfs_mount_t *mount, ext2_open_inode_t *open_inode)
// read the inode structure from the device and return it
ext2_inode_t ext2_get_inode(vfs_mount_t *mount, u32_t inode)
int ext2_read_inode(vfs_mount_t *mount, u32_t inode, ext2_inode_t *dat)
{
if (ext2_inode_status(mount, inode) != 1)
return -1; // free or invalid inode number
ext2_super_block_t *super = mount->super;
inode--; // turn inode into a 0-based index
u32_t group = inode / super->s_inodes_per_group;
@@ -352,9 +361,9 @@ ext2_inode_t ext2_get_inode(vfs_mount_t *mount, u32_t inode)
(10 + super->s_log_block_size)) + (index << 7);
void *block = kmalloc(512);
block_read(mount->major, mount->minor, inodeAddr >> 9, 1, block);
ext2_inode_t in = *(ext2_inode_t *)(block + (inodeAddr & 0x1FF));
memcpy(dat, (block + (inodeAddr & 0x1FF)), sizeof(ext2_inode_t));
kfree(block);
return in;
return 0;
}
// read the group descriptor structure from the device and return it
@@ -370,6 +379,18 @@ ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group)
}
// TODO: finish allocating an inode
u32_t ext2_alloc_inode(vfs_mount_t *mount)
{
ext2_super_block_t *super = mount->super;
if (!super->s_free_inodes_count)
return 0; // no free inodes
}
/***************** VFS INTERFACE FUNCTIONS *******************/
// VFS interface function to open a directory
int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_file_t *dir)
{
@@ -402,16 +423,19 @@ int ext2__close_dir(vfs_mount_t *mount, vfs_open_file_t *dir)
}
// VFS interface function to open a file for reading a byte at a time
int ext2__open_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file)
{
return 0;
}
// VFS interface function to read a byte from an open file
int ext2__read_file(vfs_mount_t *mount, vfs_open_file_t *open_file)
{
return 0;
}
// VFS interface function to close a byte-file
int ext2__close_file(vfs_mount_t *mount, vfs_open_file_t *open_file)
{
return 0;
+3 -1
View File
@@ -184,7 +184,7 @@ static inline u32_t ext2_FSToDiskBlock(u32_t block, ext2_super_block_t *super)
int ext2_init(int fsID);
void *ext2_mount_super(major_t major, minor_t minor);
int ext2_umount_super(vfs_mount_t *mount);
ext2_inode_t ext2_get_inode(vfs_mount_t *mount, u32_t inode);
int ext2_read_inode(vfs_mount_t *mount, u32_t inode, ext2_inode_t *dat);
ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group);
int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat);
ext2_open_inode_t *ext2_open_inode(vfs_mount_t *mount, u32_t inode_number);
@@ -195,6 +195,8 @@ u32_t ext2_get_inode_number(vfs_mount_t *mount, char *file);
int ext2_inode_seek(vfs_mount_t *mount, ext2_open_inode_t *open_inode, u32_t block_number);
int ext2_inode_status(vfs_mount_t *mount, u32_t inode_number);
int ext2_block_status(vfs_mount_t *mount, u32_t block_number);
u32_t ext2_alloc_inode(vfs_mount_t *mount);
ext2_open_dir_t *ext2_open_dir(vfs_mount_t *mount, u32_t inode_number);
int ext2_dir_read_entry(vfs_mount_t *mount, ext2_open_dir_t *open_dir, ext2_dir_entry_t *dentry);