1fb299fa2Sopenharmony_ci/* 2fb299fa2Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at 6fb299fa2Sopenharmony_ci * 7fb299fa2Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb299fa2Sopenharmony_ci * 9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and 13fb299fa2Sopenharmony_ci * limitations under the License. 14fb299fa2Sopenharmony_ci */ 15fb299fa2Sopenharmony_ci 16fb299fa2Sopenharmony_ci#include "update_hdi_client.h" 17fb299fa2Sopenharmony_ci 18fb299fa2Sopenharmony_ci#include <cerrno> 19fb299fa2Sopenharmony_ci#include <dlfcn.h> 20fb299fa2Sopenharmony_ci 21fb299fa2Sopenharmony_ci#include "log/log.h" 22fb299fa2Sopenharmony_ci 23fb299fa2Sopenharmony_cinamespace Updater { 24fb299fa2Sopenharmony_ciconstexpr const char *HDI_LIB_NAME = "libupdate_hdi_impl.z.so"; 25fb299fa2Sopenharmony_ci 26fb299fa2Sopenharmony_ciUpdateHdiClient &UpdateHdiClient::GetInstance() 27fb299fa2Sopenharmony_ci{ 28fb299fa2Sopenharmony_ci static UpdateHdiClient instance; 29fb299fa2Sopenharmony_ci return instance; 30fb299fa2Sopenharmony_ci} 31fb299fa2Sopenharmony_ci 32fb299fa2Sopenharmony_ciUpdateHdiClient::~UpdateHdiClient() 33fb299fa2Sopenharmony_ci{ 34fb299fa2Sopenharmony_ci CloseLibrary(); 35fb299fa2Sopenharmony_ci} 36fb299fa2Sopenharmony_ci 37fb299fa2Sopenharmony_ciint32_t UpdateHdiClient::GetLockStatus(bool &status) 38fb299fa2Sopenharmony_ci{ 39fb299fa2Sopenharmony_ci if (updateInterface_ == nullptr && !Init()) { 40fb299fa2Sopenharmony_ci LOG(ERROR) << "updateInterface_ is null"; 41fb299fa2Sopenharmony_ci return -1; 42fb299fa2Sopenharmony_ci } 43fb299fa2Sopenharmony_ci return updateInterface_->GetLockStatus(status); 44fb299fa2Sopenharmony_ci} 45fb299fa2Sopenharmony_ci 46fb299fa2Sopenharmony_cibool UpdateHdiClient::Init() 47fb299fa2Sopenharmony_ci{ 48fb299fa2Sopenharmony_ci if (updateInterface_ != nullptr) { 49fb299fa2Sopenharmony_ci LOG(INFO) << "updateInterface_ has loaded"; 50fb299fa2Sopenharmony_ci return true; 51fb299fa2Sopenharmony_ci } 52fb299fa2Sopenharmony_ci return LoadLibrary(); 53fb299fa2Sopenharmony_ci} 54fb299fa2Sopenharmony_ci 55fb299fa2Sopenharmony_cibool UpdateHdiClient::LoadLibrary() 56fb299fa2Sopenharmony_ci{ 57fb299fa2Sopenharmony_ci constexpr const char *getInstance = "GetInterfaceInstance"; 58fb299fa2Sopenharmony_ci if (updateInterface_ != nullptr) { 59fb299fa2Sopenharmony_ci LOG(INFO) << "updateInterface_ has loaded"; 60fb299fa2Sopenharmony_ci return true; 61fb299fa2Sopenharmony_ci } 62fb299fa2Sopenharmony_ci 63fb299fa2Sopenharmony_ci handler_ = dlopen(HDI_LIB_NAME, RTLD_LAZY); 64fb299fa2Sopenharmony_ci if (handler_ == nullptr) { 65fb299fa2Sopenharmony_ci LOG(ERROR) << "open " << HDI_LIB_NAME << " fail"; 66fb299fa2Sopenharmony_ci return false; 67fb299fa2Sopenharmony_ci } 68fb299fa2Sopenharmony_ci 69fb299fa2Sopenharmony_ci auto getInterface = reinterpret_cast<IUpdateInterface *(*)()>(dlsym(handler_, getInstance)); 70fb299fa2Sopenharmony_ci if (getInterface == nullptr) { 71fb299fa2Sopenharmony_ci LOG(ERROR) << "can not find " << getInstance; 72fb299fa2Sopenharmony_ci CloseLibrary(); 73fb299fa2Sopenharmony_ci return false; 74fb299fa2Sopenharmony_ci } 75fb299fa2Sopenharmony_ci 76fb299fa2Sopenharmony_ci updateInterface_ = getInterface(); 77fb299fa2Sopenharmony_ci if (updateInterface_ == nullptr) { 78fb299fa2Sopenharmony_ci LOG(ERROR) << "updateInterface_ is null"; 79fb299fa2Sopenharmony_ci CloseLibrary(); 80fb299fa2Sopenharmony_ci return false; 81fb299fa2Sopenharmony_ci } 82fb299fa2Sopenharmony_ci LOG(INFO) << "load " << HDI_LIB_NAME << " success"; 83fb299fa2Sopenharmony_ci return true; 84fb299fa2Sopenharmony_ci} 85fb299fa2Sopenharmony_ci 86fb299fa2Sopenharmony_civoid UpdateHdiClient::CloseLibrary() 87fb299fa2Sopenharmony_ci{ 88fb299fa2Sopenharmony_ci if (handler_ == nullptr) { 89fb299fa2Sopenharmony_ci LOG(INFO) << HDI_LIB_NAME << "is already closed"; 90fb299fa2Sopenharmony_ci return; 91fb299fa2Sopenharmony_ci } 92fb299fa2Sopenharmony_ci updateInterface_ = nullptr; 93fb299fa2Sopenharmony_ci dlclose(handler_); 94fb299fa2Sopenharmony_ci handler_ = nullptr; 95fb299fa2Sopenharmony_ci LOG(INFO) << HDI_LIB_NAME << " is closed"; 96fb299fa2Sopenharmony_ci} 97fb299fa2Sopenharmony_ci} 98