packagefs: replace ':' with '~' in the package link names
Otherwise paths containing those symlinks cannot be used in colon separated search path lists.
This commit is contained in:
@@ -208,7 +208,7 @@ PackageLinkDirectory::_UpdateDependencies(PackageLinksListener* listener)
|
|||||||
Package* resolvablePackage = resolvable != NULL
|
Package* resolvablePackage = resolvable != NULL
|
||||||
? resolvable->Package() : NULL;
|
? resolvable->Package() : NULL;
|
||||||
|
|
||||||
Node* node = FindChild(dependency->Name());
|
Node* node = FindChild(dependency->FileName());
|
||||||
if (node != NULL) {
|
if (node != NULL) {
|
||||||
// link already exists -- update
|
// link already exists -- update
|
||||||
DependencyLink* link = static_cast<DependencyLink*>(node);
|
DependencyLink* link = static_cast<DependencyLink*>(node);
|
||||||
@@ -222,7 +222,7 @@ PackageLinkDirectory::_UpdateDependencies(PackageLinksListener* listener)
|
|||||||
if (link == NULL)
|
if (link == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
status_t error = link->Init(this, dependency->Name());
|
status_t error = link->Init(this, dependency->FileName());
|
||||||
if (error != B_OK) {
|
if (error != B_OK) {
|
||||||
delete link;
|
delete link;
|
||||||
RETURN_ERROR(error);
|
RETURN_ERROR(error);
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <AutoDeleter.h>
|
||||||
|
|
||||||
#include "Version.h"
|
#include "Version.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -18,6 +20,7 @@ Dependency::Dependency(::Package* package)
|
|||||||
fFamily(NULL),
|
fFamily(NULL),
|
||||||
fResolvable(NULL),
|
fResolvable(NULL),
|
||||||
fName(),
|
fName(),
|
||||||
|
fFileName(),
|
||||||
fVersion(NULL),
|
fVersion(NULL),
|
||||||
fVersionOperator(B_PACKAGE_RESOLVABLE_OP_EQUAL)
|
fVersionOperator(B_PACKAGE_RESOLVABLE_OP_EQUAL)
|
||||||
{
|
{
|
||||||
@@ -36,6 +39,26 @@ Dependency::Init(const char* name)
|
|||||||
if (!fName.SetTo(name))
|
if (!fName.SetTo(name))
|
||||||
return B_NO_MEMORY;
|
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;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,13 +54,16 @@ public:
|
|||||||
bool ResolvableCompatibleVersionMatches(
|
bool ResolvableCompatibleVersionMatches(
|
||||||
Version* resolvableVersion) const;
|
Version* resolvableVersion) const;
|
||||||
|
|
||||||
const String& Name() const { return fName; }
|
const String& Name() const { return fName; }
|
||||||
|
const String& FileName() const { return fFileName; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
::Package* fPackage;
|
::Package* fPackage;
|
||||||
DependencyFamily* fFamily;
|
DependencyFamily* fFamily;
|
||||||
::Resolvable* fResolvable;
|
::Resolvable* fResolvable;
|
||||||
String fName;
|
String fName;
|
||||||
|
String fFileName;
|
||||||
|
// fName with ':' replaced by '~'
|
||||||
Version* fVersion;
|
Version* fVersion;
|
||||||
BPackageResolvableOperator fVersionOperator;
|
BPackageResolvableOperator fVersionOperator;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user