From 50285aa33bb64bd2797aa443ad83040ab94db77b Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 1 Jan 2005 22:00:00 -0500 Subject: [PATCH] Import backup from 2005-01-01 --- Makefile | 4 +++- kernel/fs/ext2.c | 32 ++++++++++++++++++++++++++++++-- kernel/fs/ext2.h | 1 + kernel/fs/vfs.c | 37 ++++++++++++++++++++++++++++++++++++- kernel/fs/vfs.h | 19 +++++++++++++++++++ kernel/kernel.c | 39 ++++++++++++++++++++++++++++----------- 6 files changed, 117 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 073663f..feebdab 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,9 @@ initrd: mke2fs -Fv -m0 -r0 -i1024 $(INITRD) -mkdir $(INITRD_MOUNT) mount -t ext2 -o loop $(INITRD) $(INITRD_MOUNT) - touch $(INITRD_MOUNT)/hi\ there + touch $(INITRD_MOUNT)/hi_there + chmod 527 $(INITRD_MOUNT)/hi_there + chown josh:users $(INITRD_MOUNT)/hi_there 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 78ebea5..e4e9aa3 100644 --- a/kernel/fs/ext2.c +++ b/kernel/fs/ext2.c @@ -20,7 +20,7 @@ vfs_fs_t ext2_driver = {ext2_mount_super, ext2_umount_super, ext2_stat, ext2__open_dir, ext2__read_dir, ext2__close_dir, ext2__open_file, ext2__read_file, ext2__close_file, - ext2__open_block_file, ext2__read_block_file, ext2__close_block_file}; + ext2__open_block_file, ext2__read_block_file, ext2__block_file_seek, ext2__close_block_file}; // initialize the filesystem driver int ext2_init(int fsID) @@ -146,11 +146,17 @@ ext2_open_dir_t *ext2_open_dir(vfs_mount_t *mount, u32_t inode_number) { ext2_open_dir_t *open_dir = New(ext2_open_dir_t); ext2_open_inode_t *open_inode = ext2_open_inode(mount, inode_number); - if (!open_inode || ((open_inode->inode.i_mode & EXT2_I_MODE_TYPE_MASK) != EXT2_I_MODE_DIR)) + if (!open_inode) { kfree(open_dir); return NULL; } + if ((open_inode->inode.i_mode & EXT2_I_MODE_TYPE_MASK) != EXT2_I_MODE_DIR) + { + ext2_close_inode(mount, open_inode); + kfree(open_dir); + return NULL; + } open_dir->open_inode = open_inode; open_dir->position = 0; return open_dir; @@ -364,6 +370,7 @@ ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group) } +// VFS interface function to open a directory int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_file_t *dir) { u32_t dir_inode = ext2_get_inode_number(mount, file); @@ -376,6 +383,7 @@ int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_file_t *dir) return 0; } +// VFS interface function to read a directory entry from an open directory int ext2__read_dir(vfs_mount_t *mount, vfs_open_file_t *dir, vfs_dir_entry_t *dentry) { ext2_dir_entry_t t_dentry; @@ -387,6 +395,7 @@ int ext2__read_dir(vfs_mount_t *mount, vfs_open_file_t *dir, vfs_dir_entry_t *de return 0; } +// VFS interface function to close an open directory int ext2__close_dir(vfs_mount_t *mount, vfs_open_file_t *dir) { return ext2_close_dir(mount, dir->fs_data); @@ -395,17 +404,21 @@ int ext2__close_dir(vfs_mount_t *mount, vfs_open_file_t *dir) int ext2__open_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file) { + return 0; } int ext2__read_file(vfs_mount_t *mount, vfs_open_file_t *open_file) { + return 0; } int ext2__close_file(vfs_mount_t *mount, vfs_open_file_t *open_file) { + return 0; } +// VFS interface function to open a file for reading 512-byte blocks at a time int ext2__open_block_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file) { u32_t file_inode = ext2_get_inode_number(mount, file); @@ -414,6 +427,11 @@ int ext2__open_block_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_ ext2_open_inode_t *open_inode = ext2_open_inode(mount, file_inode); if (!open_inode) return -2; + if ((open_inode->inode.i_mode & EXT2_I_MODE_TYPE_MASK) != EXT2_I_MODE_FILE) + { + ext2_close_inode(mount, open_inode); + return -3; + } ext2__open_block_file_t *open_block_file = New(ext2__open_block_file_t); open_block_file->open_inode = open_inode; open_block_file->block = 0; @@ -421,6 +439,7 @@ int ext2__open_block_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_ return 0; } +// VFS interface function to read a block from an open block file // returns the number of bytes read int ext2__read_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer) { @@ -440,9 +459,18 @@ int ext2__read_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file, void * } memcpy(buffer, block + data_offset, 512); kfree(block); + open_block_file->block++; return min(512, bytes_read - data_offset); } +// VFS interface function to seek to a certain block number of an open block file +int ext2__block_file_seek(vfs_mount_t *mount, vfs_open_file_t *open_file, u32_t block_number) +{ + ext2__open_block_file_t *open_block_file = open_file->fs_data; + return ext2_inode_seek(mount, open_block_file->open_inode, ext2_FSToDiskBlock(block_number, mount->super)); +} + +// VFS interface function to close an open block file int ext2__close_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file) { ext2__open_block_file_t *open_block_file = open_file->fs_data; diff --git a/kernel/fs/ext2.h b/kernel/fs/ext2.h index 2a4f0c5..16995aa 100644 --- a/kernel/fs/ext2.h +++ b/kernel/fs/ext2.h @@ -211,6 +211,7 @@ int ext2__close_file(vfs_mount_t *mount, vfs_open_file_t *open_file); int ext2__open_block_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file); int ext2__read_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer); +int ext2__block_file_seek(vfs_mount_t *mount, vfs_open_file_t *open_file, u32_t block_number); int ext2__close_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file); #endif diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c index bbbc199..d5e0c5f 100644 --- a/kernel/fs/vfs.c +++ b/kernel/fs/vfs.c @@ -266,7 +266,6 @@ vfs_open_file_t *vfs_open_dir(char *file) } kfree(open_dir); return NULL; - } int vfs_read_dir(vfs_open_file_t *open_dir, vfs_dir_entry_t *dentry) @@ -285,7 +284,43 @@ int vfs_close_dir(vfs_open_file_t *open_dir) } +vfs_open_file_t *vfs_open_block_file(char *file) +{ + vfs_mount_match_t match = vfs_get_rel_path(file); + if (match.mount == NULL) + return NULL; + vfs_open_file_t *open_file = New(vfs_open_file_t); + if (fses[match.mount->fs]->open_block_file && !(fses[match.mount->fs]->open_block_file(match.mount, file + match.length - 1, open_file))) + { + open_file->mount = match.mount; + return open_file; + } + kfree(open_file); + return NULL; +} +int vfs_read_block_file(vfs_open_file_t *open_file, void *buffer) +{ + if (fses[open_file->mount->fs]->read_block_file) + return fses[open_file->mount->fs]->read_block_file(open_file->mount, open_file, buffer); + return 0; +} + +int vfs_block_file_seek(vfs_open_file_t *open_file, u32_t block_number) +{ + if (fses[open_file->mount->fs]->block_file_seek) + return fses[open_file->mount->fs]->block_file_seek(open_file->mount, open_file, block_number); + return -1; +} + +int vfs_close_block_file(vfs_open_file_t *open_file) +{ + int status = 0; + if (fses[open_file->mount->fs]->close_block_file) + status = fses[open_file->mount->fs]->close_block_file(open_file->mount, open_file); + kfree(open_file); + return status; +} // DEBUG routines to draw the VFS Mount Tree diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h index 1cf61e9..bdbbcb0 100644 --- a/kernel/fs/vfs.h +++ b/kernel/fs/vfs.h @@ -21,6 +21,19 @@ #define VFS_FT_SOCK 6 #define VFS_FT_SYMLINK 7 +#define VFS_PERMS_OX 0x0001 +#define VFS_PERMS_OW 0x0002 +#define VFS_PERMS_OR 0x0004 +#define VFS_PERMS_GX 0x0008 +#define VFS_PERMS_GW 0x0010 +#define VFS_PERMS_GR 0x0020 +#define VFS_PERMS_UX 0x0040 +#define VFS_PERMS_UW 0x0080 +#define VFS_PERMS_UR 0x0100 +#define VFS_PERMS_STICKY 0x0200 +#define VFS_PERMS_SGID 0x0400 +#define VFS_PERMS_SUID 0x0800 + #define EOF 1000000 /* Structure to hold information about a mount point */ @@ -97,6 +110,7 @@ typedef struct int (*open_block_file)(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file); int (*read_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer); + int (*block_file_seek)(vfs_mount_t *mount, vfs_open_file_t *open_file, u32_t block_number); int (*close_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file); } vfs_fs_t; @@ -117,6 +131,11 @@ vfs_open_file_t *vfs_open_dir(char *file); int vfs_read_dir(vfs_open_file_t *open_dir, vfs_dir_entry_t *dentry); int vfs_close_dir(vfs_open_file_t *open_dir); +vfs_open_file_t *vfs_open_block_file(char *file); +int vfs_read_block_file(vfs_open_file_t *open_file, void *buffer); +int vfs_block_file_seek(vfs_open_file_t *open_file, u32_t block_number); +int vfs_close_block_file(vfs_open_file_t *open_file); + // DEBUG routines void vfs_dump_tree(); diff --git a/kernel/kernel.c b/kernel/kernel.c index 62499e4..1eafbc4 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -136,19 +136,36 @@ void k_init() } } - vfs_open_file_t *open_dir = vfs_open_dir("/"); - vfs_dir_entry_t dentry; - vfs_stat_t stat; - while (!vfs_read_dir(open_dir, &dentry)) + vfs_open_file_t *root = vfs_open_dir("/"); + if (root) { - char *name = kcalloc(1, strlen(dentry.name) + 2); - name[0] = '/'; - strcat(name, dentry.name); - vfs_stat(name, &stat); - kfree(name); - kprintf("name '%s'\tinode %d, size %d, permissions 0%o, links %d\n", dentry.name, stat.inode, stat.size, stat.permissions, stat.links); + vfs_dir_entry_t dentry; + char *fname = kmalloc(257); + vfs_stat_t fstat; + while (!vfs_read_dir(root, &dentry)) + { + strcpy(fname, "/"); + strcat(fname, dentry.name); + vfs_stat(fname, &fstat); + putc(fstat.type == VFS_FT_DIR ? 'd' : '-'); + putc(fstat.permissions & VFS_PERMS_UR ? 'r' : '-'); + putc(fstat.permissions & VFS_PERMS_UW ? 'w' : '-'); + putc(fstat.permissions & VFS_PERMS_UX ? 'x' : '-'); + + putc(fstat.permissions & VFS_PERMS_GR ? 'r' : '-'); + putc(fstat.permissions & VFS_PERMS_GW ? 'w' : '-'); + putc(fstat.permissions & VFS_PERMS_GX ? 'x' : '-'); + + putc(fstat.permissions & VFS_PERMS_OR ? 'r' : '-'); + 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); + } + vfs_close_dir(root); } - vfs_close_dir(open_dir); + else + kprintf("Error: Could not open /txt/Makefile!\n"); criticalCounter--; }