Add install path support to packagefs

This commit is contained in:
Ingo Weinhold
2011-11-25 06:19:36 +01:00
parent 1fc3ceeda2
commit 17a7f65c0a
4 changed files with 28 additions and 2 deletions
@@ -31,6 +31,7 @@ Package::Package(PackageDomain* domain, dev_t deviceID, ino_t nodeID)
fDomain(domain), fDomain(domain),
fFileName(NULL), fFileName(NULL),
fName(NULL), fName(NULL),
fInstallPath(NULL),
fVersion(NULL), fVersion(NULL),
fArchitecture(B_PACKAGE_ARCHITECTURE_ENUM_COUNT), fArchitecture(B_PACKAGE_ARCHITECTURE_ENUM_COUNT),
fLinkDirectory(NULL), fLinkDirectory(NULL),
@@ -56,6 +57,7 @@ Package::~Package()
free(fFileName); free(fFileName);
free(fName); free(fName);
free(fInstallPath);
delete fVersion; delete fVersion;
mutex_destroy(&fLock); 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 void
Package::SetVersion(::Version* version) Package::SetVersion(::Version* version)
{ {
@@ -44,6 +44,9 @@ public:
status_t SetName(const char* name); status_t SetName(const char* name);
const char* Name() const { return fName; } const char* Name() const { return fName; }
status_t SetInstallPath(const char* installPath);
const char* InstallPath() const { return fInstallPath; }
void SetVersion(::Version* version); void SetVersion(::Version* version);
// takes over object ownership // takes over object ownership
::Version* Version() const ::Version* Version() const
@@ -83,6 +86,7 @@ private:
PackageDomain* fDomain; PackageDomain* fDomain;
char* fFileName; char* fFileName;
char* fName; char* fName;
char* fInstallPath;
::Version* fVersion; ::Version* fVersion;
BPackageArchitecture fArchitecture; BPackageArchitecture fArchitecture;
PackageLinkDirectory* fLinkDirectory; PackageLinkDirectory* fLinkDirectory;
@@ -92,8 +92,11 @@ PackageLinkSymlink::Update(Package* package, PackageLinksListener* listener)
OldAttributes oldAttributes(fModifiedTime, FileSize()); OldAttributes oldAttributes(fModifiedTime, FileSize());
if (package != NULL) { if (package != NULL) {
fLinkPath = link_path_for_mount_type( fLinkPath = package->InstallPath();
package->Domain()->Volume()->MountType()); if (fLinkPath == NULL) {
fLinkPath = link_path_for_mount_type(
package->Domain()->Volume()->MountType());
}
} else } else
fLinkPath = kUnknownLinkTarget; fLinkPath = kUnknownLinkTarget;
@@ -291,6 +291,9 @@ struct Volume::PackageLoaderContentHandler : BPackageContentHandler {
case B_PACKAGE_INFO_NAME: case B_PACKAGE_INFO_NAME:
return fPackage->SetName(value.string); return fPackage->SetName(value.string);
case B_PACKAGE_INFO_INSTALL_PATH:
return fPackage->SetInstallPath(value.string);
case B_PACKAGE_INFO_VERSION: case B_PACKAGE_INFO_VERSION:
{ {
Version* version; Version* version;