Import backup from 2005-01-01
This commit is contained in:
parent
ee63a84c0e
commit
50285aa33b
4
Makefile
4
Makefile
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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--;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user