diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.cpp index 3d05e7cad4..a19b7f6cf5 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.cpp @@ -268,7 +268,13 @@ PackageFSRoot::_AddPackage(Package* package) dependenciesToUpdate.Add(dependency); } - return fPackageLinksDirectory->AddPackage(package); + status_t error = fPackageLinksDirectory->AddPackage(package); + if (error != B_OK) + RETURN_ERROR(error); + + _ResolveDependencies(dependenciesToUpdate); + + return B_OK; } @@ -317,7 +323,35 @@ PackageFSRoot::_ResolveDependencies(ResolvableDependencyList& dependencies) if (dependencies.IsEmpty()) return; - // TODO:... + while (Dependency* dependency = dependencies.RemoveHead()) { + Package* package = dependency->Package(); + _ResolveDependency(dependency); + + // also resolve all other dependencies for that package + for (ResolvableDependencyList::Iterator it = dependencies.GetIterator(); + (dependency = it.Next()) != NULL;) { + if (dependency->Package() == package) { + it.Remove(); + _ResolveDependency(dependency); + } + } + + fPackageLinksDirectory->UpdatePackageDependencies(package); + } +} + + +void +PackageFSRoot::_ResolveDependency(Dependency* dependency) +{ + // get the resolvable family for the dependency + ResolvableFamily* resolvableFamily + = fResolvables.Lookup(dependency->Name()); + if (resolvableFamily == NULL) + return; + + // let the family resolve the dependency + resolvableFamily->ResolveDependency(dependency); } diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.h b/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.h index acdaf9e128..510f7144e7 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.h @@ -65,6 +65,7 @@ private: void _ResolveDependencies( ResolvableDependencyList& dependencies); + void _ResolveDependency(Dependency* dependency); static status_t _GetOrCreateRoot(dev_t deviceID, ino_t nodeID, PackageFSRoot*& _root); diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp index ee4ba52ef1..c864940e0e 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp @@ -297,6 +297,14 @@ PackageLinkDirectory::RemovePackage(Package* package, } +void +PackageLinkDirectory::UpdatePackageDependencies(Package* package, + PackageLinksListener* listener) +{ +// TODO:... +} + + status_t PackageLinkDirectory::_Update(PackageLinksListener* listener) { diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h index ee87220167..afc8c5f9eb 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h @@ -37,6 +37,8 @@ public: PackageLinksListener* listener); void RemovePackage(Package* package, PackageLinksListener* listener); + void UpdatePackageDependencies(Package* package, + PackageLinksListener* listener); bool IsEmpty() const { return fPackages.IsEmpty(); } diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp index 848eb5af91..473c4aa888 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp @@ -134,6 +134,8 @@ PackageLinksDirectory::AddPackage(Package* package) void PackageLinksDirectory::RemovePackage(Package* package) { + NodeWriteLocker writeLocker(this); + // get the package's link directory and remove the package from it PackageLinkDirectory* linkDirectory = package->LinkDirectory(); if (linkDirectory == NULL) @@ -141,8 +143,6 @@ PackageLinksDirectory::RemovePackage(Package* package) BReference linkDirectoryReference(linkDirectory); - NodeWriteLocker writeLocker(this); - linkDirectory->RemovePackage(package, fListener); // if empty, remove the link directory itself @@ -150,3 +150,16 @@ PackageLinksDirectory::RemovePackage(Package* package) RemoveChild(linkDirectory); } + +void +PackageLinksDirectory::UpdatePackageDependencies(Package* package) +{ + NodeWriteLocker writeLocker(this); + + PackageLinkDirectory* linkDirectory = package->LinkDirectory(); + if (linkDirectory == NULL) + return; + + linkDirectory->UpdatePackageDependencies(package, fListener); +} + diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.h b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.h index 4d5e3f1d0c..8d509038b8 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.h @@ -34,6 +34,7 @@ public: status_t AddPackage(Package* package); void RemovePackage(Package* package); + void UpdatePackageDependencies(Package* package); private: timespec fModifiedTime;