113acfde9Sopenharmony_ci/* 213acfde9Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 313acfde9Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 413acfde9Sopenharmony_ci * you may not use this file except in compliance with the License. 513acfde9Sopenharmony_ci * You may obtain a copy of the License at 613acfde9Sopenharmony_ci * 713acfde9Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 813acfde9Sopenharmony_ci * 913acfde9Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1013acfde9Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1113acfde9Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1213acfde9Sopenharmony_ci * See the License for the specific language governing permissions and 1313acfde9Sopenharmony_ci * limitations under the License. 1413acfde9Sopenharmony_ci */ 1513acfde9Sopenharmony_ci 1613acfde9Sopenharmony_ci#include <fstream> 1713acfde9Sopenharmony_ci#include <unistd.h> 1813acfde9Sopenharmony_ci 1913acfde9Sopenharmony_ci#ifdef EXTERNAL_STORAGE_MANAGER 2013acfde9Sopenharmony_ci#include "disk/disk_config.h" 2113acfde9Sopenharmony_ci#include "disk/disk_info.h" 2213acfde9Sopenharmony_ci#include "disk/disk_manager.h" 2313acfde9Sopenharmony_ci#include "netlink/netlink_manager.h" 2413acfde9Sopenharmony_ci#endif 2513acfde9Sopenharmony_ci#include "ipc/storage_daemon.h" 2613acfde9Sopenharmony_ci#include "ipc_skeleton.h" 2713acfde9Sopenharmony_ci#include "iservice_registry.h" 2813acfde9Sopenharmony_ci#include "storage_service_log.h" 2913acfde9Sopenharmony_ci#include "system_ability_definition.h" 3013acfde9Sopenharmony_ci#include "user/user_manager.h" 3113acfde9Sopenharmony_ci#include "utils/string_utils.h" 3213acfde9Sopenharmony_ci#ifdef DFS_SERVICE 3313acfde9Sopenharmony_ci#include "cloud_daemon_manager.h" 3413acfde9Sopenharmony_ci#endif 3513acfde9Sopenharmony_ci#ifdef SUPPORT_OPEN_SOURCE_MTP_DEVICE 3613acfde9Sopenharmony_ci#include "mtp/mtp_device_monitor.h" 3713acfde9Sopenharmony_ci#endif 3813acfde9Sopenharmony_ciusing namespace OHOS; 3913acfde9Sopenharmony_ci#ifdef DFS_SERVICE 4013acfde9Sopenharmony_ciusing namespace OHOS::FileManagement::CloudFile; 4113acfde9Sopenharmony_ci#endif 4213acfde9Sopenharmony_ciusing CloudListener = StorageDaemon::StorageDaemon::SystemAbilityStatusChangeListener; 4313acfde9Sopenharmony_ci 4413acfde9Sopenharmony_ci#ifdef EXTERNAL_STORAGE_MANAGER 4513acfde9Sopenharmony_ciconst int CONFIG_PARAM_NUM = 6; 4613acfde9Sopenharmony_cistatic const std::string CONFIG_PTAH = "/system/etc/storage_daemon/disk_config"; 4713acfde9Sopenharmony_ci 4813acfde9Sopenharmony_cistatic bool ParasConfig(StorageDaemon::DiskManager *dm) 4913acfde9Sopenharmony_ci{ 5013acfde9Sopenharmony_ci if (dm == nullptr) { 5113acfde9Sopenharmony_ci LOGE("Unable to get DiskManger"); 5213acfde9Sopenharmony_ci return false; 5313acfde9Sopenharmony_ci } 5413acfde9Sopenharmony_ci std::ifstream infile; 5513acfde9Sopenharmony_ci infile.open(CONFIG_PTAH); 5613acfde9Sopenharmony_ci if (!infile) { 5713acfde9Sopenharmony_ci LOGE("Cannot open config"); 5813acfde9Sopenharmony_ci return false; 5913acfde9Sopenharmony_ci } 6013acfde9Sopenharmony_ci 6113acfde9Sopenharmony_ci while (infile) { 6213acfde9Sopenharmony_ci std::string line; 6313acfde9Sopenharmony_ci std::getline(infile, line); 6413acfde9Sopenharmony_ci if (line.empty()) { 6513acfde9Sopenharmony_ci LOGI("Param config complete"); 6613acfde9Sopenharmony_ci break; 6713acfde9Sopenharmony_ci } 6813acfde9Sopenharmony_ci 6913acfde9Sopenharmony_ci std::string token = " "; 7013acfde9Sopenharmony_ci auto split = StorageDaemon::SplitLine(line, token); 7113acfde9Sopenharmony_ci if (split.size() != CONFIG_PARAM_NUM) { 7213acfde9Sopenharmony_ci LOGE("Invalids config line: number of parameters is incorrect"); 7313acfde9Sopenharmony_ci continue; 7413acfde9Sopenharmony_ci } 7513acfde9Sopenharmony_ci 7613acfde9Sopenharmony_ci auto it = split.begin(); 7713acfde9Sopenharmony_ci if (*it != "sysPattern") { 7813acfde9Sopenharmony_ci LOGE("Invalids config line: no sysPattern"); 7913acfde9Sopenharmony_ci continue; 8013acfde9Sopenharmony_ci } 8113acfde9Sopenharmony_ci 8213acfde9Sopenharmony_ci auto sysPattern = *(++it); 8313acfde9Sopenharmony_ci if (*(++it) != "label") { 8413acfde9Sopenharmony_ci LOGE("Invalids config line: no label"); 8513acfde9Sopenharmony_ci continue; 8613acfde9Sopenharmony_ci } 8713acfde9Sopenharmony_ci 8813acfde9Sopenharmony_ci auto label = *(++it); 8913acfde9Sopenharmony_ci if (*(++it) != "flag") { 9013acfde9Sopenharmony_ci LOGE("Invalids config line: no flag"); 9113acfde9Sopenharmony_ci continue; 9213acfde9Sopenharmony_ci } 9313acfde9Sopenharmony_ci 9413acfde9Sopenharmony_ci it++; 9513acfde9Sopenharmony_ci int flag = std::atoi((*it).c_str()); 9613acfde9Sopenharmony_ci auto diskConfig = std::make_shared<StorageDaemon::DiskConfig>(sysPattern, label, flag); 9713acfde9Sopenharmony_ci dm->AddDiskConfig(diskConfig); 9813acfde9Sopenharmony_ci } 9913acfde9Sopenharmony_ci 10013acfde9Sopenharmony_ci infile.close(); 10113acfde9Sopenharmony_ci return true; 10213acfde9Sopenharmony_ci} 10313acfde9Sopenharmony_ci#endif 10413acfde9Sopenharmony_ci 10513acfde9Sopenharmony_cistatic const int32_t SLEEP_TIME_INTERVAL_3MS = 3 * 1000; 10613acfde9Sopenharmony_ci 10713acfde9Sopenharmony_ciint main() 10813acfde9Sopenharmony_ci{ 10913acfde9Sopenharmony_ci LOGI("storage_daemon start"); 11013acfde9Sopenharmony_ci#ifdef EXTERNAL_STORAGE_MANAGER 11113acfde9Sopenharmony_ci StorageDaemon::NetlinkManager *nm = StorageDaemon::NetlinkManager::Instance(); 11213acfde9Sopenharmony_ci if (!nm) { 11313acfde9Sopenharmony_ci LOGE("Unable to create NetlinkManager"); 11413acfde9Sopenharmony_ci return -1; 11513acfde9Sopenharmony_ci }; 11613acfde9Sopenharmony_ci 11713acfde9Sopenharmony_ci if (nm->Start()) { 11813acfde9Sopenharmony_ci LOGE("Unable to start NetlinkManager"); 11913acfde9Sopenharmony_ci return -1; 12013acfde9Sopenharmony_ci } 12113acfde9Sopenharmony_ci 12213acfde9Sopenharmony_ci StorageDaemon::DiskManager *dm = StorageDaemon::DiskManager::Instance(); 12313acfde9Sopenharmony_ci if (!dm) { 12413acfde9Sopenharmony_ci LOGE("Unable to create DiskManger"); 12513acfde9Sopenharmony_ci return -1; 12613acfde9Sopenharmony_ci } 12713acfde9Sopenharmony_ci 12813acfde9Sopenharmony_ci if (!ParasConfig(dm)) { 12913acfde9Sopenharmony_ci LOGE("Paras config failed"); 13013acfde9Sopenharmony_ci return -1; 13113acfde9Sopenharmony_ci } 13213acfde9Sopenharmony_ci#endif 13313acfde9Sopenharmony_ci 13413acfde9Sopenharmony_ci#ifdef SUPPORT_OPEN_SOURCE_MTP_DEVICE 13513acfde9Sopenharmony_ci DelayedSingleton<OHOS::StorageDaemon::MtpDeviceMonitor>::GetInstance()->StartMonitor(); 13613acfde9Sopenharmony_ci#endif 13713acfde9Sopenharmony_ci 13813acfde9Sopenharmony_ci do { 13913acfde9Sopenharmony_ci auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 14013acfde9Sopenharmony_ci if (samgr != nullptr) { 14113acfde9Sopenharmony_ci LOGE("samgr is not null"); 14213acfde9Sopenharmony_ci sptr<StorageDaemon::StorageDaemon> sd(new StorageDaemon::StorageDaemon()); 14313acfde9Sopenharmony_ci int ret = samgr->AddSystemAbility(STORAGE_MANAGER_DAEMON_ID, sd); 14413acfde9Sopenharmony_ci LOGI("AddSystemAbility: ret: %{public}d, errno: %{public}d", ret, errno); 14513acfde9Sopenharmony_ci sptr<CloudListener> listenter(new CloudListener()); 14613acfde9Sopenharmony_ci ret = samgr->SubscribeSystemAbility(FILEMANAGEMENT_CLOUD_DAEMON_SERVICE_SA_ID, listenter); 14713acfde9Sopenharmony_ci LOGI("SubscribeSystemAbility for CLOUD_DAEMON_SERVICE: ret: %{public}d, errno: %{public}d", ret, errno); 14813acfde9Sopenharmony_ci ret = samgr->SubscribeSystemAbility(ACCESS_TOKEN_MANAGER_SERVICE_ID, listenter); 14913acfde9Sopenharmony_ci LOGI("SubscribeSystemAbility for MANAGER_SERVICE: ret: %{public}d, errno: %{public}d", ret, errno); 15013acfde9Sopenharmony_ci break; 15113acfde9Sopenharmony_ci } 15213acfde9Sopenharmony_ci usleep(SLEEP_TIME_INTERVAL_3MS); 15313acfde9Sopenharmony_ci } while (true); 15413acfde9Sopenharmony_ci LOGE("samgr GetSystemAbilityManager finish"); 15513acfde9Sopenharmony_ci IPCSkeleton::JoinWorkThread(); 15613acfde9Sopenharmony_ci 15713acfde9Sopenharmony_ci return 0; 15813acfde9Sopenharmony_ci} 159