Import backup from 2005-01-01

This commit is contained in:
Josh Holtrop 2005-01-01 22:00:00 -05:00
parent ee63a84c0e
commit 50285aa33b
6 changed files with 117 additions and 15 deletions

View File

@ -62,7 +62,9 @@ initrd:
mke2fs -Fv -m0 -r0 -i1024 $(INITRD) mke2fs -Fv -m0 -r0 -i1024 $(INITRD)
-mkdir $(INITRD_MOUNT) -mkdir $(INITRD_MOUNT)
mount -t ext2 -o loop $(INITRD) $(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 mkdir $(INITRD_MOUNT)/txt
cp Makefile $(INITRD_MOUNT)/txt cp Makefile $(INITRD_MOUNT)/txt
umount $(INITRD_MOUNT) umount $(INITRD_MOUNT)

View File

@ -20,7 +20,7 @@
vfs_fs_t ext2_driver = {ext2_mount_super, ext2_umount_super, ext2_stat, vfs_fs_t ext2_driver = {ext2_mount_super, ext2_umount_super, ext2_stat,
ext2__open_dir, ext2__read_dir, ext2__close_dir, ext2__open_dir, ext2__read_dir, ext2__close_dir,
ext2__open_file, ext2__read_file, ext2__close_file, 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 // initialize the filesystem driver
int ext2_init(int fsID) 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_dir_t *open_dir = New(ext2_open_dir_t);
ext2_open_inode_t *open_inode = ext2_open_inode(mount, inode_number); 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); kfree(open_dir);
return NULL; 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->open_inode = open_inode;
open_dir->position = 0; open_dir->position = 0;
return open_dir; 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) 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); 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; 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) int ext2__read_dir(vfs_mount_t *mount, vfs_open_file_t *dir, vfs_dir_entry_t *dentry)
{ {
ext2_dir_entry_t 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; return 0;
} }
// VFS interface function to close an open directory
int ext2__close_dir(vfs_mount_t *mount, vfs_open_file_t *dir) int ext2__close_dir(vfs_mount_t *mount, vfs_open_file_t *dir)
{ {
return ext2_close_dir(mount, dir->fs_data); 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) 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) 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) 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) 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); 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); ext2_open_inode_t *open_inode = ext2_open_inode(mount, file_inode);
if (!open_inode) if (!open_inode)
return -2; 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); ext2__open_block_file_t *open_block_file = New(ext2__open_block_file_t);
open_block_file->open_inode = open_inode; open_block_file->open_inode = open_inode;
open_block_file->block = 0; 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; return 0;
} }
// VFS interface function to read a block from an open block file
// returns the number of bytes read // returns the number of bytes read
int ext2__read_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer) 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); memcpy(buffer, block + data_offset, 512);
kfree(block); kfree(block);
open_block_file->block++;
return min(512, bytes_read - data_offset); 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) 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; ext2__open_block_file_t *open_block_file = open_file->fs_data;

View File

@ -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__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__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); int ext2__close_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file);
#endif #endif

View File

@ -266,7 +266,6 @@ vfs_open_file_t *vfs_open_dir(char *file)
} }
kfree(open_dir); kfree(open_dir);
return NULL; return NULL;
} }
int vfs_read_dir(vfs_open_file_t *open_dir, vfs_dir_entry_t *dentry) 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 // DEBUG routines to draw the VFS Mount Tree

View File

@ -21,6 +21,19 @@
#define VFS_FT_SOCK 6 #define VFS_FT_SOCK 6
#define VFS_FT_SYMLINK 7 #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 #define EOF 1000000
/* Structure to hold information about a mount point */ /* 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 (*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 (*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); int (*close_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file);
} vfs_fs_t; } 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_read_dir(vfs_open_file_t *open_dir, vfs_dir_entry_t *dentry);
int vfs_close_dir(vfs_open_file_t *open_dir); 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 // DEBUG routines
void vfs_dump_tree(); void vfs_dump_tree();

View File

@ -136,19 +136,36 @@ void k_init()
} }
} }
vfs_open_file_t *open_dir = vfs_open_dir("/"); vfs_open_file_t *root = vfs_open_dir("/");
vfs_dir_entry_t dentry; if (root)
vfs_stat_t stat;
while (!vfs_read_dir(open_dir, &dentry))
{ {
char *name = kcalloc(1, strlen(dentry.name) + 2); vfs_dir_entry_t dentry;
name[0] = '/'; char *fname = kmalloc(257);
strcat(name, dentry.name); vfs_stat_t fstat;
vfs_stat(name, &stat); while (!vfs_read_dir(root, &dentry))
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); 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(open_dir); vfs_close_dir(root);
}
else
kprintf("Error: Could not open /txt/Makefile!\n");
criticalCounter--; criticalCounter--;
} }