diff --git a/Makefile b/Makefile index feebdab..f29b99c 100644 --- a/Makefile +++ b/Makefile @@ -65,6 +65,7 @@ initrd: touch $(INITRD_MOUNT)/hi_there chmod 527 $(INITRD_MOUNT)/hi_there chown josh:users $(INITRD_MOUNT)/hi_there + mknod $(INITRD_MOUNT)/rd0 b 5 2 mkdir $(INITRD_MOUNT)/txt cp Makefile $(INITRD_MOUNT)/txt umount $(INITRD_MOUNT) diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c index e4e9aa3..18808fc 100644 --- a/kernel/fs/ext2.c +++ b/kernel/fs/ext2.c @@ -65,12 +65,13 @@ int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat) return -1; ext2_inode_t inode = ext2_get_inode(mount, inode_number); + stat->dev = 0; 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; 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; 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; @@ -85,7 +86,6 @@ int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat) stat->mtime = inode.i_mtime; stat->ctime = inode.i_ctime; stat->links = inode.i_links_count; - return 0; } diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h index bdbbcb0..fd6d715 100644 --- a/kernel/fs/vfs.h +++ b/kernel/fs/vfs.h @@ -80,6 +80,7 @@ typedef struct u32_t mtime; u32_t ctime; u16_t links; + u32_t dev; } vfs_stat_t; typedef struct diff --git a/kernel/kernel.c b/kernel/kernel.c index 1eafbc4..e81a6ab 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -147,7 +147,7 @@ void k_init() strcpy(fname, "/"); strcat(fname, dentry.name); vfs_stat(fname, &fstat); - putc(fstat.type == VFS_FT_DIR ? 'd' : '-'); + putc(fstat.type == VFS_FT_DIR ? 'd' : fstat.type == VFS_FT_CHAR ? 'c' : fstat.type == VFS_FT_BLOCK ? 'b' : '-'); putc(fstat.permissions & VFS_PERMS_UR ? 'r' : '-'); putc(fstat.permissions & VFS_PERMS_UW ? 'w' : '-'); putc(fstat.permissions & VFS_PERMS_UX ? 'x' : '-'); @@ -160,7 +160,10 @@ void k_init() putc(fstat.permissions & VFS_PERMS_OW ? 'w' : '-'); putc(fstat.permissions & VFS_PERMS_OX ? 'x' : '-'); - kprintf(" %d\t%d\t%d\t%d\t%s\n", fstat.links, fstat.uid, fstat.gid, fstat.size, dentry.name); + kprintf(" %d\t%d\t%d\t%d\t%s", fstat.links, fstat.uid, fstat.gid, fstat.size, dentry.name); + if (fstat.type == VFS_FT_CHAR || fstat.type == VFS_FT_BLOCK) + kprintf("\t(%d, %d)", fstat.dev >> 8, fstat.dev & 0xFF); + putc('\n'); } vfs_close_dir(root); }