9boot: look for plan9.ini in all filesystems accessible to efi to find plan9 partition

try the handle buffer in reverse order looking for plan9.ini
to find plan9 partition (9fat). when that fails, we'll default
to the first handle which should be the esp.
This commit is contained in:
cinap_lenrek 2015-06-05 05:09:22 +02:00
parent 045530aed2
commit bbc35cc01b

View file

@ -87,23 +87,48 @@ int
fsinit(void **pf)
{
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *fs;
EFI_FILE_PROTOCOL *root;
EFI_HANDLE *Handles;
void *f;
UINTN Count;
int i;
fs = nil;
Count = 0;
Handles = nil;
if(eficall(ST->BootServices->LocateHandleBuffer,
ByProtocol, &EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, nil, &Count, &Handles))
return -1;
/*
* assuming the ESP is the first entry in the handle buffer, so go backwards
* to scan for plan9.ini in other (9fat) filesystems first. if nothing is found
* we'll be defaulting to the ESP.
*/
fsroot = nil;
if(eficall(ST->BootServices->LocateProtocol,
&EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, nil, &fs))
return -1;
if(eficall(fs->OpenVolume, fs, &fsroot)){
fsroot = nil;
return -1;
for(i=Count-1; i>=0; i--){
root = nil;
fs = nil;
if(eficall(ST->BootServices->HandleProtocol,
Handles[i], &EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, &fs))
continue;
if(eficall(fs->OpenVolume, fs, &root))
continue;
fsroot = root;
f = fsopen("/plan9.ini");
if(f != nil){
if(pf != nil)
*pf = f;
else
fsclose(f);
break;
}
}
if(fsroot == nil)
return -1;
read = fsread;
close = fsclose;
open = fsopen;
if(pf != nil)
*pf = fsopen("/plan9.ini");
return 0;
}