1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#ifndef STARTUP_FS_MANAGER_H
17d9f0492fSopenharmony_ci#define STARTUP_FS_MANAGER_H
18d9f0492fSopenharmony_ci
19d9f0492fSopenharmony_ci#include <stdbool.h>
20d9f0492fSopenharmony_ci#include <stdio.h>
21d9f0492fSopenharmony_ci
22d9f0492fSopenharmony_ci#ifdef __cplusplus
23d9f0492fSopenharmony_ci#if __cplusplus
24d9f0492fSopenharmony_ciextern "C" {
25d9f0492fSopenharmony_ci#endif
26d9f0492fSopenharmony_ci#endif
27d9f0492fSopenharmony_ci
28d9f0492fSopenharmony_ci/* Fs manager flags definition */
29d9f0492fSopenharmony_ci#define FS_MANAGER_CHECK  0x00000001
30d9f0492fSopenharmony_ci#define FS_MANAGER_WAIT  0x00000002
31d9f0492fSopenharmony_ci#define FS_MANAGER_REQUIRED  0x00000004
32d9f0492fSopenharmony_ci#define FS_MANAGER_NOFAIL  0x00000008
33d9f0492fSopenharmony_ci#define FS_MANAGER_HVB  0x00000010
34d9f0492fSopenharmony_ci#define FS_MANAGER_PROJQUOTA  0x00000020
35d9f0492fSopenharmony_ci#define FS_MANAGER_CASEFOLD  0x00000040
36d9f0492fSopenharmony_ci#define FS_MANAGER_COMPRESSION  0x00000080
37d9f0492fSopenharmony_ci#define FS_MANAGER_DEDUP  0x00000100
38d9f0492fSopenharmony_ci#define FS_MANAGER_FORMATTABLE  0x00000200
39d9f0492fSopenharmony_ci#define NAME_SIZE 32
40d9f0492fSopenharmony_ci#define MAX_SLOT 2
41d9f0492fSopenharmony_ci
42d9f0492fSopenharmony_ci#define VALID_FS_MANAGER_FLAGS (FS_MANAGER_CHECK | FS_MANAGER_WAIT | FS_MANAGER_REQUIRED)
43d9f0492fSopenharmony_ci#define FS_MANAGER_FLAGS_ENABLED(fsMgrFlags, flag) (((fsMgrFlags) & FS_MANAGER_##flag) != 0)
44d9f0492fSopenharmony_ci
45d9f0492fSopenharmony_ci#define FM_MANAGER_CHECK_ENABLED(fsMgrFlags) FS_MANAGER_FLAGS_ENABLED((fsMgrFlags), CHECK)
46d9f0492fSopenharmony_ci#define FM_MANAGER_WAIT_ENABLED(fsMgrFlags) FS_MANAGER_FLAGS_ENABLED((fsMgrFlags), WAIT)
47d9f0492fSopenharmony_ci#define FM_MANAGER_REQUIRED_ENABLED(fsMgrFlags) FS_MANAGER_FLAGS_ENABLED((fsMgrFlags), REQUIRED)
48d9f0492fSopenharmony_ci#define FM_MANAGER_NOFAIL_ENABLED(fsMgrFlags) FS_MANAGER_FLAGS_ENABLED((fsMgrFlags), NOFAIL)
49d9f0492fSopenharmony_ci#define FM_MANAGER_FORMATTABLE_ENABLED(fsMgrFlags) FS_MANAGER_FLAGS_ENABLED((fsMgrFlags), FORMATTABLE)
50d9f0492fSopenharmony_ci
51d9f0492fSopenharmony_citypedef enum MountStatus {
52d9f0492fSopenharmony_ci    MOUNT_ERROR = -1,
53d9f0492fSopenharmony_ci    MOUNT_UMOUNTED = 0,
54d9f0492fSopenharmony_ci    MOUNT_MOUNTED = 1,
55d9f0492fSopenharmony_ci} MountStatus;
56d9f0492fSopenharmony_ci
57d9f0492fSopenharmony_citypedef struct FstabItem {
58d9f0492fSopenharmony_ci    char *deviceName;  // Block device name
59d9f0492fSopenharmony_ci    char *mountPoint;  // Mount point
60d9f0492fSopenharmony_ci    char *fsType;      // File system type
61d9f0492fSopenharmony_ci    char *mountOptions;  // File system mount options. readonly, rw, remount etc.
62d9f0492fSopenharmony_ci    unsigned int fsManagerFlags;  // flags defined by fs manager.
63d9f0492fSopenharmony_ci    struct FstabItem *next;
64d9f0492fSopenharmony_ci} FstabItem;
65d9f0492fSopenharmony_ci
66d9f0492fSopenharmony_citypedef struct {
67d9f0492fSopenharmony_ci    struct FstabItem *head;
68d9f0492fSopenharmony_ci    struct FstabItem *tail;
69d9f0492fSopenharmony_ci} Fstab;
70d9f0492fSopenharmony_ci
71d9f0492fSopenharmony_citypedef enum SlotFlag {
72d9f0492fSopenharmony_ci    UNBOOT = 0,
73d9f0492fSopenharmony_ci    ACTIVE = 1,
74d9f0492fSopenharmony_ci} SlotFlag;
75d9f0492fSopenharmony_ci
76d9f0492fSopenharmony_citypedef struct SlotInfo {
77d9f0492fSopenharmony_ci    int slotName;
78d9f0492fSopenharmony_ci    char *slotSuffix;
79d9f0492fSopenharmony_ci    SlotFlag slotFlag;
80d9f0492fSopenharmony_ci    unsigned int retryCount;
81d9f0492fSopenharmony_ci    unsigned int reserved;
82d9f0492fSopenharmony_ci} SlotInfo;
83d9f0492fSopenharmony_ci
84d9f0492fSopenharmony_ciFstab* LoadFstabFromCommandLine(void);
85d9f0492fSopenharmony_ciint GetBootSlots(void);
86d9f0492fSopenharmony_ciint GetCurrentSlot(void);
87d9f0492fSopenharmony_civoid ReleaseFstab(Fstab *fstab);
88d9f0492fSopenharmony_ciFstab *ReadFstabFromFile(const char *file, bool procMounts);
89d9f0492fSopenharmony_ciFstabItem *FindFstabItemForPath(Fstab fstab, const char *path);
90d9f0492fSopenharmony_ciFstabItem* FindFstabItemForMountPoint(Fstab fstab, const char *mp);
91d9f0492fSopenharmony_ciint ParseFstabPerLine(char *str, Fstab *fstab, bool procMounts, const char *separator);
92d9f0492fSopenharmony_ci
93d9f0492fSopenharmony_ciint GetBlockDeviceByMountPoint(const char *mountPoint, const Fstab *fstab, char *deviceName, int nameLen);
94d9f0492fSopenharmony_ciint GetBlockDeviceByName(const char *deviceName, const Fstab *fstab, char* miscDev, size_t size);
95d9f0492fSopenharmony_cibool IsSupportedFilesystem(const char *fsType);
96d9f0492fSopenharmony_ciint DoFormat(const char *devPath, const char *fsType);
97d9f0492fSopenharmony_ciint MountOneItem(FstabItem *item);
98d9f0492fSopenharmony_ciMountStatus GetMountStatusForMountPoint(const char *mp);
99d9f0492fSopenharmony_ciint MountAllWithFstabFile(const char *fstabFile, bool required);
100d9f0492fSopenharmony_ciint MountAllWithFstab(const Fstab *fstab, bool required);
101d9f0492fSopenharmony_ciint UmountAllWithFstabFile(const char *file);
102d9f0492fSopenharmony_ciint MountOneWithFstabFile(const char *fstabFile, const char *devName, bool required);
103d9f0492fSopenharmony_ciint FsManagerDmRemoveDevice(const char *devName);
104d9f0492fSopenharmony_ciunsigned long GetMountFlags(char *mountFlag, char *fsSpecificFlags, size_t fsSpecificFlagSize,
105d9f0492fSopenharmony_ci    const char *mountPoint);
106d9f0492fSopenharmony_ci
107d9f0492fSopenharmony_ciint GetBlockDevicePath(const char *partName, char *path, size_t size);
108d9f0492fSopenharmony_ci
109d9f0492fSopenharmony_ci// Get fscrypt policy if exist
110d9f0492fSopenharmony_ciint LoadFscryptPolicy(char *buf, size_t size);
111d9f0492fSopenharmony_ci#ifdef __cplusplus
112d9f0492fSopenharmony_ci#if __cplusplus
113d9f0492fSopenharmony_ci}
114d9f0492fSopenharmony_ci#endif
115d9f0492fSopenharmony_ci#endif
116d9f0492fSopenharmony_ci
117d9f0492fSopenharmony_ci#endif // STARTUP_FS_MANAGER_H
118