diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 236d595a698355f237c9d5b8d5663473f5c716ac..d8aa5b981a8fc37f68e80c4b473406b77622970d 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -39,7 +39,7 @@ using CompareFilesResult = tuple, map>; class BackupExtExtension : public ExtExtensionStub { public: - UniqueFd GetFileHandle(const std::string &fileName) override; + UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) override; ErrCode HandleClear() override; ErrCode PublishFile(const std::string &fileName) override; ErrCode HandleBackup() override; diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index d9f7294874be06694a6b8b8e026c1caa3711205d..24e434ff343be442403687df0015b34ae145712b 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -154,7 +154,7 @@ static UniqueFd GetFileHandleForSpecialCloneCloud(const string &fileName) return fd; } -UniqueFd BackupExtExtension::GetFileHandle(const string &fileName) +UniqueFd BackupExtExtension::GetFileHandle(const string &fileName, int32_t &errCode) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); try { @@ -166,7 +166,11 @@ UniqueFd BackupExtExtension::GetFileHandle(const string &fileName) VerifyCaller(); if (extension_->SpeicalVersionForCloneAndCloud()) { - return GetFileHandleForSpecialCloneCloud(fileName); + UniqueFd fd = GetFileHandleForSpecialCloneCloud(fileName); + if (fd < 0) { + errCode = BError::GetCodeByErrno(errno); + } + return fd; } string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); @@ -179,10 +183,16 @@ UniqueFd BackupExtExtension::GetFileHandle(const string &fileName) if (access(tarName.c_str(), F_OK) == 0) { throw BError(BError::Codes::EXT_INVAL_ARG, string("The file already exists")); } - return UniqueFd(open(tarName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); + UniqueFd tarFd(open(tarName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); + if (tarFd < 0) { + HILOGE("Open file failed, file name is %{private}s, err = %{public}d", tarName.data(), errno); + errCode = BError::GetCodeByErrno(errno); + } + return tarFd; } catch (...) { HILOGE("Failed to get file handle"); DoClear(); + errCode = BError::BackupErrorCode::E_UKERR; return UniqueFd(-1); } } diff --git a/frameworks/native/backup_ext/src/ext_extension_stub.cpp b/frameworks/native/backup_ext/src/ext_extension_stub.cpp index daec6dfd88d14aae5fd210b21d5d4c97a9ecbc73..9b9623cd0f8ad4721dac9568f4c35a58fa085378 100644 --- a/frameworks/native/backup_ext/src/ext_extension_stub.cpp +++ b/frameworks/native/backup_ext/src/ext_extension_stub.cpp @@ -80,9 +80,11 @@ ErrCode ExtExtensionStub::CmdGetFileHandle(MessageParcel &data, MessageParcel &r return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive fileName").GetCode(); } - UniqueFd fd = GetFileHandle(fileName); + int32_t errCode = ERR_OK; + UniqueFd fd = GetFileHandle(fileName, errCode); bool fdFlag = fd < 0 ? false : true; reply.WriteBool(fdFlag); + reply.WriteInt32(errCode); if (fdFlag == true && !reply.WriteFileDescriptor(fd)) { return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode(); } diff --git a/frameworks/native/backup_kit_inner/include/service_reverse.h b/frameworks/native/backup_kit_inner/include/service_reverse.h index e3618eb727b2b3e60b8cf4d8e4ddd6fc9fd88233..17008c7ac6a702a6500ff79f471b352cb64c8d4c 100644 --- a/frameworks/native/backup_kit_inner/include/service_reverse.h +++ b/frameworks/native/backup_kit_inner/include/service_reverse.h @@ -34,7 +34,7 @@ public: void RestoreOnBundleStarted(int32_t errCode, std::string bundleName) override; void RestoreOnBundleFinished(int32_t errCode, std::string bundleName) override; void RestoreOnAllBundlesFinished(int32_t errCode) override; - void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd) override; + void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd, int32_t errCode) override; void RestoreOnResultReport(std::string result, std::string bundleName) override; void IncrementalBackupOnFileReady(std::string bundleName, std::string fileName, int fd, int manifestFd, diff --git a/frameworks/native/backup_kit_inner/src/service_reverse.cpp b/frameworks/native/backup_kit_inner/src/service_reverse.cpp index 04f779561c7cf347c468a2611198ad5907518785..e004a4164caf1c4ca29284d0204f0280f2e96802 100644 --- a/frameworks/native/backup_kit_inner/src/service_reverse.cpp +++ b/frameworks/native/backup_kit_inner/src/service_reverse.cpp @@ -97,14 +97,14 @@ void ServiceReverse::RestoreOnAllBundlesFinished(int32_t errCode) callbacksRestore_.onAllBundlesFinished(errCode); } -void ServiceReverse::RestoreOnFileReady(string bundleName, string fileName, int fd) +void ServiceReverse::RestoreOnFileReady(string bundleName, string fileName, int fd, int32_t errCode) { if (scenario_ != Scenario::RESTORE || !callbacksRestore_.onFileReady) { HILOGI("Error scenario or callback is nullptr"); return; } BFileInfo bFileInfo(bundleName, fileName, 0); - callbacksRestore_.onFileReady(bFileInfo, UniqueFd(fd)); + callbacksRestore_.onFileReady(bFileInfo, UniqueFd(fd), errCode); } void ServiceReverse::RestoreOnResultReport(string result, std::string bundleName) diff --git a/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp b/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp index 0d4d1656e47b88e06528e8fee4e356a069884740..f24cc6608cfd389a3b0818dfeadc7b64e822f063 100644 --- a/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp +++ b/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp @@ -175,7 +175,8 @@ int32_t ServiceReverseStub::CmdRestoreOnFileReady(MessageParcel &data, MessagePa if (fdFlag == true) { fd = data.ReadFileDescriptor(); } - RestoreOnFileReady(bundleName, fileName, fd); + int32_t errCode = data.ReadInt32(); + RestoreOnFileReady(bundleName, fileName, fd, errCode); return BError(BError::Codes::OK); } diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore.h b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore.h index dfe89ba349425461d07ae3058d0126210b2895bc..ae916947471f647cfb35d0c59d07a166fb8a1c0b 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore.h @@ -29,7 +29,7 @@ namespace OHOS::FileManagement::Backup { class BSessionRestore { public: struct Callbacks { - std::function onFileReady; // 当备份服务有文件待发送时执行的回调 + std::function onFileReady; // 当备份服务有文件待发送时执行的回调 std::function onBundleStarted; // 当启动某个应用的恢复流程结束时执行的回调函数 std::function onBundleFinished; // 当某个应用的恢复流程结束或意外中止时执行的回调函数 std::function onAllBundlesFinished; // 当整个恢复流程结束或意外中止时执行的回调函数 diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore_async.h b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore_async.h index 5140e0e081884ba473f6d320099ce7676d15cac5..405b659e84da7ef0e4129da36db848c330202ea5 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore_async.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore_async.h @@ -32,7 +32,7 @@ namespace OHOS::FileManagement::Backup { class BSessionRestoreAsync : public std::enable_shared_from_this { public: struct Callbacks { - std::function onFileReady; // 当备份服务有文件待发送时执行的回调 + std::function onFileReady; // 当备份服务有文件待发送时执行的回调 std::function onBundleStarted; // 当启动某个应用的恢复流程结束时执行的回调函数 std::function onBundleFinished; // 当某个应用的恢复流程结束或意外中止时执行的回调函数 diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h b/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h index c74267fd06f1904f022f323109026f0ce91291de..46f9b67c6a231631d053dd516997c7899e3e8a5b 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h @@ -27,7 +27,7 @@ public: DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.FileManagement.Backup.IExtension"); public: - virtual UniqueFd GetFileHandle(const std::string &fileName) = 0; + virtual UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) = 0; virtual ErrCode HandleClear() = 0; virtual ErrCode HandleBackup() = 0; virtual ErrCode PublishFile(const std::string &fileName) = 0; diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/i_service_reverse.h b/interfaces/inner_api/native/backup_kit_inner/impl/i_service_reverse.h index 5c33a08ec3ba75fd218de73c71ce324107b38ba7..9052208cd406a814931b4c4e0a5079cc673b7344 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/i_service_reverse.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/i_service_reverse.h @@ -38,7 +38,7 @@ public: virtual void BackupOnAllBundlesFinished(int32_t errCode) = 0; virtual void RestoreOnBundleStarted(int32_t errCode, std::string bundleName) = 0; - virtual void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd) = 0; + virtual void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd, int32_t errCode) = 0; virtual void RestoreOnResultReport(std::string result, std::string bundleName) = 0; virtual void RestoreOnBundleFinished(int32_t errCode, std::string bundleName) = 0; virtual void RestoreOnAllBundlesFinished(int32_t errCode) = 0; diff --git a/interfaces/kits/js/backup/session_restore_n_exporter.cpp b/interfaces/kits/js/backup/session_restore_n_exporter.cpp index 73927f143a774eb3f55107d2541b242dc822bd31..7d4c83d921ddf4de45cfeb8f568a57ea15d6e0ed 100644 --- a/interfaces/kits/js/backup/session_restore_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_restore_n_exporter.cpp @@ -40,7 +40,8 @@ struct RestoreEntity { shared_ptr callbacks; }; -static void OnFileReadyWhole(weak_ptr pCallbacks, const BFileInfo &fileInfo, UniqueFd fd) +static void OnFileReadyWhole(weak_ptr pCallbacks, const BFileInfo &fileInfo, + UniqueFd fd, int32_t errCode) { if (pCallbacks.expired()) { HILOGI("callbacks is unbound"); @@ -57,11 +58,18 @@ static void OnFileReadyWhole(weak_ptr pCallbacks, const BFileI } auto cbCompl = [bundleName {fileInfo.owner}, fileName {fileInfo.fileName}, - fd {make_shared(fd.Release())}](napi_env env, NError err) -> NVal { + fd {make_shared(fd.Release())}, + errCode](napi_env env, NError err) -> NVal { if (err) { return {env, err.GetNapiErr(env)}; } - NVal obj = NVal::CreateObject(env); + HILOGI("callback function restore OnFileReadyWhole errCode: %{public}d", errCode); + NVal obj; + if (errCode != 0) { + obj = NVal {env, NError(errCode).GetNapiErr(env)}; + } else { + obj = NVal::CreateObject(env); + } obj.AddProp({ NVal::DeclareNapiProperty(BConstants::BUNDLE_NAME.c_str(), NVal::CreateUTF8String(env, bundleName).val_), NVal::DeclareNapiProperty(BConstants::URI.c_str(), NVal::CreateUTF8String(env, fileName).val_), @@ -390,9 +398,8 @@ napi_value SessionRestoreNExporter::Constructor(napi_env env, napi_callback_info if (bSheet) { restoreEntity->sessionWhole = nullptr; restoreEntity->sessionSheet = BIncrementalRestoreSession::Init(BIncrementalRestoreSession::Callbacks { - .onFileReady = - bind(OnFileReadySheet, restoreEntity->callbacks, placeholders::_1, placeholders::_2, placeholders::_3, - placeholders::_4), + .onFileReady = bind(OnFileReadySheet, restoreEntity->callbacks, placeholders::_1, placeholders::_2, + placeholders::_3, placeholders::_4), .onBundleStarted = bind(onBundleBegin, restoreEntity->callbacks, placeholders::_1, placeholders::_2), .onBundleFinished = bind(onBundleEnd, restoreEntity->callbacks, placeholders::_1, placeholders::_2), .onAllBundlesFinished = bind(onAllBundlesEnd, restoreEntity->callbacks, placeholders::_1), @@ -401,7 +408,8 @@ napi_value SessionRestoreNExporter::Constructor(napi_env env, napi_callback_info } else { restoreEntity->sessionSheet = nullptr; restoreEntity->sessionWhole = BSessionRestore::Init(BSessionRestore::Callbacks { - .onFileReady = bind(OnFileReadyWhole, restoreEntity->callbacks, placeholders::_1, placeholders::_2), + .onFileReady = bind(OnFileReadyWhole, restoreEntity->callbacks, placeholders::_1, + placeholders::_2, placeholders::_3), .onBundleStarted = bind(onBundleBegin, restoreEntity->callbacks, placeholders::_1, placeholders::_2), .onBundleFinished = bind(onBundleEnd, restoreEntity->callbacks, placeholders::_1, placeholders::_2), .onAllBundlesFinished = bind(onAllBundlesEnd, restoreEntity->callbacks, placeholders::_1), diff --git a/services/backup_sa/include/module_ipc/service_reverse_proxy.h b/services/backup_sa/include/module_ipc/service_reverse_proxy.h index bc2dc898b6e11bc7980bdcfac958c3f78ef28fe4..9c133524feed5d13a7af182b7703ac63df0c94c6 100644 --- a/services/backup_sa/include/module_ipc/service_reverse_proxy.h +++ b/services/backup_sa/include/module_ipc/service_reverse_proxy.h @@ -29,7 +29,7 @@ public: void BackupOnAllBundlesFinished(int32_t errCode) override; void RestoreOnBundleStarted(int32_t errCode, std::string bundleName) override; - void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd) override; + void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd, int32_t errCode) override; void RestoreOnResultReport(std::string result, std::string bundleName) override; void RestoreOnBundleFinished(int32_t errCode, std::string bundleName) override; void RestoreOnAllBundlesFinished(int32_t errCode) override; diff --git a/services/backup_sa/include/module_ipc/svc_extension_proxy.h b/services/backup_sa/include/module_ipc/svc_extension_proxy.h index a2ea569004d7af3f18f5738f3cc6991fe043eda9..6c675114d84f47377b4cdb42235753591a1aab32 100644 --- a/services/backup_sa/include/module_ipc/svc_extension_proxy.h +++ b/services/backup_sa/include/module_ipc/svc_extension_proxy.h @@ -23,7 +23,7 @@ namespace OHOS::FileManagement::Backup { class SvcExtensionProxy : public IRemoteProxy { public: - UniqueFd GetFileHandle(const std::string &fileName) override; + UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) override; ErrCode HandleClear() override; ErrCode HandleBackup() override; ErrCode PublishFile(const std::string &fileName) override; diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 33938dd428c552d954819a4f29c3dbd7b3bce1ed..baca2ceae5fa6811e101a98b9f2724e297221a86 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -818,11 +818,9 @@ ErrCode Service::GetFileHandle(const string &bundleName, const string &fileName) if (!proxy) { throw BError(BError::Codes::SA_INVAL_ARG, "Extension backup Proxy is empty"); } - UniqueFd fd = proxy->GetFileHandle(fileName); - if (fd < 0) { - HILOGE("Failed to extension file handle"); - } - session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd)); + int32_t errCode = 0; + UniqueFd fd = proxy->GetFileHandle(fileName, errCode); + session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd), errCode); } else { session_->SetExtFileNameRequest(bundleName, fileName); } @@ -936,11 +934,9 @@ void Service::ExtStart(const string &bundleName) session_->GetServiceReverseProxy()->RestoreOnBundleStarted(ret, bundleName); auto fileNameVec = session_->GetExtFileNameRequest(bundleName); for (auto &fileName : fileNameVec) { - UniqueFd fd = proxy->GetFileHandle(fileName); - if (fd < 0) { - HILOGE("Failed to extension file handle"); - } - session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd)); + int32_t errCode = 0; + UniqueFd fd = proxy->GetFileHandle(fileName, errCode); + session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd), errCode); } return; } catch (const BError &e) { diff --git a/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp b/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp index 66924a4e3d46713de00e731fbbfbb183e765af33..82488e2a2aeff44b02fe89de0e5501bd0bd81cad 100644 --- a/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp +++ b/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp @@ -171,13 +171,13 @@ void ServiceReverseProxy::RestoreOnAllBundlesFinished(int32_t errCode) } } -void ServiceReverseProxy::RestoreOnFileReady(string bundleName, string fileName, int fd) +void ServiceReverseProxy::RestoreOnFileReady(string bundleName, string fileName, int fd, int32_t errCode) { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; bool fdFlag = fd < 0 ? false : true; if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(fileName) || - !data.WriteBool(fdFlag) || (fdFlag == true && !data.WriteFileDescriptor(fd))) { + !data.WriteBool(fdFlag) || (fdFlag == true && !data.WriteFileDescriptor(fd)) || !data.WriteInt32(errCode)) { throw BError(BError::Codes::SA_BROKEN_IPC); } diff --git a/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp b/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp index fc21746d4152e6a58ebe8359744807e1d487cf40..2afa454c9ff9d94206bc90827957f87b997f151c 100644 --- a/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp +++ b/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp @@ -26,7 +26,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; const int INVALID_FD = -1; -UniqueFd SvcExtensionProxy::GetFileHandle(const string &fileName) +UniqueFd SvcExtensionProxy::GetFileHandle(const string &fileName, int32_t &errCode) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("Start"); @@ -50,6 +50,7 @@ UniqueFd SvcExtensionProxy::GetFileHandle(const string &fileName) HILOGI("Successful"); bool fdFlag = reply.ReadBool(); + errCode = reply.ReadInt32(); UniqueFd fd = UniqueFd(INVALID_FD); if (fdFlag == true) { fd = UniqueFd(reply.ReadFileDescriptor()); diff --git a/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp b/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp index 4b77fba4c4a53b73613f3bc94578f3244ab0c430..89d28b3f3986217ceb5973ba024bc2f4ce8d7eea 100644 --- a/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp +++ b/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp @@ -73,13 +73,13 @@ ErrCode BSessionRestoreAsync::AppendBundles(UniqueFd remoteCap, vectorBackupOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceReverseTest-an exception occurred by BackupOnFileReady."; @@ -447,7 +447,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_RestoreOnFileReady_0100, GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_RestoreOnFileReady_0100"; try { Init(IServiceReverse::Scenario::RESTORE); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); service_->BackupOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); } catch (...) { EXPECT_TRUE(false); @@ -470,7 +470,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_RestoreOnFileReady_0101, GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_RestoreOnFileReady_0101"; try { Init(IServiceReverse::Scenario::BACKUP); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceReverseTest-an exception occurred by RestoreOnFileReady."; @@ -492,7 +492,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_RestoreOnFileReady_0102, GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_RestoreOnFileReady_0102"; try { Init(IServiceReverse::Scenario::RESTORE, 1); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceReverseTest-an exception occurred by RestoreOnFileReady."; @@ -715,7 +715,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_0200, testing::ext::TestS GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_0200"; try { Init(IServiceReverse::Scenario::RESTORE, 1); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); service_->RestoreOnBundleStarted(BError(BError::Codes::OK), BUNDLE_NAME); service_->RestoreOnBundleFinished(BError(BError::Codes::OK), BUNDLE_NAME); service_->RestoreOnAllBundlesFinished(BError(BError::Codes::OK)); @@ -740,7 +740,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_0201, testing::ext::TestS GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_0201"; try { Init(IServiceReverse::Scenario::RESTORE, 0); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); service_->RestoreOnBundleStarted(BError(BError::Codes::OK), BUNDLE_NAME); service_->RestoreOnBundleFinished(BError(BError::Codes::OK), BUNDLE_NAME); service_->RestoreOnAllBundlesFinished(BError(BError::Codes::OK)); diff --git a/tests/unittests/backup_sa/module_ipc/service_reverse_proxy_test.cpp b/tests/unittests/backup_sa/module_ipc/service_reverse_proxy_test.cpp index 9f766621ef88107a18435138c48c21c1cf19ee6a..db46b1cf285477d41a92109cae79155f214f0f2d 100644 --- a/tests/unittests/backup_sa/module_ipc/service_reverse_proxy_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_reverse_proxy_test.cpp @@ -840,9 +840,13 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 .WillOnce(Invoke(mock_.GetRefPtr(), &ServiceReverseMock::InvokeSendRequest)); TestManager tm("ServiceReverseProxyTest_GetFd_0200"); + int32_t errCode = 0; std::string filePath = tm.GetRootDirCurTest().append(FILE_NAME); UniqueFd fd(open(filePath.data(), O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, fd); + if (fd < 0) { + errCode = BError::GetCodeByErrno(errno); + } + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, fd, errCode); EXPECT_TRUE(true); } catch (...) { EXPECT_TRUE(false); @@ -866,7 +870,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 try { try { EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); @@ -875,7 +879,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 try { EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); @@ -884,7 +888,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 try { EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); @@ -913,7 +917,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); @@ -924,7 +928,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteFileDescriptor(_)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); diff --git a/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp b/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp index 2011f852f80517dd6ceaf8ca70d40b1455c50c2b..9bf519c47db73d2d442b1bb679ed17b36b05b54d 100644 --- a/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp @@ -69,15 +69,16 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_GetFileHandle_0100, test GTEST_LOG_(INFO) << "SvcExtensionProxyTest-begin SUB_Ext_Extension_proxy_GetFileHandle_0100"; try { string fileName = "1.tar"; + int32_t errCode = 0; EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(false)); - UniqueFd fd = proxy_->GetFileHandle(fileName); + UniqueFd fd = proxy_->GetFileHandle(fileName, errCode); EXPECT_LT(fd, BError(BError::Codes::OK)); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(EPERM)); - fd = proxy_->GetFileHandle(fileName); + fd = proxy_->GetFileHandle(fileName, errCode); EXPECT_LT(fd, BError(BError::Codes::OK)); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); @@ -85,14 +86,14 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_GetFileHandle_0100, test EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(NO_ERROR)); EXPECT_CALL(*messageParcelMock_, ReadBool()).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, ReadFileDescriptor()).WillOnce(Return(-1)); - fd = proxy_->GetFileHandle(fileName); + fd = proxy_->GetFileHandle(fileName, errCode); EXPECT_LT(fd, BError(BError::Codes::OK)); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(NO_ERROR)); EXPECT_CALL(*messageParcelMock_, ReadBool()).WillOnce(Return(false)); - fd = proxy_->GetFileHandle(fileName); + fd = proxy_->GetFileHandle(fileName, errCode); EXPECT_LT(fd, BError(BError::Codes::OK)); } catch (...) { EXPECT_TRUE(false); diff --git a/tests/unittests/backup_tools/backup_tool/tools_op_restore_async_test.cpp b/tests/unittests/backup_tools/backup_tool/tools_op_restore_async_test.cpp index 0205bbd69b9848ced495aed316268c1e5b9c4c4a..6cdfe706146bbf24cea13486c65d334293c9ebe7 100644 --- a/tests/unittests/backup_tools/backup_tool/tools_op_restore_async_test.cpp +++ b/tests/unittests/backup_tools/backup_tool/tools_op_restore_async_test.cpp @@ -197,7 +197,7 @@ HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0300, testing::ext::Tes fileInfo.fileName = "manage.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); @@ -227,7 +227,7 @@ HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0301, testing::ext::Tes fileInfo.fileName = "test.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); diff --git a/tests/unittests/backup_tools/backup_tool/tools_op_restore_test.cpp b/tests/unittests/backup_tools/backup_tool/tools_op_restore_test.cpp index 80d4fcaf53cca84a0e8b3bf3c6e79f8de816ea13..a35d5107293800c9273862d4e1a07be8ed8dfba6 100644 --- a/tests/unittests/backup_tools/backup_tool/tools_op_restore_test.cpp +++ b/tests/unittests/backup_tools/backup_tool/tools_op_restore_test.cpp @@ -279,7 +279,7 @@ HWTEST_F(ToolsOpRestoreTest, tools_op_restore_OnFileReady_0500, testing::ext::Te fileInfo.fileName = "manage.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); @@ -310,7 +310,7 @@ HWTEST_F(ToolsOpRestoreTest, tools_op_restore_OnFileReady_0501, testing::ext::Te fileInfo.fileName = "test.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); @@ -340,7 +340,7 @@ HWTEST_F(ToolsOpRestoreTest, tools_op_restore_OnFileReady_0502, testing::ext::Te fileInfo.fileName = "/test.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); @@ -370,7 +370,7 @@ HWTEST_F(ToolsOpRestoreTest, tools_op_restore_OnFileReady_0503, testing::ext::Te fileInfo.fileName = " "; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); diff --git a/tools/backup_tool/src/tools_op_restore.cpp b/tools/backup_tool/src/tools_op_restore.cpp index 37cb712192f0a4e9b866fc2b77f7fc866f53d4e0..ff51241acea51ef6c18f5fc19cd953305d187bf2 100644 --- a/tools/backup_tool/src/tools_op_restore.cpp +++ b/tools/backup_tool/src/tools_op_restore.cpp @@ -116,7 +116,7 @@ static string GenHelpMsg() "\t\t--bundle\t\t This parameter is bundleName."; } -static void OnFileReady(shared_ptr ctx, const BFileInfo &fileInfo, UniqueFd fd) +static void OnFileReady(shared_ptr ctx, const BFileInfo &fileInfo, UniqueFd fd, int32_t errCode) { printf("FileReady owner = %s, fileName = %s, sn = %u, fd = %d\n", fileInfo.owner.c_str(), fileInfo.fileName.c_str(), fileInfo.sn, fd.Get()); @@ -251,13 +251,13 @@ static int32_t InitRestoreSession(shared_ptr ctx) if (!ctx) { throw BError(BError::Codes::TOOL_INVAL_ARG, generic_category().message(errno)); } - ctx->session_ = BSessionRestore::Init( - BSessionRestore::Callbacks {.onFileReady = bind(OnFileReady, ctx, placeholders::_1, placeholders::_2), - .onBundleStarted = bind(OnBundleStarted, ctx, placeholders::_1, placeholders::_2), - .onBundleFinished = bind(OnBundleFinished, ctx, placeholders::_1, placeholders::_2), - .onAllBundlesFinished = bind(OnAllBundlesFinished, ctx, placeholders::_1), - .onResultReport = bind(OnResultReport, ctx, placeholders::_1), - .onBackupServiceDied = bind(OnBackupServiceDied, ctx)}); + ctx->session_ = BSessionRestore::Init(BSessionRestore::Callbacks { + .onFileReady = bind(OnFileReady, ctx, placeholders::_1, placeholders::_2, placeholders::_3), + .onBundleStarted = bind(OnBundleStarted, ctx, placeholders::_1, placeholders::_2), + .onBundleFinished = bind(OnBundleFinished, ctx, placeholders::_1, placeholders::_2), + .onAllBundlesFinished = bind(OnAllBundlesFinished, ctx, placeholders::_1), + .onResultReport = bind(OnResultReport, ctx, placeholders::_1), + .onBackupServiceDied = bind(OnBackupServiceDied, ctx)}); if (ctx->session_ == nullptr) { printf("Failed to init restore\n"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); diff --git a/tools/backup_tool/src/tools_op_restore_async.cpp b/tools/backup_tool/src/tools_op_restore_async.cpp index 93b4826c38f56d0d979c1a90893a06ea3549b621..35c60c07a1e55ab30894e5ef9826c1762d16de0f 100644 --- a/tools/backup_tool/src/tools_op_restore_async.cpp +++ b/tools/backup_tool/src/tools_op_restore_async.cpp @@ -96,7 +96,7 @@ static string GenHelpMsg() "simulates the application recovery scenario.\n"; } -static void OnFileReady(shared_ptr ctx, const BFileInfo &fileInfo, UniqueFd fd) +static void OnFileReady(shared_ptr ctx, const BFileInfo &fileInfo, UniqueFd fd, int32_t errCode) { printf("FileReady owner = %s, fileName = %s, sn = %u, fd = %d\n", fileInfo.owner.c_str(), fileInfo.fileName.c_str(), fileInfo.sn, fd.Get()); @@ -378,7 +378,7 @@ static int32_t InitArg(const string &pathCapFile, ctx->fileNums_[bundleNames[i]] = ToolsOp::GetFIleNums(bundleNames[i]); } ctx->session_ = BSessionRestoreAsync::Init(BSessionRestoreAsync::Callbacks { - .onFileReady = bind(OnFileReady, ctx, placeholders::_1, placeholders::_2), + .onFileReady = bind(OnFileReady, ctx, placeholders::_1, placeholders::_2, placeholders::_3), .onBundleStarted = bind(OnBundleStarted, ctx, placeholders::_1, placeholders::_2), .onBundleFinished = bind(OnBundleFinished, ctx, placeholders::_1, placeholders::_2), .onAllBundlesFinished = bind(OnAllBundlesFinished, ctx, placeholders::_1), diff --git a/utils/include/b_error/b_error.h b/utils/include/b_error/b_error.h index 123105ab88d2ac950b17dbca3c0339b72c1f5c23..d588cb76d65976507594d0d21101c4ab49ddbb5c 100644 --- a/utils/include/b_error/b_error.h +++ b/utils/include/b_error/b_error.h @@ -282,10 +282,18 @@ private: }; static inline const std::map sysErrnoCodeTable_ { + {EPERM, BackupErrorCode::E_IPCSS}, {EIO, BackupErrorCode::E_IO}, + {EBADF, BackupErrorCode::E_IO}, + {EACCES, BackupErrorCode::E_IO}, + {EFBIG, BackupErrorCode::E_IO}, {ENOMEM, BackupErrorCode::E_NOMEM}, - {ENOENT, BackupErrorCode::E_NOTEXIST}, - {EPERM, BackupErrorCode::E_PERM}, + {EMFILE, BackupErrorCode::E_NOMEM}, + {ENOENT, BackupErrorCode::E_INVAL}, + {ENOTDIR, BackupErrorCode::E_INVAL}, + {EISDIR, BackupErrorCode::E_INVAL}, + {ENAMETOOLONG, BackupErrorCode::E_INVAL}, + {ENOSPC, BackupErrorCode::E_NOSPC}, }; private: diff --git a/utils/src/b_error/b_error.cpp b/utils/src/b_error/b_error.cpp index 79e76761f73cebb5e6cee8cd36cf6c0ac546879e..5d13b4ec6b8800db1043bcf26851e467e388c88c 100644 --- a/utils/src/b_error/b_error.cpp +++ b/utils/src/b_error/b_error.cpp @@ -68,10 +68,10 @@ int BError::GetCodeByErrno(int32_t errnoSys) if (errnoSys == 0) { return 0; } + HILOGE("Unknown code : %{public}d", errnoSys); if (sysErrnoCodeTable_.find(errnoSys) != sysErrnoCodeTable_.end()) { return sysErrnoCodeTable_.at(errnoSys); } - HILOGE("Unknown code : %{public}d", errnoSys); - return BackupErrorCode::E_IO; + return BackupErrorCode::E_UKERR; } } // namespace OHOS::FileManagement::Backup \ No newline at end of file