diff --git a/src/add-ons/kernel/file_systems/packagefs/Package.cpp b/src/add-ons/kernel/file_systems/packagefs/Package.cpp index 9e4b43bb1f..c5a21e8c96 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Package.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Package.cpp @@ -31,6 +31,7 @@ Package::Package(PackageDomain* domain, dev_t deviceID, ino_t nodeID) fDomain(domain), fFileName(NULL), fName(NULL), + fInstallPath(NULL), fVersion(NULL), fArchitecture(B_PACKAGE_ARCHITECTURE_ENUM_COUNT), fLinkDirectory(NULL), @@ -56,6 +57,7 @@ Package::~Package() free(fFileName); free(fName); + free(fInstallPath); delete fVersion; mutex_destroy(&fLock); @@ -87,6 +89,20 @@ Package::SetName(const char* name) } +status_t +Package::SetInstallPath(const char* installPath) +{ + if (fInstallPath != NULL) + free(fInstallPath); + + fInstallPath = strdup(installPath); + if (fInstallPath == NULL) + RETURN_ERROR(B_NO_MEMORY); + + return B_OK; +} + + void Package::SetVersion(::Version* version) { diff --git a/src/add-ons/kernel/file_systems/packagefs/Package.h b/src/add-ons/kernel/file_systems/packagefs/Package.h index ff7a6522b0..2cf5cec1d2 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Package.h +++ b/src/add-ons/kernel/file_systems/packagefs/Package.h @@ -44,6 +44,9 @@ public: status_t SetName(const char* name); const char* Name() const { return fName; } + status_t SetInstallPath(const char* installPath); + const char* InstallPath() const { return fInstallPath; } + void SetVersion(::Version* version); // takes over object ownership ::Version* Version() const @@ -83,6 +86,7 @@ private: PackageDomain* fDomain; char* fFileName; char* fName; + char* fInstallPath; ::Version* fVersion; BPackageArchitecture fArchitecture; PackageLinkDirectory* fLinkDirectory; diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.cpp index 562200e123..877b0824b7 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkSymlink.cpp @@ -92,8 +92,11 @@ PackageLinkSymlink::Update(Package* package, PackageLinksListener* listener) OldAttributes oldAttributes(fModifiedTime, FileSize()); if (package != NULL) { - fLinkPath = link_path_for_mount_type( - package->Domain()->Volume()->MountType()); + fLinkPath = package->InstallPath(); + if (fLinkPath == NULL) { + fLinkPath = link_path_for_mount_type( + package->Domain()->Volume()->MountType()); + } } else fLinkPath = kUnknownLinkTarget; diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp index b8d2154b61..3304741cc4 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp @@ -291,6 +291,9 @@ struct Volume::PackageLoaderContentHandler : BPackageContentHandler { case B_PACKAGE_INFO_NAME: return fPackage->SetName(value.string); + case B_PACKAGE_INFO_INSTALL_PATH: + return fPackage->SetInstallPath(value.string); + case B_PACKAGE_INFO_VERSION: { Version* version;