1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2021 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 INIT_UTILS_H
17d9f0492fSopenharmony_ci#define INIT_UTILS_H
18d9f0492fSopenharmony_ci#include <fcntl.h>
19d9f0492fSopenharmony_ci#include <sys/stat.h>
20d9f0492fSopenharmony_ci#include <stdint.h>
21d9f0492fSopenharmony_ci#include <stdbool.h>
22d9f0492fSopenharmony_ci#include <unistd.h>
23d9f0492fSopenharmony_ci#include <time.h>
24d9f0492fSopenharmony_ci
25d9f0492fSopenharmony_ci#include "beget_ext.h"
26d9f0492fSopenharmony_ci
27d9f0492fSopenharmony_ci#ifndef STARTUP_INIT_TEST
28d9f0492fSopenharmony_ci#ifndef INIT_STATIC
29d9f0492fSopenharmony_ci#define INIT_STATIC static
30d9f0492fSopenharmony_ci#endif
31d9f0492fSopenharmony_ci#else
32d9f0492fSopenharmony_ci#ifndef INIT_STATIC
33d9f0492fSopenharmony_ci#define INIT_STATIC
34d9f0492fSopenharmony_ci#endif
35d9f0492fSopenharmony_ci#endif
36d9f0492fSopenharmony_ci
37d9f0492fSopenharmony_ci#ifdef __cplusplus
38d9f0492fSopenharmony_ci#if __cplusplus
39d9f0492fSopenharmony_ciextern "C" {
40d9f0492fSopenharmony_ci#endif
41d9f0492fSopenharmony_ci#endif
42d9f0492fSopenharmony_ci
43d9f0492fSopenharmony_citypedef struct {
44d9f0492fSopenharmony_ci    char *name;
45d9f0492fSopenharmony_ci    int value;
46d9f0492fSopenharmony_ci} InitArgInfo;
47d9f0492fSopenharmony_ci
48d9f0492fSopenharmony_ci#define BASE_MS_UNIT 1000
49d9f0492fSopenharmony_ci#define MAX_INT_LEN 20
50d9f0492fSopenharmony_ci#define HEX_BASE 16
51d9f0492fSopenharmony_ci#define BINARY_BASE 2
52d9f0492fSopenharmony_ci#define OCTAL_BASE 8
53d9f0492fSopenharmony_ci#define DECIMAL_BASE 10
54d9f0492fSopenharmony_ci#define WAIT_MAX_SECOND 5
55d9f0492fSopenharmony_ci#define MAX_BUFFER_LEN 256
56d9f0492fSopenharmony_ci#define CMDLINE_VALUE_LEN_MAX 512
57d9f0492fSopenharmony_ci#define STDERR_HANDLE 2
58d9f0492fSopenharmony_ci#define ARRAY_LENGTH(array) (sizeof((array)) / sizeof((array)[0]))
59d9f0492fSopenharmony_ci#define BOOT_CMD_LINE STARTUP_INIT_UT_PATH"/proc/cmdline"
60d9f0492fSopenharmony_ci
61d9f0492fSopenharmony_ciuid_t DecodeUid(const char *name);
62d9f0492fSopenharmony_cigid_t DecodeGid(const char *name);
63d9f0492fSopenharmony_cichar *ReadFileToBuf(const char *configFile);
64d9f0492fSopenharmony_ciint GetProcCmdlineValue(const char *name, const char *buffer, char *value, int length);
65d9f0492fSopenharmony_cichar *ReadFileData(const char *fileName);
66d9f0492fSopenharmony_ci
67d9f0492fSopenharmony_citypedef struct INIT_TIMING_STAT {
68d9f0492fSopenharmony_ci    struct timespec startTime;
69d9f0492fSopenharmony_ci    struct timespec endTime;
70d9f0492fSopenharmony_ci} INIT_TIMING_STAT;
71d9f0492fSopenharmony_ci
72d9f0492fSopenharmony_citypedef struct NameValuePair {
73d9f0492fSopenharmony_ci    const char *name;
74d9f0492fSopenharmony_ci    const char *nameEnd;
75d9f0492fSopenharmony_ci    const char *value;
76d9f0492fSopenharmony_ci    const char *valueEnd;
77d9f0492fSopenharmony_ci} NAME_VALUE_PAIR;
78d9f0492fSopenharmony_ciint IterateNameValuePairs(const char *src, void (*iterator)(const NAME_VALUE_PAIR *nv, void *context), void *context);
79d9f0492fSopenharmony_ci
80d9f0492fSopenharmony_ciint SplitString(char *srcPtr, const char *del, char **dstPtr, int maxNum);
81d9f0492fSopenharmony_cilong long InitDiffTime(INIT_TIMING_STAT *stat);
82d9f0492fSopenharmony_civoid WaitForFile(const char *source, unsigned int maxSecond);
83d9f0492fSopenharmony_cisize_t WriteAll(int fd, const char *buffer, size_t size);
84d9f0492fSopenharmony_cichar *GetRealPath(const char *source);
85d9f0492fSopenharmony_ciint StringToInt(const char *str, int defaultValue);
86d9f0492fSopenharmony_ciint StringToUint(const char *name, unsigned int *value);
87d9f0492fSopenharmony_ciint MakeDirRecursive(const char *dir, mode_t mode);
88d9f0492fSopenharmony_civoid CheckAndCreateDir(const char *fileName);
89d9f0492fSopenharmony_ciint CheckAndCreatFile(const char *file, mode_t mode);
90d9f0492fSopenharmony_ciint MakeDir(const char *dir, mode_t mode);
91d9f0492fSopenharmony_ciint ReadFileInDir(const char *dirPath, const char *includeExt,
92d9f0492fSopenharmony_ci    int (*processFile)(const char *fileName, void *context), void *context);
93d9f0492fSopenharmony_cichar **SplitStringExt(char *buffer, const char *del, int *returnCount, int maxItemCount);
94d9f0492fSopenharmony_civoid FreeStringVector(char **vector, int count);
95d9f0492fSopenharmony_ciint InUpdaterMode(void);
96d9f0492fSopenharmony_ciint InRescueMode(void);
97d9f0492fSopenharmony_ciint StringReplaceChr(char *strl, char oldChr, char newChr);
98d9f0492fSopenharmony_ci
99d9f0492fSopenharmony_ciint OpenConsole(void);
100d9f0492fSopenharmony_ciint OpenKmsg(void);
101d9f0492fSopenharmony_civoid TrimTail(char *str, char c);
102d9f0492fSopenharmony_cichar *TrimHead(char *str, char c);
103d9f0492fSopenharmony_ci
104d9f0492fSopenharmony_ciINIT_LOCAL_API uint32_t IntervalTime(struct timespec *startTime, struct timespec *endTime);
105d9f0492fSopenharmony_ci
106d9f0492fSopenharmony_ciINIT_LOCAL_API int StringToULL(const char *str, unsigned long long int *out);
107d9f0492fSopenharmony_ciINIT_LOCAL_API int StringToLL(const char *str, long long int *out);
108d9f0492fSopenharmony_civoid CloseStdio(void);
109d9f0492fSopenharmony_ci
110d9f0492fSopenharmony_ciint GetServiceGroupIdByPid(pid_t pid, gid_t *gids, uint32_t gidSize);
111d9f0492fSopenharmony_ciint GetParameterFromCmdLine(const char *paramName, char *value, size_t valueLen);
112d9f0492fSopenharmony_ci
113d9f0492fSopenharmony_ci/**
114d9f0492fSopenharmony_ci * @brief Get string index from a string array
115d9f0492fSopenharmony_ci *
116d9f0492fSopenharmony_ci * @param strArray string array
117d9f0492fSopenharmony_ci *     Attension: last item in the array must be NULL, for example:
118d9f0492fSopenharmony_ci *     const char *strArray[] = { "val1", "val2", NULL }
119d9f0492fSopenharmony_ci * @param target string to be matched
120d9f0492fSopenharmony_ci * @param ignoreCase 0 means exact match, others mean ignore case
121d9f0492fSopenharmony_ci * @return return 0 if succeed; other values if failed.
122d9f0492fSopenharmony_ci */
123d9f0492fSopenharmony_ciint OH_StrArrayGetIndex(const char *strArray[], const char *target, int ignoreCase);
124d9f0492fSopenharmony_ci
125d9f0492fSopenharmony_ci/**
126d9f0492fSopenharmony_ci * @brief Get string index from a string array with extended strings
127d9f0492fSopenharmony_ci *
128d9f0492fSopenharmony_ci * @param strArray string array
129d9f0492fSopenharmony_ci *     Attension: last item in the array must be NULL, for example:
130d9f0492fSopenharmony_ci *     const char *strArray[] = { "val1", "val2", NULL }
131d9f0492fSopenharmony_ci * @param target string to be matched
132d9f0492fSopenharmony_ci * @param ignoreCase 0 means exact match, others mean ignore case
133d9f0492fSopenharmony_ci * @param extend optional extended strings array, last string must be NULL
134d9f0492fSopenharmony_ci * @return return 0 if succeed; other values if failed.
135d9f0492fSopenharmony_ci */
136d9f0492fSopenharmony_ciint OH_ExtendableStrArrayGetIndex(const char *strArray[], const char *target, int ignoreCase, const char *extend[]);
137d9f0492fSopenharmony_ci
138d9f0492fSopenharmony_ci/**
139d9f0492fSopenharmony_ci * @brief Get string dictionary from a string dictionary array
140d9f0492fSopenharmony_ci *
141d9f0492fSopenharmony_ci * @param strDict string dictionary array
142d9f0492fSopenharmony_ci *     Attension: last item in the array must be NULL, for example:
143d9f0492fSopenharmony_ci *     Each item must be a structure with "const char *" as the first element
144d9f0492fSopenharmony_ci *     For example:
145d9f0492fSopenharmony_ci *     typedef {
146d9f0492fSopenharmony_ci *         const char *key;   // First element must be "const char *"
147d9f0492fSopenharmony_ci *         const char *value; // Arbitrary elements
148d9f0492fSopenharmony_ci *         // Optionally add more elements
149d9f0492fSopenharmony_ci *     } STRING_DICT_ST;
150d9f0492fSopenharmony_ci * @param target string to be matched
151d9f0492fSopenharmony_ci * @param ignoreCase 0 means exact match, others mean ignore case
152d9f0492fSopenharmony_ci * @return return item pointer if succeed; NULL if failed
153d9f0492fSopenharmony_ci * @example
154d9f0492fSopenharmony_ci * // Define a name-value pair as dictionary item
155d9f0492fSopenharmony_ci * typedef struct {
156d9f0492fSopenharmony_ci *     const char *name;
157d9f0492fSopenharmony_ci *     const char *value;
158d9f0492fSopenharmony_ci * } NAME_VALUE_ST;
159d9f0492fSopenharmony_ci
160d9f0492fSopenharmony_ci * // Fill the dictionary values
161d9f0492fSopenharmony_ci * NAME_VALUE_ST dict[] = { { "key1", "val1" }, { "key2", "val2" }};
162d9f0492fSopenharmony_ci
163d9f0492fSopenharmony_ci * // Find by key name
164d9f0492fSopenharmony_ci * NAME_VALUE_ST *found = (NAME_VALUE_ST *)StrDictGetIndex((void **)dict, sizeof(NAME_VALUE_ST), "key1", FALSE);
165d9f0492fSopenharmony_ci */
166d9f0492fSopenharmony_civoid *OH_StrDictGet(void **strDict, int dictSize, const char *target, int ignoreCase);
167d9f0492fSopenharmony_ci
168d9f0492fSopenharmony_ci/**
169d9f0492fSopenharmony_ci * @brief Get string dictionary from a string dictionary array and extended string dictionary
170d9f0492fSopenharmony_ci *
171d9f0492fSopenharmony_ci * @param strDict string dictionary array
172d9f0492fSopenharmony_ci *     Attension: last item in the array must be NULL, for example:
173d9f0492fSopenharmony_ci *     Each item must be a structure with "const char *" as the first element
174d9f0492fSopenharmony_ci *     For example:
175d9f0492fSopenharmony_ci *     typedef {
176d9f0492fSopenharmony_ci *         const char *key;   // First element must be "const char *"
177d9f0492fSopenharmony_ci *         const char *value; // Arbitrary elements
178d9f0492fSopenharmony_ci *         // Optionally add more elements
179d9f0492fSopenharmony_ci *     } STRING_DICT_ST;
180d9f0492fSopenharmony_ci * @param target string to be matched
181d9f0492fSopenharmony_ci * @param ignoreCase 0 means exact match, others mean ignore case
182d9f0492fSopenharmony_ci * @param extendStrDict optional extended strings dictionary array, last item must be NULL
183d9f0492fSopenharmony_ci * @return return item pointer if succeed; NULL if failed.
184d9f0492fSopenharmony_ci */
185d9f0492fSopenharmony_civoid *OH_ExtendableStrDictGet(void **strDict, int dictSize, const char *target, int ignoreCase, void **extendStrDict);
186d9f0492fSopenharmony_ci
187d9f0492fSopenharmony_cilong long GetUptimeInMicroSeconds(const struct timespec *uptime);
188d9f0492fSopenharmony_ci
189d9f0492fSopenharmony_ci#ifdef __cplusplus
190d9f0492fSopenharmony_ci#if __cplusplus
191d9f0492fSopenharmony_ci}
192d9f0492fSopenharmony_ci#endif
193d9f0492fSopenharmony_ci#endif
194d9f0492fSopenharmony_ci#endif // INIT_UTILS_H
195