Fix rollback in mount update 05/69305/2
authorTomasz Iwanek <t.iwanek@samsung.com>
Thu, 12 May 2016 12:05:30 +0000 (14:05 +0200)
committerTomasz Iwanek <t.iwanek@samsung.com>
Thu, 19 May 2016 11:58:07 +0000 (04:58 -0700)
To verify, check that you still cannot update mount-installed
package in normal manner and vice-versa. Run smoke tests.

Change-Id: I5de71a59c92b7f1ae8d0ab612ed5784911ece083

src/common/pkgmgr_registration.cc
src/common/pkgmgr_registration.h
src/common/step/configuration/step_block_cross_update.cc
src/common/step/configuration/step_block_cross_update.h
src/common/step/configuration/step_parse_manifest.cc

index 7110f54..693b3f3 100644 (file)
@@ -306,6 +306,26 @@ std::string QueryTepPath(const std::string& pkgid, uid_t uid) {
   return tep_name_value;
 }
 
+std::string QueryZipMountFile(const std::string& pkgid, uid_t uid) {
+  pkgmgrinfo_pkginfo_h package_info;
+  if (pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid.c_str(), uid, &package_info)
+      != PMINFO_R_OK)
+    return {};
+  char* zip_mount_file = nullptr;
+  int ret = pkgmgrinfo_pkginfo_get_zip_mount_file(package_info, &zip_mount_file);
+  if (ret != PMINFO_R_OK) {
+    LOG(DEBUG) << "pkgmgrinfo_pkginfo_get_zip_mount_file failed with error: "
+               << ret;
+    pkgmgrinfo_pkginfo_destroy_pkginfo(package_info);
+    return {};
+  }
+  std::string zip_mount_file_value;
+  if (zip_mount_file)
+    zip_mount_file_value = zip_mount_file;
+  pkgmgrinfo_pkginfo_destroy_pkginfo(package_info);
+  return zip_mount_file_value;
+}
+
 bool QueryAppidsForPkgId(const std::string& pkg_id,
                          std::vector<std::string>* result, uid_t uid) {
   pkgmgrinfo_pkginfo_h package_info;
index 5549144..21403bf 100644 (file)
@@ -96,6 +96,16 @@ std::string QueryTepPath(const std::string& pkgid, uid_t uid);
 
 /**
  * \brief Adapter interface for external PkgMgr module used for getting
+ *        zip mount path for given package
+ *
+ * @param pkgid package id
+ * @param uid user id
+ * @return path or empty
+ */
+std::string QueryZipMountFile(const std::string& pkgid, uid_t uid);
+
+/**
+ * \brief Adapter interface for external PkgMgr module used for getting
  *        list of appids for given package
  *
  * \param pkg_id[in] package pkgid
index 6cc0ca5..16a9184 100644 (file)
@@ -13,13 +13,17 @@ namespace bf = boost::filesystem;
 namespace common_installer {
 namespace configuration {
 
+Step::Status StepBlockCrossUpdate::precheck() {
+  if (!context_->old_manifest_data.get()) {
+    LOG(ERROR) << "Old manifest data is missing";
+    return Status::INVALID_VALUE;
+  }
+  return Status::OK;
+}
+
 Step::Status StepBlockCrossUpdate::process() {
-  // TODO(t.iwanek): check for file is not the best method
-  // information about if package was mount-installed should be stored in pkgmgr
-  // database
   bool is_mount_installed =
-      bf::exists(GetZipPackageLocation(context_->pkg_path.get(),
-                                       context_->pkgid.get()));
+      context_->old_manifest_data.get()->zip_mount_file != nullptr;
   if (is_mount_installed) {
     if (context_->request_type.get() == RequestType::Reinstall) {
       LOG(ERROR) << "Reinstall / RDS mode is not allowed for "
index 01fa1e7..cc32e8d 100644 (file)
@@ -33,7 +33,7 @@ class StepBlockCrossUpdate : public Step {
   Status process() override;
   Status clean() override { return Status::OK; }
   Status undo() override { return Status::OK; }
-  Status precheck() override { return Status::OK; }
+  Status precheck() override;
 
   SCOPE_LOG_TAG(BlockCrossUpdate)
 };
index 84391a1..f6c44a3 100644 (file)
@@ -774,11 +774,17 @@ Step::Status StepParseManifest::process() {
   }
 
   if (manifest_location_ == ManifestLocation::INSTALLED) {
-    // recovery tep value for installed package
+    // recovery of tep value for installed package
     std::string old_tep =
         QueryTepPath(context_->pkgid.get(), context_->uid.get());
     if (!old_tep.empty())
       manifest->tep_name = strdup(old_tep.c_str());
+
+    // recovery of zip mount file for installed package
+    std::string zip_mount_file =
+        QueryZipMountFile(context_->pkgid.get(), context_->uid.get());
+    if (!zip_mount_file.empty())
+      manifest->zip_mount_file = strdup(zip_mount_file.c_str());
   }
 
   // write pkgid for recovery file