Currently the dir word works by using /packages/misc-files to open a directory in a similar way to a file and then

special-casing directory actions. This is wrong in that in order to list the contents of a directory, open-dev must return true 
for any device which contains a valid filesystem, regardless of whether or not the supplied arguments reference a valid path.

This causes us a problem because in order to implement multiple references in boot-device correctly, we have to fail if we open 
a specific device with invalid arguments (such as a non-existent file reference). This patch therefore makes the following changes:

1) Create a static method in each of the filesystem packages to implement dir
2) Enhance the partition/disk handlers to record the phandle of any detected filesystem during open
3) Create a new dir method in the partition/disk handlers which invokes the static dir method for the currently detected 
filesystem

Hence we can now open a raw device/partition and invoke dir on its filesystem without having to open a specific file-reference 
first. Following shortly is a patch to switch the main dir word over to use this new system.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>


git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@816 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Mark Cave-Ayland
2010-07-10 13:11:22 +00:00
committed by Mark Cave-Ayland
parent 930ce00f5f
commit a5511ad95c
9 changed files with 263 additions and 30 deletions

View File

@@ -365,6 +365,23 @@ pcparts_load( __attribute__((unused))pcparts_info_t *di )
load(my_self());
}
/* ( pathstr len -- ) */
static void
pcparts_dir( pcparts_info_t *di )
{
if ( di->filesystem_ph ) {
PUSH( my_self() );
push_str("dir");
PUSH( di->filesystem_ph );
fword("find-method");
POP();
fword("execute");
} else {
forth_printf("pc-parts: Unable to determine filesystem\n");
POP();
POP();
}
}
NODE_METHODS( pcparts ) = {
{ "probe", pcparts_probe },
@@ -372,6 +389,7 @@ NODE_METHODS( pcparts ) = {
{ "seek", pcparts_seek },
{ "read", pcparts_read },
{ "load", pcparts_load },
{ "dir", pcparts_dir },
{ "get-info", pcparts_get_info },
{ "block-size", pcparts_block_size },
{ NULL, pcparts_initialize },