diff --git a/headers/private/kernel/boot/vfs.h b/headers/private/kernel/boot/vfs.h index 6cc97f928e..cf6411945a 100644 --- a/headers/private/kernel/boot/vfs.h +++ b/headers/private/kernel/boot/vfs.h @@ -122,6 +122,9 @@ public: bool IsPackaged() const { return fPackaged; } +private: + int _OpenSystemPackage(); + private: Directory* fRootDirectory; // root directory of the volume diff --git a/src/system/boot/loader/vfs.cpp b/src/system/boot/loader/vfs.cpp index ae95a85439..21d02c8183 100644 --- a/src/system/boot/loader/vfs.cpp +++ b/src/system/boot/loader/vfs.cpp @@ -14,6 +14,8 @@ #include +#include + #include #include #include @@ -435,8 +437,7 @@ BootVolume::SetTo(Directory* rootDirectory) fSystemDirectory = static_cast(systemNode); // try opening the system package - int packageFD = open_from(fSystemDirectory, "packages/haiku.hpkg", - O_RDONLY); + int packageFD = _OpenSystemPackage(); fPackaged = packageFD >= 0; if (!fPackaged) return B_OK; @@ -474,6 +475,46 @@ BootVolume::Unset() } +int +BootVolume::_OpenSystemPackage() +{ + // open the packages directory + Node* packagesNode = fSystemDirectory->Lookup("packages", false); + if (packagesNode == NULL) + return -1; + MethodDeleter packagesNodeReleaser(packagesNode, + &Node::Release); + + if (!S_ISDIR(packagesNode->Type())) + return -1; + Directory* packageDirectory = (Directory*)packagesNode; + + // search for the system package + int fd = -1; + void* cookie; + if (packageDirectory->Open(&cookie, O_RDONLY) == B_OK) { + char name[B_FILE_NAME_LENGTH]; + while (packageDirectory->GetNextEntry(cookie, name, sizeof(name)) + == B_OK) { + // The name must end with ".hpkg". + size_t nameLength = strlen(name); + if (nameLength < 6 || strcmp(name + nameLength - 5, ".hpkg") != 0) + continue; + + // The name must either be "haiku.hpkg" or start with "haiku-". + if (strcmp(name, "haiku.hpkg") == 0 + || strncmp(name, "haiku-", 6) == 0) { + fd = open_from(packageDirectory, name, O_RDONLY); + break; + } + } + packageDirectory->Close(cookie); + } + + return fd; +} + + // #pragma mark -