diff --git a/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.cpp index cb96ee9a0c..ae2d171127 100644 --- a/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.cpp @@ -208,7 +208,7 @@ PackageLinkDirectory::_UpdateDependencies(PackageLinksListener* listener) Package* resolvablePackage = resolvable != NULL ? resolvable->Package() : NULL; - Node* node = FindChild(dependency->Name()); + Node* node = FindChild(dependency->FileName()); if (node != NULL) { // link already exists -- update DependencyLink* link = static_cast(node); @@ -222,7 +222,7 @@ PackageLinkDirectory::_UpdateDependencies(PackageLinksListener* listener) if (link == NULL) return B_NO_MEMORY; - status_t error = link->Init(this, dependency->Name()); + status_t error = link->Init(this, dependency->FileName()); if (error != B_OK) { delete link; RETURN_ERROR(error); diff --git a/src/add-ons/kernel/file_systems/packagefs/resolvables/Dependency.cpp b/src/add-ons/kernel/file_systems/packagefs/resolvables/Dependency.cpp index 30f02dfc23..2cc42af4d9 100644 --- a/src/add-ons/kernel/file_systems/packagefs/resolvables/Dependency.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/resolvables/Dependency.cpp @@ -9,6 +9,8 @@ #include #include +#include + #include "Version.h" @@ -18,6 +20,7 @@ Dependency::Dependency(::Package* package) fFamily(NULL), fResolvable(NULL), fName(), + fFileName(), fVersion(NULL), fVersionOperator(B_PACKAGE_RESOLVABLE_OP_EQUAL) { @@ -36,6 +39,26 @@ Dependency::Init(const char* name) if (!fName.SetTo(name)) return B_NO_MEMORY; + // If the name contains a ':', replace it with '~' in the file name. We do + // that so that a path containing the symlink can be used in colon-separated + // search paths. + if (strchr(name, ':') != NULL) { + char* fileName = strdup(name); + if (fileName == NULL) + return B_NO_MEMORY; + MemoryDeleter fileNameDeleter(fileName); + + char* remainder = fileName; + while (char* colon = strchr(remainder, ':')) { + *colon = '~'; + remainder = colon + 1; + } + + if (!fFileName.SetTo(fileName)) + return B_NO_MEMORY; + } else + fFileName = fName; + return B_OK; } diff --git a/src/add-ons/kernel/file_systems/packagefs/resolvables/Dependency.h b/src/add-ons/kernel/file_systems/packagefs/resolvables/Dependency.h index 4997110b24..2a6bae9ba1 100644 --- a/src/add-ons/kernel/file_systems/packagefs/resolvables/Dependency.h +++ b/src/add-ons/kernel/file_systems/packagefs/resolvables/Dependency.h @@ -54,13 +54,16 @@ public: bool ResolvableCompatibleVersionMatches( Version* resolvableVersion) const; - const String& Name() const { return fName; } + const String& Name() const { return fName; } + const String& FileName() const { return fFileName; } private: ::Package* fPackage; DependencyFamily* fFamily; ::Resolvable* fResolvable; String fName; + String fFileName; + // fName with ':' replaced by '~' Version* fVersion; BPackageResolvableOperator fVersionOperator;