1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2023 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 BASE_STARTUP_PARAM_COMMON_H
17d9f0492fSopenharmony_ci#define BASE_STARTUP_PARAM_COMMON_H
18d9f0492fSopenharmony_ci#include <stdio.h>
19d9f0492fSopenharmony_ci#include <stdint.h>
20d9f0492fSopenharmony_ci#include <stdarg.h>
21d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
22d9f0492fSopenharmony_ci#include <pthread.h>
23d9f0492fSopenharmony_ci#endif
24d9f0492fSopenharmony_ci#include "param_atomic.h"
25d9f0492fSopenharmony_ci#ifdef __cplusplus
26d9f0492fSopenharmony_ci#if __cplusplus
27d9f0492fSopenharmony_ciextern "C" {
28d9f0492fSopenharmony_ci#endif
29d9f0492fSopenharmony_ci#endif
30d9f0492fSopenharmony_ci
31d9f0492fSopenharmony_ci// support mutex
32d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
33d9f0492fSopenharmony_citypedef struct {
34d9f0492fSopenharmony_ci    pthread_rwlock_t rwlock;
35d9f0492fSopenharmony_ci} ParamRWMutex;
36d9f0492fSopenharmony_ci
37d9f0492fSopenharmony_citypedef struct {
38d9f0492fSopenharmony_ci    pthread_mutex_t mutex;
39d9f0492fSopenharmony_ci} ParamMutex;
40d9f0492fSopenharmony_ci#else
41d9f0492fSopenharmony_citypedef struct {
42d9f0492fSopenharmony_ci    uint32_t mutex;
43d9f0492fSopenharmony_ci} ParamRWMutex;
44d9f0492fSopenharmony_ci
45d9f0492fSopenharmony_citypedef struct {
46d9f0492fSopenharmony_ci    uint32_t mutex;
47d9f0492fSopenharmony_ci} ParamMutex;
48d9f0492fSopenharmony_ci#endif
49d9f0492fSopenharmony_ci
50d9f0492fSopenharmony_citypedef struct {
51d9f0492fSopenharmony_ci    int shmid;
52d9f0492fSopenharmony_ci} MemHandle;
53d9f0492fSopenharmony_ci
54d9f0492fSopenharmony_citypedef struct {
55d9f0492fSopenharmony_ci    uint32_t left;
56d9f0492fSopenharmony_ci    uint32_t right;
57d9f0492fSopenharmony_ci    uint32_t child;
58d9f0492fSopenharmony_ci    uint32_t labelIndex;
59d9f0492fSopenharmony_ci    uint32_t dataIndex;
60d9f0492fSopenharmony_ci    uint16_t selinuxLabel;
61d9f0492fSopenharmony_ci    uint16_t length;
62d9f0492fSopenharmony_ci    char key[0];
63d9f0492fSopenharmony_ci} ParamTrieNode;
64d9f0492fSopenharmony_ci
65d9f0492fSopenharmony_ci#define PARAM_FLAGS_MODIFY 0x80000000
66d9f0492fSopenharmony_ci#define PARAM_FLAGS_TRIGGED 0x40000000
67d9f0492fSopenharmony_ci#define PARAM_FLAGS_WAITED 0x20000000
68d9f0492fSopenharmony_ci#define PARAM_FLAGS_PERSIST 0x10000000
69d9f0492fSopenharmony_ci#define PARAM_FLAGS_COMMITID 0x0000ffff
70d9f0492fSopenharmony_ci
71d9f0492fSopenharmony_ci#define PARAM_TYPE_MASK   0x0f
72d9f0492fSopenharmony_ci#define PARAM_TYPE_STRING 0x00
73d9f0492fSopenharmony_ci#define PARAM_TYPE_INT    0x01
74d9f0492fSopenharmony_ci#define PARAM_TYPE_BOOL   0x02
75d9f0492fSopenharmony_ci
76d9f0492fSopenharmony_citypedef struct {
77d9f0492fSopenharmony_ci    ATOMIC_UINT32 commitId;
78d9f0492fSopenharmony_ci    uint8_t type;
79d9f0492fSopenharmony_ci    uint8_t keyLength;
80d9f0492fSopenharmony_ci    uint16_t valueLength;
81d9f0492fSopenharmony_ci    char data[0];
82d9f0492fSopenharmony_ci} ParamNode;
83d9f0492fSopenharmony_ci
84d9f0492fSopenharmony_citypedef struct {
85d9f0492fSopenharmony_ci    uid_t uid;
86d9f0492fSopenharmony_ci    gid_t gid;
87d9f0492fSopenharmony_ci    uint32_t selinuxIndex;
88d9f0492fSopenharmony_ci    uint16_t mode;
89d9f0492fSopenharmony_ci    uint8_t type;
90d9f0492fSopenharmony_ci    uint8_t length;
91d9f0492fSopenharmony_ci    uint32_t memberNum;
92d9f0492fSopenharmony_ci    uid_t members[0];
93d9f0492fSopenharmony_ci} ParamSecurityNode;
94d9f0492fSopenharmony_ci
95d9f0492fSopenharmony_citypedef struct {
96d9f0492fSopenharmony_ci    ATOMIC_LLONG commitId;
97d9f0492fSopenharmony_ci    ATOMIC_LLONG commitPersistId;
98d9f0492fSopenharmony_ci    uint32_t trieNodeCount;
99d9f0492fSopenharmony_ci    uint32_t paramNodeCount;
100d9f0492fSopenharmony_ci    uint32_t securityNodeCount;
101d9f0492fSopenharmony_ci    uint32_t currOffset;
102d9f0492fSopenharmony_ci    uint32_t spaceSizeOffset;
103d9f0492fSopenharmony_ci    uint32_t firstNode;
104d9f0492fSopenharmony_ci    uint32_t dataSize;
105d9f0492fSopenharmony_ci    char data[0];
106d9f0492fSopenharmony_ci} ParamTrieHeader;
107d9f0492fSopenharmony_ci
108d9f0492fSopenharmony_citypedef struct WorkSpace_ {
109d9f0492fSopenharmony_ci    unsigned int flags;
110d9f0492fSopenharmony_ci    MemHandle memHandle;
111d9f0492fSopenharmony_ci    ParamTrieHeader *area;
112d9f0492fSopenharmony_ci    ATOMIC_UINT32 rwSpaceLock;
113d9f0492fSopenharmony_ci    uint32_t spaceSize;
114d9f0492fSopenharmony_ci    uint32_t spaceIndex;
115d9f0492fSopenharmony_ci    ParamRWMutex rwlock;
116d9f0492fSopenharmony_ci    char fileName[0];
117d9f0492fSopenharmony_ci} WorkSpace;
118d9f0492fSopenharmony_ci
119d9f0492fSopenharmony_citypedef struct {
120d9f0492fSopenharmony_ci    uint8_t updaterMode;
121d9f0492fSopenharmony_ci    void (*logFunc)(int logLevel, uint32_t domain, const char *tag, const char *fmt, va_list vargs);
122d9f0492fSopenharmony_ci    int (*setfilecon)(const char *name, const char *content);
123d9f0492fSopenharmony_ci    int (*getServiceGroupIdByPid)(pid_t pid, gid_t *gids, uint32_t gidSize);
124d9f0492fSopenharmony_ci} PARAM_WORKSPACE_OPS;
125d9f0492fSopenharmony_ci
126d9f0492fSopenharmony_citypedef struct CachedParameter_ {
127d9f0492fSopenharmony_ci    struct WorkSpace_ *workspace;
128d9f0492fSopenharmony_ci    const char *(*cachedParameterCheck)(struct CachedParameter_ *param, int *changed);
129d9f0492fSopenharmony_ci    long long spaceCommitId;
130d9f0492fSopenharmony_ci    uint32_t dataCommitId;
131d9f0492fSopenharmony_ci    uint32_t dataIndex;
132d9f0492fSopenharmony_ci    uint32_t bufferLen;
133d9f0492fSopenharmony_ci    uint32_t nameLen;
134d9f0492fSopenharmony_ci    char *paramValue;
135d9f0492fSopenharmony_ci    char data[0];
136d9f0492fSopenharmony_ci} CachedParameter;
137d9f0492fSopenharmony_ci
138d9f0492fSopenharmony_citypedef void *CachedHandle;
139d9f0492fSopenharmony_ci
140d9f0492fSopenharmony_citypedef struct _SpaceSize {
141d9f0492fSopenharmony_ci    uint32_t maxLabelIndex;
142d9f0492fSopenharmony_ci    uint32_t spaceSize[0];
143d9f0492fSopenharmony_ci} WorkSpaceSize;
144d9f0492fSopenharmony_ci
145d9f0492fSopenharmony_ci#ifdef __cplusplus
146d9f0492fSopenharmony_ci#if __cplusplus
147d9f0492fSopenharmony_ci}
148d9f0492fSopenharmony_ci#endif
149d9f0492fSopenharmony_ci#endif
150d9f0492fSopenharmony_ci#endif  // BASE_STARTUP_PARAM_COMMON_H