diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp index 854d0f183f..c660f2af98 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -82,7 +83,6 @@ struct Volume::AddPackageDomainJob : Job { virtual void Do() { fVolume->_AddPackageDomain(fDomain, true); - fDomain = NULL; } private: @@ -336,7 +336,7 @@ Volume::~Volume() status_t -Volume::Mount() +Volume::Mount(const char* parameterString) { // init the node table status_t error = fNodes.Init(); @@ -349,9 +349,19 @@ Volume::Mount() RETURN_ERROR(B_NO_MEMORY); fNodes.Insert(fRootDirectory); - // create default package domains -// TODO: Get them from the mount parameters instead! - error = _AddInitialPackageDomain("/boot/common/packages"); + const char* domain = NULL; + void* parameterHandle = parse_driver_settings_string(parameterString); + if (parameterHandle != NULL) { + domain = get_driver_parameter(parameterHandle, "domain", NULL, NULL); + delete_driver_settings(parameterHandle); + } + if (domain == NULL || domain[0] == '\0') { + ERROR("need package folder ('domain' parameter)!\n"); + RETURN_ERROR(B_BAD_VALUE); + } + + // create default package domain + error = _AddInitialPackageDomain(domain); if (error != B_OK) RETURN_ERROR(error); @@ -554,7 +564,11 @@ Volume::_AddPackageDomain(PackageDomain* domain, bool notify) Package* package = it.Next();) { error = _AddPackageContent(package, notify); if (error != B_OK) { -// TODO: Remove the already added packages! + for (it.Rewind(); Package* activePackage = it.Next();) { + if (activePackage == package) + break; + _RemovePackageContent(activePackage, NULL, notify); + } return error; } } diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.h b/src/add-ons/kernel/file_systems/packagefs/Volume.h index 51bacff925..28894ead69 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.h +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.h @@ -36,7 +36,7 @@ public: dev_t ID() const { return fFSVolume->id; } Directory* RootDirectory() const { return fRootDirectory; } - status_t Mount(); + status_t Mount(const char* parameterString); void Unmount(); Node* FindNode(ino_t nodeID) const diff --git a/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp index efa3291f93..e478739756 100644 --- a/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp @@ -113,7 +113,7 @@ packagefs_mount(fs_volume* fsVolume, const char* device, uint32 flags, RETURN_ERROR(B_NO_MEMORY); ObjectDeleter volumeDeleter(volume); - status_t error = volume->Mount(); + status_t error = volume->Mount(parameters); if (error != B_OK) return error;