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