1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef BASE_STARTUP_PARAM_COMMON_H
17#define BASE_STARTUP_PARAM_COMMON_H
18#include <stdio.h>
19#include <stdint.h>
20#include <stdarg.h>
21#ifndef __LITEOS_M__
22#include <pthread.h>
23#endif
24#include "param_atomic.h"
25#ifdef __cplusplus
26#if __cplusplus
27extern "C" {
28#endif
29#endif
30
31// support mutex
32#ifndef __LITEOS_M__
33typedef struct {
34    pthread_rwlock_t rwlock;
35} ParamRWMutex;
36
37typedef struct {
38    pthread_mutex_t mutex;
39} ParamMutex;
40#else
41typedef struct {
42    uint32_t mutex;
43} ParamRWMutex;
44
45typedef struct {
46    uint32_t mutex;
47} ParamMutex;
48#endif
49
50typedef struct {
51    int shmid;
52} MemHandle;
53
54typedef struct {
55    uint32_t left;
56    uint32_t right;
57    uint32_t child;
58    uint32_t labelIndex;
59    uint32_t dataIndex;
60    uint16_t selinuxLabel;
61    uint16_t length;
62    char key[0];
63} ParamTrieNode;
64
65#define PARAM_FLAGS_MODIFY 0x80000000
66#define PARAM_FLAGS_TRIGGED 0x40000000
67#define PARAM_FLAGS_WAITED 0x20000000
68#define PARAM_FLAGS_PERSIST 0x10000000
69#define PARAM_FLAGS_COMMITID 0x0000ffff
70
71#define PARAM_TYPE_MASK   0x0f
72#define PARAM_TYPE_STRING 0x00
73#define PARAM_TYPE_INT    0x01
74#define PARAM_TYPE_BOOL   0x02
75
76typedef struct {
77    ATOMIC_UINT32 commitId;
78    uint8_t type;
79    uint8_t keyLength;
80    uint16_t valueLength;
81    char data[0];
82} ParamNode;
83
84typedef struct {
85    uid_t uid;
86    gid_t gid;
87    uint32_t selinuxIndex;
88    uint16_t mode;
89    uint8_t type;
90    uint8_t length;
91    uint32_t memberNum;
92    uid_t members[0];
93} ParamSecurityNode;
94
95typedef struct {
96    ATOMIC_LLONG commitId;
97    ATOMIC_LLONG commitPersistId;
98    uint32_t trieNodeCount;
99    uint32_t paramNodeCount;
100    uint32_t securityNodeCount;
101    uint32_t currOffset;
102    uint32_t spaceSizeOffset;
103    uint32_t firstNode;
104    uint32_t dataSize;
105    char data[0];
106} ParamTrieHeader;
107
108typedef struct WorkSpace_ {
109    unsigned int flags;
110    MemHandle memHandle;
111    ParamTrieHeader *area;
112    ATOMIC_UINT32 rwSpaceLock;
113    uint32_t spaceSize;
114    uint32_t spaceIndex;
115    ParamRWMutex rwlock;
116    char fileName[0];
117} WorkSpace;
118
119typedef struct {
120    uint8_t updaterMode;
121    void (*logFunc)(int logLevel, uint32_t domain, const char *tag, const char *fmt, va_list vargs);
122    int (*setfilecon)(const char *name, const char *content);
123    int (*getServiceGroupIdByPid)(pid_t pid, gid_t *gids, uint32_t gidSize);
124} PARAM_WORKSPACE_OPS;
125
126typedef struct CachedParameter_ {
127    struct WorkSpace_ *workspace;
128    const char *(*cachedParameterCheck)(struct CachedParameter_ *param, int *changed);
129    long long spaceCommitId;
130    uint32_t dataCommitId;
131    uint32_t dataIndex;
132    uint32_t bufferLen;
133    uint32_t nameLen;
134    char *paramValue;
135    char data[0];
136} CachedParameter;
137
138typedef void *CachedHandle;
139
140typedef struct _SpaceSize {
141    uint32_t maxLabelIndex;
142    uint32_t spaceSize[0];
143} WorkSpaceSize;
144
145#ifdef __cplusplus
146#if __cplusplus
147}
148#endif
149#endif
150#endif  // BASE_STARTUP_PARAM_COMMON_H