Author: zooey Date: 2011-01-12 15:56:41 +0100 (Wed, 12 Jan 2011) New Revision: 40214 Changeset: http://dev.haiku-os.org/changeset/40214 Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.cpp haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.h haiku/trunk/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp Log: * implement fetching of initial domain from the mount parameters in order to be able to mount packages from somewhere else than '/boot/common/packages' (squashes a TODO) * squashed another TODO about needing to remove nodes of already installed packages if anything goes wrong during the activation of a package domain * fix what to me looks like a bug in Volume::AddPackageDomainJob::Do(), fDomain is accessed unconditionally in the destructor, so NULLing it here is bad (it doesn't make sense from a reference-passing POV either). The problem never showed as this code is never being executed currently (no way to add additional package domains as of yet) Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.cpp 2011-01-12 14:45:57 UTC (rev 40213) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.cpp 2011-01-12 14:56:41 UTC (rev 40214) @@ -15,6 +15,7 @@ #include <new> #include <AppDefs.h> +#include <driver_settings.h> #include <KernelExport.h> #include <NodeMonitor.h> @@ -82,7 +83,6 @@ virtual void Do() { fVolume->_AddPackageDomain(fDomain, true); - fDomain = NULL; } private: @@ -336,7 +336,7 @@ status_t -Volume::Mount() +Volume::Mount(const char* parameterString) { // init the node table status_t error = fNodes.Init(); @@ -349,9 +349,19 @@ 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 @@ 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; } } Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.h =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.h 2011-01-12 14:45:57 UTC (rev 40213) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.h 2011-01-12 14:56:41 UTC (rev 40214) @@ -36,7 +36,7 @@ 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 Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp 2011-01-12 14:45:57 UTC (rev 40213) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp 2011-01-12 14:56:41 UTC (rev 40214) @@ -113,7 +113,7 @@ RETURN_ERROR(B_NO_MEMORY); ObjectDeleter<Volume> volumeDeleter(volume); - status_t error = volume->Mount(); + status_t error = volume->Mount(parameters); if (error != B_OK) return error;