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#include "init_utils.h"
16d9f0492fSopenharmony_ci
17d9f0492fSopenharmony_ci#include <ctype.h>
18d9f0492fSopenharmony_ci#include <errno.h>
19d9f0492fSopenharmony_ci#include <dirent.h>
20d9f0492fSopenharmony_ci#include <fcntl.h>
21d9f0492fSopenharmony_ci#include <grp.h>
22d9f0492fSopenharmony_ci#include <limits.h>
23d9f0492fSopenharmony_ci#include <pwd.h>
24d9f0492fSopenharmony_ci#include <stdlib.h>
25d9f0492fSopenharmony_ci#include <string.h>
26d9f0492fSopenharmony_ci#include <sys/ioctl.h>
27d9f0492fSopenharmony_ci#include <sys/stat.h>
28d9f0492fSopenharmony_ci#include <unistd.h>
29d9f0492fSopenharmony_ci#include <time.h>
30d9f0492fSopenharmony_ci
31d9f0492fSopenharmony_ci#include "init_log.h"
32d9f0492fSopenharmony_ci#include "securec.h"
33d9f0492fSopenharmony_ci#include "service_control.h"
34d9f0492fSopenharmony_ci
35d9f0492fSopenharmony_ci#define MAX_BUF_SIZE  1024
36d9f0492fSopenharmony_ci#define MAX_SMALL_BUFFER 4096
37d9f0492fSopenharmony_ci
38d9f0492fSopenharmony_ci#define MAX_JSON_FILE_LEN 102400    // max init.cfg size 100KB
39d9f0492fSopenharmony_ci#define CONVERT_MICROSEC_TO_SEC(x) ((x) / 1000 / 1000.0)
40d9f0492fSopenharmony_ci#ifndef DT_DIR
41d9f0492fSopenharmony_ci#define DT_DIR 4
42d9f0492fSopenharmony_ci#endif
43d9f0492fSopenharmony_ci
44d9f0492fSopenharmony_ci#define THOUSAND_UNIT_INT 1000
45d9f0492fSopenharmony_ci#define THOUSAND_UNIT_FLOAT 1000.0
46d9f0492fSopenharmony_ci
47d9f0492fSopenharmony_cifloat ConvertMicrosecondToSecond(int x)
48d9f0492fSopenharmony_ci{
49d9f0492fSopenharmony_ci    return ((x / THOUSAND_UNIT_INT) / THOUSAND_UNIT_FLOAT);
50d9f0492fSopenharmony_ci}
51d9f0492fSopenharmony_ci
52d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
53d9f0492fSopenharmony_cistatic bool CheckDigit(const char *name)
54d9f0492fSopenharmony_ci{
55d9f0492fSopenharmony_ci    size_t nameLen = strlen(name);
56d9f0492fSopenharmony_ci    for (size_t i = 0; i < nameLen; ++i) {
57d9f0492fSopenharmony_ci        if (!isdigit(name[i])) {
58d9f0492fSopenharmony_ci            return false;
59d9f0492fSopenharmony_ci        }
60d9f0492fSopenharmony_ci    }
61d9f0492fSopenharmony_ci    return true;
62d9f0492fSopenharmony_ci}
63d9f0492fSopenharmony_ci#endif
64d9f0492fSopenharmony_ci
65d9f0492fSopenharmony_ciint StringToUint(const char *name, unsigned int *value)
66d9f0492fSopenharmony_ci{
67d9f0492fSopenharmony_ci    errno = 0;
68d9f0492fSopenharmony_ci    *value = (unsigned int)strtoul(name, 0, DECIMAL_BASE);
69d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE(errno == 0, -1);
70d9f0492fSopenharmony_ci    return 0;
71d9f0492fSopenharmony_ci}
72d9f0492fSopenharmony_ci
73d9f0492fSopenharmony_ciuid_t DecodeUid(const char *name)
74d9f0492fSopenharmony_ci{
75d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
76d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE(name != NULL, -1);
77d9f0492fSopenharmony_ci    uid_t uid = -1;
78d9f0492fSopenharmony_ci    if (CheckDigit(name)) {
79d9f0492fSopenharmony_ci        if (!StringToUint(name, &uid)) {
80d9f0492fSopenharmony_ci            return uid;
81d9f0492fSopenharmony_ci        } else {
82d9f0492fSopenharmony_ci            return -1;
83d9f0492fSopenharmony_ci        }
84d9f0492fSopenharmony_ci    }
85d9f0492fSopenharmony_ci    struct passwd *p = getpwnam(name);
86d9f0492fSopenharmony_ci    if (p == NULL) {
87d9f0492fSopenharmony_ci        return -1;
88d9f0492fSopenharmony_ci    }
89d9f0492fSopenharmony_ci    return p->pw_uid;
90d9f0492fSopenharmony_ci#else
91d9f0492fSopenharmony_ci    (void)name;
92d9f0492fSopenharmony_ci    return -1;
93d9f0492fSopenharmony_ci#endif
94d9f0492fSopenharmony_ci}
95d9f0492fSopenharmony_ci
96d9f0492fSopenharmony_cigid_t DecodeGid(const char *name)
97d9f0492fSopenharmony_ci{
98d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
99d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE(name != NULL, -1);
100d9f0492fSopenharmony_ci    gid_t gid = -1;
101d9f0492fSopenharmony_ci    if (CheckDigit(name)) {
102d9f0492fSopenharmony_ci        if (!StringToUint(name, &gid)) {
103d9f0492fSopenharmony_ci            return gid;
104d9f0492fSopenharmony_ci        } else {
105d9f0492fSopenharmony_ci            return -1;
106d9f0492fSopenharmony_ci        }
107d9f0492fSopenharmony_ci    }
108d9f0492fSopenharmony_ci    struct group *data = getgrnam(name);
109d9f0492fSopenharmony_ci    if (data != NULL) {
110d9f0492fSopenharmony_ci        return data->gr_gid;
111d9f0492fSopenharmony_ci    }
112d9f0492fSopenharmony_ci    while ((data = getgrent()) != NULL) {
113d9f0492fSopenharmony_ci        if ((data->gr_name != NULL) && (strcmp(data->gr_name, name) == 0)) {
114d9f0492fSopenharmony_ci            gid = data->gr_gid;
115d9f0492fSopenharmony_ci            break;
116d9f0492fSopenharmony_ci        }
117d9f0492fSopenharmony_ci    }
118d9f0492fSopenharmony_ci    endgrent();
119d9f0492fSopenharmony_ci    return gid;
120d9f0492fSopenharmony_ci#else
121d9f0492fSopenharmony_ci    (void)name;
122d9f0492fSopenharmony_ci    return -1;
123d9f0492fSopenharmony_ci#endif
124d9f0492fSopenharmony_ci}
125d9f0492fSopenharmony_ci
126d9f0492fSopenharmony_cichar *ReadFileToBuf(const char *configFile)
127d9f0492fSopenharmony_ci{
128d9f0492fSopenharmony_ci    char *buffer = NULL;
129d9f0492fSopenharmony_ci    FILE *fd = NULL;
130d9f0492fSopenharmony_ci    struct stat fileStat = {0};
131d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE(configFile != NULL && *configFile != '\0', NULL);
132d9f0492fSopenharmony_ci    do {
133d9f0492fSopenharmony_ci        if (stat(configFile, &fileStat) != 0 ||
134d9f0492fSopenharmony_ci            fileStat.st_size <= 0 || fileStat.st_size > MAX_JSON_FILE_LEN) {
135d9f0492fSopenharmony_ci            break;
136d9f0492fSopenharmony_ci        }
137d9f0492fSopenharmony_ci        fd = fopen(configFile, "r");
138d9f0492fSopenharmony_ci        if (fd == NULL) {
139d9f0492fSopenharmony_ci            INIT_LOGE("Open %s failed. err = %d", configFile, errno);
140d9f0492fSopenharmony_ci            break;
141d9f0492fSopenharmony_ci        }
142d9f0492fSopenharmony_ci        buffer = (char*)calloc((size_t)(fileStat.st_size + 1), sizeof(char));
143d9f0492fSopenharmony_ci        if (buffer == NULL) {
144d9f0492fSopenharmony_ci            INIT_LOGE("Failed to allocate memory for config file, err = %d", errno);
145d9f0492fSopenharmony_ci            break;
146d9f0492fSopenharmony_ci        }
147d9f0492fSopenharmony_ci
148d9f0492fSopenharmony_ci        if (fread(buffer, fileStat.st_size, 1, fd) != 1) {
149d9f0492fSopenharmony_ci            free(buffer);
150d9f0492fSopenharmony_ci            buffer = NULL;
151d9f0492fSopenharmony_ci            break;
152d9f0492fSopenharmony_ci        }
153d9f0492fSopenharmony_ci        buffer[fileStat.st_size] = '\0';
154d9f0492fSopenharmony_ci    } while (0);
155d9f0492fSopenharmony_ci
156d9f0492fSopenharmony_ci    if (fd != NULL) {
157d9f0492fSopenharmony_ci        (void)fclose(fd);
158d9f0492fSopenharmony_ci        fd = NULL;
159d9f0492fSopenharmony_ci    }
160d9f0492fSopenharmony_ci    return buffer;
161d9f0492fSopenharmony_ci}
162d9f0492fSopenharmony_ci
163d9f0492fSopenharmony_civoid CloseStdio(void)
164d9f0492fSopenharmony_ci{
165d9f0492fSopenharmony_ci#ifndef STARTUP_INIT_TEST
166d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
167d9f0492fSopenharmony_ci    int fd = open("/dev/null", O_RDWR);
168d9f0492fSopenharmony_ci    if (fd < 0) {
169d9f0492fSopenharmony_ci        return;
170d9f0492fSopenharmony_ci    }
171d9f0492fSopenharmony_ci    dup2(fd, 0);
172d9f0492fSopenharmony_ci    dup2(fd, 1);
173d9f0492fSopenharmony_ci    dup2(fd, STDERR_HANDLE);
174d9f0492fSopenharmony_ci    if (fd > STDERR_HANDLE) {
175d9f0492fSopenharmony_ci        close(fd);
176d9f0492fSopenharmony_ci    }
177d9f0492fSopenharmony_ci#endif
178d9f0492fSopenharmony_ci#endif
179d9f0492fSopenharmony_ci}
180d9f0492fSopenharmony_ci
181d9f0492fSopenharmony_cichar *ReadFileData(const char *fileName)
182d9f0492fSopenharmony_ci{
183d9f0492fSopenharmony_ci    if (fileName == NULL) {
184d9f0492fSopenharmony_ci        return NULL;
185d9f0492fSopenharmony_ci    }
186d9f0492fSopenharmony_ci    char *buffer = NULL;
187d9f0492fSopenharmony_ci    int fd = -1;
188d9f0492fSopenharmony_ci    fd = open(fileName, O_RDONLY);
189d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(fd >= 0, return NULL, "Failed to read file %s errno:%d", fileName, errno);
190d9f0492fSopenharmony_ci    buffer = (char *)calloc(1, MAX_SMALL_BUFFER); // fsmanager not create, can not get fileStat st_size
191d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(buffer != NULL, close(fd);
192d9f0492fSopenharmony_ci        return NULL, "Failed to allocate memory for %s", fileName);
193d9f0492fSopenharmony_ci    ssize_t readLen = read(fd, buffer, MAX_SMALL_BUFFER - 1);
194d9f0492fSopenharmony_ci    INIT_ERROR_CHECK((readLen > 0) && (readLen <= (MAX_SMALL_BUFFER - 1)), close(fd);
195d9f0492fSopenharmony_ci        free(buffer);
196d9f0492fSopenharmony_ci        return NULL, "Failed to read data for %s", fileName);
197d9f0492fSopenharmony_ci    buffer[readLen] = '\0';
198d9f0492fSopenharmony_ci    if (fd != -1) {
199d9f0492fSopenharmony_ci        close(fd);
200d9f0492fSopenharmony_ci    }
201d9f0492fSopenharmony_ci    return buffer;
202d9f0492fSopenharmony_ci}
203d9f0492fSopenharmony_ci
204d9f0492fSopenharmony_ciint IterateNameValuePairs(const char *src, void (*iterator)(const NAME_VALUE_PAIR *nv, void *context), void *context)
205d9f0492fSopenharmony_ci{
206d9f0492fSopenharmony_ci    int cnt = 0;
207d9f0492fSopenharmony_ci    const char *seperator;
208d9f0492fSopenharmony_ci    const char *tmp = src;
209d9f0492fSopenharmony_ci    NAME_VALUE_PAIR nv;
210d9f0492fSopenharmony_ci    if ((src == NULL) || (iterator == NULL)) {
211d9f0492fSopenharmony_ci        return -1;
212d9f0492fSopenharmony_ci    }
213d9f0492fSopenharmony_ci
214d9f0492fSopenharmony_ci    do {
215d9f0492fSopenharmony_ci        // Find space seperator
216d9f0492fSopenharmony_ci        nv.name = tmp;
217d9f0492fSopenharmony_ci        seperator = strchr(tmp, ' ');
218d9f0492fSopenharmony_ci        if (seperator == NULL) {
219d9f0492fSopenharmony_ci            // Last nv
220d9f0492fSopenharmony_ci            nv.valueEnd = tmp + strlen(tmp);
221d9f0492fSopenharmony_ci            tmp = NULL;
222d9f0492fSopenharmony_ci        } else {
223d9f0492fSopenharmony_ci            nv.valueEnd = seperator;
224d9f0492fSopenharmony_ci            tmp = seperator + 1;
225d9f0492fSopenharmony_ci        }
226d9f0492fSopenharmony_ci
227d9f0492fSopenharmony_ci        // Find equal seperator
228d9f0492fSopenharmony_ci        seperator = strchr(nv.name, '=');
229d9f0492fSopenharmony_ci        if (seperator == NULL) {
230d9f0492fSopenharmony_ci            // Invalid name value pair
231d9f0492fSopenharmony_ci            continue;
232d9f0492fSopenharmony_ci        }
233d9f0492fSopenharmony_ci        if (seperator > nv.valueEnd) {
234d9f0492fSopenharmony_ci            // name without value, just ignore
235d9f0492fSopenharmony_ci            continue;
236d9f0492fSopenharmony_ci        }
237d9f0492fSopenharmony_ci        nv.nameEnd = seperator;
238d9f0492fSopenharmony_ci        nv.value = seperator + 1;
239d9f0492fSopenharmony_ci
240d9f0492fSopenharmony_ci        iterator(&nv, context);
241d9f0492fSopenharmony_ci        cnt += 1;
242d9f0492fSopenharmony_ci    } while (tmp != NULL);
243d9f0492fSopenharmony_ci
244d9f0492fSopenharmony_ci    return cnt;
245d9f0492fSopenharmony_ci}
246d9f0492fSopenharmony_ci
247d9f0492fSopenharmony_ciint GetProcCmdlineValue(const char *name, const char *buffer, char *value, int length)
248d9f0492fSopenharmony_ci{
249d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(name != NULL && buffer != NULL && value != NULL, return -1, "Failed get parameters");
250d9f0492fSopenharmony_ci    char *endData = (char *)buffer + strlen(buffer);
251d9f0492fSopenharmony_ci    char *tmp = strstr(buffer, name);
252d9f0492fSopenharmony_ci    do {
253d9f0492fSopenharmony_ci        if (tmp == NULL) {
254d9f0492fSopenharmony_ci            return -1;
255d9f0492fSopenharmony_ci        }
256d9f0492fSopenharmony_ci        tmp = tmp + strlen(name);
257d9f0492fSopenharmony_ci        while (tmp < endData && *tmp == ' ') {
258d9f0492fSopenharmony_ci            tmp++;
259d9f0492fSopenharmony_ci        }
260d9f0492fSopenharmony_ci        if (tmp >= endData) {
261d9f0492fSopenharmony_ci            return -1;
262d9f0492fSopenharmony_ci        }
263d9f0492fSopenharmony_ci        if (*tmp == '=') {
264d9f0492fSopenharmony_ci            break;
265d9f0492fSopenharmony_ci        }
266d9f0492fSopenharmony_ci        tmp = strstr(tmp + 1, name);
267d9f0492fSopenharmony_ci    } while (tmp < endData);
268d9f0492fSopenharmony_ci    tmp++;
269d9f0492fSopenharmony_ci    size_t i = 0;
270d9f0492fSopenharmony_ci    size_t endIndex = 0;
271d9f0492fSopenharmony_ci    while (tmp < endData && *tmp == ' ') {
272d9f0492fSopenharmony_ci        tmp++;
273d9f0492fSopenharmony_ci    }
274d9f0492fSopenharmony_ci    for (; i < (size_t)length; tmp++) {
275d9f0492fSopenharmony_ci        if (tmp >= endData || *tmp == ' ' || *tmp == '\n' || *tmp == '\r' || *tmp == '\t') {
276d9f0492fSopenharmony_ci            endIndex = i;
277d9f0492fSopenharmony_ci            break;
278d9f0492fSopenharmony_ci        }
279d9f0492fSopenharmony_ci        if (*tmp == '=') {
280d9f0492fSopenharmony_ci            if (endIndex != 0) { // for root=uuid=xxxx
281d9f0492fSopenharmony_ci                break;
282d9f0492fSopenharmony_ci            }
283d9f0492fSopenharmony_ci            i = 0;
284d9f0492fSopenharmony_ci            endIndex = 0;
285d9f0492fSopenharmony_ci            continue;
286d9f0492fSopenharmony_ci        }
287d9f0492fSopenharmony_ci        value[i++] = *tmp;
288d9f0492fSopenharmony_ci    }
289d9f0492fSopenharmony_ci    if (i >= (size_t)length) {
290d9f0492fSopenharmony_ci        return -1;
291d9f0492fSopenharmony_ci    }
292d9f0492fSopenharmony_ci    value[endIndex] = '\0';
293d9f0492fSopenharmony_ci    return 0;
294d9f0492fSopenharmony_ci}
295d9f0492fSopenharmony_ci
296d9f0492fSopenharmony_ciint SplitString(char *srcPtr, const char *del, char **dstPtr, int maxNum)
297d9f0492fSopenharmony_ci{
298d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE(srcPtr != NULL && dstPtr != NULL && del != NULL, -1);
299d9f0492fSopenharmony_ci    char *buf = NULL;
300d9f0492fSopenharmony_ci    dstPtr[0] = strtok_r(srcPtr, del, &buf);
301d9f0492fSopenharmony_ci    int counter = 0;
302d9f0492fSopenharmony_ci    while ((counter < maxNum) && (dstPtr[counter] != NULL)) {
303d9f0492fSopenharmony_ci        counter++;
304d9f0492fSopenharmony_ci        if (counter >= maxNum) {
305d9f0492fSopenharmony_ci            break;
306d9f0492fSopenharmony_ci        }
307d9f0492fSopenharmony_ci        dstPtr[counter] = strtok_r(NULL, del, &buf);
308d9f0492fSopenharmony_ci    }
309d9f0492fSopenharmony_ci    return counter;
310d9f0492fSopenharmony_ci}
311d9f0492fSopenharmony_ci
312d9f0492fSopenharmony_civoid FreeStringVector(char **vector, int count)
313d9f0492fSopenharmony_ci{
314d9f0492fSopenharmony_ci    if (vector != NULL) {
315d9f0492fSopenharmony_ci        for (int i = 0; i < count; i++) {
316d9f0492fSopenharmony_ci            if (vector[i] != NULL) {
317d9f0492fSopenharmony_ci                free(vector[i]);
318d9f0492fSopenharmony_ci            }
319d9f0492fSopenharmony_ci        }
320d9f0492fSopenharmony_ci        free(vector);
321d9f0492fSopenharmony_ci    }
322d9f0492fSopenharmony_ci}
323d9f0492fSopenharmony_ci
324d9f0492fSopenharmony_cichar **SplitStringExt(char *buffer, const char *del, int *returnCount, int maxItemCount)
325d9f0492fSopenharmony_ci{
326d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE((maxItemCount >= 0) && (buffer != NULL) && (del != NULL) && (returnCount != NULL), NULL);
327d9f0492fSopenharmony_ci    // Why is this number?
328d9f0492fSopenharmony_ci    // Now we use this function to split a string with a given delimiter
329d9f0492fSopenharmony_ci    // We do not know how many sub-strings out there after splitting.
330d9f0492fSopenharmony_ci    // 50 is just a guess value.
331d9f0492fSopenharmony_ci    const int defaultItemCounts = 50;
332d9f0492fSopenharmony_ci    int itemCounts = maxItemCount;
333d9f0492fSopenharmony_ci
334d9f0492fSopenharmony_ci    if (maxItemCount > defaultItemCounts) {
335d9f0492fSopenharmony_ci        itemCounts = defaultItemCounts;
336d9f0492fSopenharmony_ci    }
337d9f0492fSopenharmony_ci    char **items = (char **)malloc(sizeof(char*) * itemCounts);
338d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(items != NULL, return NULL, "No enough memory to store items");
339d9f0492fSopenharmony_ci    char *rest = NULL;
340d9f0492fSopenharmony_ci    char *p = strtok_r(buffer, del, &rest);
341d9f0492fSopenharmony_ci    int count = 0;
342d9f0492fSopenharmony_ci    while (p != NULL) {
343d9f0492fSopenharmony_ci        if (count > itemCounts - 1) {
344d9f0492fSopenharmony_ci            itemCounts += (itemCounts / 2) + 1; // 2 Request to increase the original memory by half.
345d9f0492fSopenharmony_ci            INIT_LOGV("Too many items,expand size");
346d9f0492fSopenharmony_ci            char **expand = (char **)(realloc(items, sizeof(char *) * itemCounts));
347d9f0492fSopenharmony_ci            INIT_ERROR_CHECK(expand != NULL, FreeStringVector(items, count);
348d9f0492fSopenharmony_ci                return NULL, "Failed to expand memory");
349d9f0492fSopenharmony_ci            items = expand;
350d9f0492fSopenharmony_ci        }
351d9f0492fSopenharmony_ci        size_t len = strlen(p);
352d9f0492fSopenharmony_ci        items[count] = (char *)calloc(len + 1, sizeof(char));
353d9f0492fSopenharmony_ci        INIT_CHECK(items[count] != NULL, FreeStringVector(items, count);
354d9f0492fSopenharmony_ci            return NULL);
355d9f0492fSopenharmony_ci        if (strncpy_s(items[count], len + 1, p, len) != EOK) {
356d9f0492fSopenharmony_ci            INIT_LOGE("Copy string failed");
357d9f0492fSopenharmony_ci            FreeStringVector(items, count);
358d9f0492fSopenharmony_ci            return NULL;
359d9f0492fSopenharmony_ci        }
360d9f0492fSopenharmony_ci        count++;
361d9f0492fSopenharmony_ci        p = strtok_r(NULL, del, &rest);
362d9f0492fSopenharmony_ci    }
363d9f0492fSopenharmony_ci    *returnCount = count;
364d9f0492fSopenharmony_ci    return items;
365d9f0492fSopenharmony_ci}
366d9f0492fSopenharmony_ci
367d9f0492fSopenharmony_cilong long InitDiffTime(INIT_TIMING_STAT *stat)
368d9f0492fSopenharmony_ci{
369d9f0492fSopenharmony_ci    long long diff = (long long)(stat->endTime.tv_sec - stat->startTime.tv_sec) * 1000000; // 1000000 1000ms
370d9f0492fSopenharmony_ci    if (stat->endTime.tv_nsec > stat->startTime.tv_nsec) {
371d9f0492fSopenharmony_ci        diff += (stat->endTime.tv_nsec - stat->startTime.tv_nsec) / BASE_MS_UNIT;
372d9f0492fSopenharmony_ci    } else {
373d9f0492fSopenharmony_ci        diff -= (stat->startTime.tv_nsec - stat->endTime.tv_nsec) / BASE_MS_UNIT;
374d9f0492fSopenharmony_ci    }
375d9f0492fSopenharmony_ci    return diff;
376d9f0492fSopenharmony_ci}
377d9f0492fSopenharmony_ci
378d9f0492fSopenharmony_civoid WaitForFile(const char *source, unsigned int maxSecond)
379d9f0492fSopenharmony_ci{
380d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(maxSecond <= WAIT_MAX_SECOND, maxSecond = WAIT_MAX_SECOND,
381d9f0492fSopenharmony_ci        "WaitForFile max time is %us", WAIT_MAX_SECOND);
382d9f0492fSopenharmony_ci    struct stat sourceInfo = {0};
383d9f0492fSopenharmony_ci    unsigned int waitTime = 10 * BASE_MS_UNIT; // 10ms
384d9f0492fSopenharmony_ci    long long maxDuration = maxSecond * BASE_MS_UNIT * BASE_MS_UNIT; // 5s
385d9f0492fSopenharmony_ci#ifdef STARTUP_INIT_TEST
386d9f0492fSopenharmony_ci    maxDuration = 0;
387d9f0492fSopenharmony_ci#endif
388d9f0492fSopenharmony_ci    long long duration = 0;
389d9f0492fSopenharmony_ci    INIT_TIMING_STAT cmdTimer;
390d9f0492fSopenharmony_ci    (void)clock_gettime(CLOCK_MONOTONIC, &cmdTimer.startTime);
391d9f0492fSopenharmony_ci    while ((stat(source, &sourceInfo) < 0) && (errno == ENOENT) && (duration < maxDuration)) {
392d9f0492fSopenharmony_ci        usleep(waitTime);
393d9f0492fSopenharmony_ci        (void)clock_gettime(CLOCK_MONOTONIC, &cmdTimer.endTime);
394d9f0492fSopenharmony_ci        duration = InitDiffTime(&cmdTimer);
395d9f0492fSopenharmony_ci    }
396d9f0492fSopenharmony_ci    INIT_CHECK_ONLY_ELOG(duration < maxDuration, "wait for file:%s failed after %d second.", source, maxSecond);
397d9f0492fSopenharmony_ci    return;
398d9f0492fSopenharmony_ci}
399d9f0492fSopenharmony_ci
400d9f0492fSopenharmony_cisize_t WriteAll(int fd, const char *buffer, size_t size)
401d9f0492fSopenharmony_ci{
402d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE(buffer != NULL && fd >= 0 && *buffer != '\0', 0);
403d9f0492fSopenharmony_ci    const char *p = buffer;
404d9f0492fSopenharmony_ci    size_t left = size;
405d9f0492fSopenharmony_ci    ssize_t written;
406d9f0492fSopenharmony_ci    while (left > 0) {
407d9f0492fSopenharmony_ci        do {
408d9f0492fSopenharmony_ci            written = write(fd, p, left);
409d9f0492fSopenharmony_ci        } while (written < 0 && errno == EINTR);
410d9f0492fSopenharmony_ci        if (written < 0) {
411d9f0492fSopenharmony_ci            INIT_LOGE("Failed to write %lu bytes, err = %d", left, errno);
412d9f0492fSopenharmony_ci            break;
413d9f0492fSopenharmony_ci        }
414d9f0492fSopenharmony_ci        p += written;
415d9f0492fSopenharmony_ci        left -= written;
416d9f0492fSopenharmony_ci    }
417d9f0492fSopenharmony_ci    return size - left;
418d9f0492fSopenharmony_ci}
419d9f0492fSopenharmony_ci
420d9f0492fSopenharmony_cichar *GetRealPath(const char *source)
421d9f0492fSopenharmony_ci{
422d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE(source != NULL, NULL);
423d9f0492fSopenharmony_ci    char *path = realpath(source, NULL);
424d9f0492fSopenharmony_ci    if (path == NULL) {
425d9f0492fSopenharmony_ci        INIT_ERROR_CHECK(errno == ENOENT, return NULL, "Failed to resolve %s real path err=%d", source, errno);
426d9f0492fSopenharmony_ci    }
427d9f0492fSopenharmony_ci    return path;
428d9f0492fSopenharmony_ci}
429d9f0492fSopenharmony_ci
430d9f0492fSopenharmony_ciint MakeDir(const char *dir, mode_t mode)
431d9f0492fSopenharmony_ci{
432d9f0492fSopenharmony_ci    int rc = -1;
433d9f0492fSopenharmony_ci    if (dir == NULL || *dir == '\0') {
434d9f0492fSopenharmony_ci        errno = EINVAL;
435d9f0492fSopenharmony_ci        return rc;
436d9f0492fSopenharmony_ci    }
437d9f0492fSopenharmony_ci    rc = mkdir(dir, mode);
438d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(!(rc < 0 && errno != EEXIST), return rc,
439d9f0492fSopenharmony_ci        "Create directory \" %s \" failed, err = %d", dir, errno);
440d9f0492fSopenharmony_ci    // create dir success or it already exist.
441d9f0492fSopenharmony_ci    return 0;
442d9f0492fSopenharmony_ci}
443d9f0492fSopenharmony_ci
444d9f0492fSopenharmony_ciint MakeDirRecursive(const char *dir, mode_t mode)
445d9f0492fSopenharmony_ci{
446d9f0492fSopenharmony_ci    int rc = -1;
447d9f0492fSopenharmony_ci    char buffer[PATH_MAX] = {0};
448d9f0492fSopenharmony_ci    const char *p = NULL;
449d9f0492fSopenharmony_ci    if (dir == NULL || *dir == '\0') {
450d9f0492fSopenharmony_ci        errno = EINVAL;
451d9f0492fSopenharmony_ci        return rc;
452d9f0492fSopenharmony_ci    }
453d9f0492fSopenharmony_ci    p = dir;
454d9f0492fSopenharmony_ci    char *slash = strchr(dir, '/');
455d9f0492fSopenharmony_ci    while (slash != NULL) {
456d9f0492fSopenharmony_ci        int gap = slash - p;
457d9f0492fSopenharmony_ci        p = slash + 1;
458d9f0492fSopenharmony_ci        if (gap == 0) {
459d9f0492fSopenharmony_ci            slash = strchr(p, '/');
460d9f0492fSopenharmony_ci            continue;
461d9f0492fSopenharmony_ci        }
462d9f0492fSopenharmony_ci        if (gap < 0) { // end with '/'
463d9f0492fSopenharmony_ci            break;
464d9f0492fSopenharmony_ci        }
465d9f0492fSopenharmony_ci        INIT_CHECK_RETURN_VALUE(memcpy_s(buffer, PATH_MAX, dir, p - dir - 1) == 0, -1);
466d9f0492fSopenharmony_ci        rc = MakeDir(buffer, mode);
467d9f0492fSopenharmony_ci        INIT_CHECK_RETURN_VALUE(rc >= 0, rc);
468d9f0492fSopenharmony_ci        slash = strchr(p, '/');
469d9f0492fSopenharmony_ci    }
470d9f0492fSopenharmony_ci    return MakeDir(dir, mode);
471d9f0492fSopenharmony_ci}
472d9f0492fSopenharmony_ci
473d9f0492fSopenharmony_civoid CheckAndCreateDir(const char *fileName)
474d9f0492fSopenharmony_ci{
475d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
476d9f0492fSopenharmony_ci    if (fileName == NULL || *fileName == '\0') {
477d9f0492fSopenharmony_ci        return;
478d9f0492fSopenharmony_ci    }
479d9f0492fSopenharmony_ci    char *path = strndup(fileName, strrchr(fileName, '/') - fileName);
480d9f0492fSopenharmony_ci    if (path == NULL) {
481d9f0492fSopenharmony_ci        return;
482d9f0492fSopenharmony_ci    }
483d9f0492fSopenharmony_ci    if (access(path, F_OK) == 0) {
484d9f0492fSopenharmony_ci        free(path);
485d9f0492fSopenharmony_ci        return;
486d9f0492fSopenharmony_ci    }
487d9f0492fSopenharmony_ci    MakeDirRecursive(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
488d9f0492fSopenharmony_ci    free(path);
489d9f0492fSopenharmony_ci#else
490d9f0492fSopenharmony_ci    (void)fileName;
491d9f0492fSopenharmony_ci#endif
492d9f0492fSopenharmony_ci}
493d9f0492fSopenharmony_ci
494d9f0492fSopenharmony_ciint CheckAndCreatFile(const char *file, mode_t mode)
495d9f0492fSopenharmony_ci{
496d9f0492fSopenharmony_ci    if (access(file, F_OK) == 0) {
497d9f0492fSopenharmony_ci        BEGET_LOGW("File \' %s \' already exist", file);
498d9f0492fSopenharmony_ci        return 0;
499d9f0492fSopenharmony_ci    } else {
500d9f0492fSopenharmony_ci        if (errno == ENOENT) {
501d9f0492fSopenharmony_ci            CheckAndCreateDir(file);
502d9f0492fSopenharmony_ci            int fd = open(file, O_CREAT, mode);
503d9f0492fSopenharmony_ci            if (fd < 0) {
504d9f0492fSopenharmony_ci                BEGET_LOGE("Failed create %s, err=%d", file, errno);
505d9f0492fSopenharmony_ci                return -1;
506d9f0492fSopenharmony_ci            } else {
507d9f0492fSopenharmony_ci                close(fd);
508d9f0492fSopenharmony_ci            }
509d9f0492fSopenharmony_ci        } else {
510d9f0492fSopenharmony_ci            BEGET_LOGW("Failed to access \' %s \', err = %d", file, errno);
511d9f0492fSopenharmony_ci            return -1;
512d9f0492fSopenharmony_ci        }
513d9f0492fSopenharmony_ci    }
514d9f0492fSopenharmony_ci    return 0;
515d9f0492fSopenharmony_ci}
516d9f0492fSopenharmony_ci
517d9f0492fSopenharmony_ciint StringToInt(const char *str, int defaultValue)
518d9f0492fSopenharmony_ci{
519d9f0492fSopenharmony_ci    if (str == NULL || *str == '\0') {
520d9f0492fSopenharmony_ci        return defaultValue;
521d9f0492fSopenharmony_ci    }
522d9f0492fSopenharmony_ci    errno = 0;
523d9f0492fSopenharmony_ci    int value = (int)strtoul(str, NULL, DECIMAL_BASE);
524d9f0492fSopenharmony_ci    return (errno != 0) ? defaultValue : value;
525d9f0492fSopenharmony_ci}
526d9f0492fSopenharmony_ci
527d9f0492fSopenharmony_ciint ReadFileInDir(const char *dirPath, const char *includeExt,
528d9f0492fSopenharmony_ci    int (*processFile)(const char *fileName, void *context), void *context)
529d9f0492fSopenharmony_ci{
530d9f0492fSopenharmony_ci    INIT_CHECK_RETURN_VALUE(dirPath != NULL && processFile != NULL, -1);
531d9f0492fSopenharmony_ci    DIR *pDir = opendir(dirPath);
532d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(pDir != NULL, return -1, "Read dir :%s failed.%d", dirPath, errno);
533d9f0492fSopenharmony_ci    char *fileName = calloc(1, MAX_BUF_SIZE);
534d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(fileName != NULL, closedir(pDir);
535d9f0492fSopenharmony_ci        return -1, "Failed to malloc for %s", dirPath);
536d9f0492fSopenharmony_ci
537d9f0492fSopenharmony_ci    struct dirent *dp;
538d9f0492fSopenharmony_ci    uint32_t count = 0;
539d9f0492fSopenharmony_ci    while ((dp = readdir(pDir)) != NULL) {
540d9f0492fSopenharmony_ci        if (dp->d_type == DT_DIR) {
541d9f0492fSopenharmony_ci            continue;
542d9f0492fSopenharmony_ci        }
543d9f0492fSopenharmony_ci        if (includeExt != NULL) {
544d9f0492fSopenharmony_ci            char *tmp = strstr(dp->d_name, includeExt);
545d9f0492fSopenharmony_ci            if (tmp == NULL) {
546d9f0492fSopenharmony_ci                continue;
547d9f0492fSopenharmony_ci            }
548d9f0492fSopenharmony_ci            if (strcmp(tmp, includeExt) != 0) {
549d9f0492fSopenharmony_ci                continue;
550d9f0492fSopenharmony_ci            }
551d9f0492fSopenharmony_ci        }
552d9f0492fSopenharmony_ci        int ret = snprintf_s(fileName, MAX_BUF_SIZE, MAX_BUF_SIZE - 1, "%s/%s", dirPath, dp->d_name);
553d9f0492fSopenharmony_ci        if (ret <= 0) {
554d9f0492fSopenharmony_ci            INIT_LOGE("Failed to get file name for %s", dp->d_name);
555d9f0492fSopenharmony_ci            continue;
556d9f0492fSopenharmony_ci        }
557d9f0492fSopenharmony_ci        struct stat st;
558d9f0492fSopenharmony_ci        if (stat(fileName, &st) == 0) {
559d9f0492fSopenharmony_ci            count++;
560d9f0492fSopenharmony_ci            processFile(fileName, context);
561d9f0492fSopenharmony_ci        }
562d9f0492fSopenharmony_ci    }
563d9f0492fSopenharmony_ci    INIT_LOGV("ReadFileInDir dirPath %s %d", dirPath, count);
564d9f0492fSopenharmony_ci    free(fileName);
565d9f0492fSopenharmony_ci    closedir(pDir);
566d9f0492fSopenharmony_ci    return 0;
567d9f0492fSopenharmony_ci}
568d9f0492fSopenharmony_ci
569d9f0492fSopenharmony_ci// Check if in updater mode.
570d9f0492fSopenharmony_ciint InUpdaterMode(void)
571d9f0492fSopenharmony_ci{
572d9f0492fSopenharmony_ci#ifdef OHOS_LITE
573d9f0492fSopenharmony_ci    return 0;
574d9f0492fSopenharmony_ci#else
575d9f0492fSopenharmony_ci    const char * const updaterExecutableFile = "/bin/updater";
576d9f0492fSopenharmony_ci    if (access(updaterExecutableFile, X_OK) == 0) {
577d9f0492fSopenharmony_ci        return 1;
578d9f0492fSopenharmony_ci    } else {
579d9f0492fSopenharmony_ci        return 0;
580d9f0492fSopenharmony_ci    }
581d9f0492fSopenharmony_ci#endif
582d9f0492fSopenharmony_ci}
583d9f0492fSopenharmony_ci
584d9f0492fSopenharmony_ci// Check if in rescue mode.
585d9f0492fSopenharmony_ciint InRescueMode(void)
586d9f0492fSopenharmony_ci{
587d9f0492fSopenharmony_ci#ifdef OHOS_LITE
588d9f0492fSopenharmony_ci    return 1;
589d9f0492fSopenharmony_ci#else
590d9f0492fSopenharmony_ci    char value[MAX_BUFFER_LEN] = {0};
591d9f0492fSopenharmony_ci    int ret = GetParameterFromCmdLine("rescue_mode", value, MAX_BUFFER_LEN);
592d9f0492fSopenharmony_ci    if (ret == 0 && strcmp(value, "true") == 0) {
593d9f0492fSopenharmony_ci        return 0;
594d9f0492fSopenharmony_ci    }
595d9f0492fSopenharmony_ci    return 1;
596d9f0492fSopenharmony_ci#endif
597d9f0492fSopenharmony_ci}
598d9f0492fSopenharmony_ci
599d9f0492fSopenharmony_ciint StringReplaceChr(char *strl, char oldChr, char newChr)
600d9f0492fSopenharmony_ci{
601d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(strl != NULL, return -1, "Invalid parament");
602d9f0492fSopenharmony_ci    char *p = strl;
603d9f0492fSopenharmony_ci    while (*p != '\0') {
604d9f0492fSopenharmony_ci        if (*p == oldChr) {
605d9f0492fSopenharmony_ci            *p = newChr;
606d9f0492fSopenharmony_ci        }
607d9f0492fSopenharmony_ci        p++;
608d9f0492fSopenharmony_ci    }
609d9f0492fSopenharmony_ci    INIT_LOGV("strl is %s", strl);
610d9f0492fSopenharmony_ci    return 0;
611d9f0492fSopenharmony_ci}
612d9f0492fSopenharmony_ci
613d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
614d9f0492fSopenharmony_cistatic void RedirectStdio(int fd)
615d9f0492fSopenharmony_ci{
616d9f0492fSopenharmony_ci    const int stdError = 2;
617d9f0492fSopenharmony_ci    dup2(fd, 0);
618d9f0492fSopenharmony_ci    dup2(fd, 1);
619d9f0492fSopenharmony_ci    dup2(fd, stdError); // Redirect fd to 0, 1, 2
620d9f0492fSopenharmony_ci}
621d9f0492fSopenharmony_ci#endif
622d9f0492fSopenharmony_ci
623d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
624d9f0492fSopenharmony_cistatic int OpenStdioDevice(const char *dev, int flag)
625d9f0492fSopenharmony_ci{
626d9f0492fSopenharmony_ci    setsid();
627d9f0492fSopenharmony_ci    WaitForFile(dev, WAIT_MAX_SECOND);
628d9f0492fSopenharmony_ci    int fd = open(dev, O_RDWR);
629d9f0492fSopenharmony_ci    if (fd >= 0) {
630d9f0492fSopenharmony_ci        ioctl(fd, TIOCSCTTY, flag);
631d9f0492fSopenharmony_ci        RedirectStdio(fd);
632d9f0492fSopenharmony_ci        if (fd > 2) {
633d9f0492fSopenharmony_ci            close(fd);
634d9f0492fSopenharmony_ci        }
635d9f0492fSopenharmony_ci    } else {
636d9f0492fSopenharmony_ci        return errno;
637d9f0492fSopenharmony_ci    }
638d9f0492fSopenharmony_ci    return 0;
639d9f0492fSopenharmony_ci}
640d9f0492fSopenharmony_ci#endif
641d9f0492fSopenharmony_ci
642d9f0492fSopenharmony_ciint OpenConsole(void)
643d9f0492fSopenharmony_ci{
644d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
645d9f0492fSopenharmony_ci    return OpenStdioDevice("/dev/console", 1);
646d9f0492fSopenharmony_ci#else
647d9f0492fSopenharmony_ci    return 0;
648d9f0492fSopenharmony_ci#endif
649d9f0492fSopenharmony_ci}
650d9f0492fSopenharmony_ci
651d9f0492fSopenharmony_ciint OpenKmsg(void)
652d9f0492fSopenharmony_ci{
653d9f0492fSopenharmony_ci#ifndef __LITEOS_M__
654d9f0492fSopenharmony_ci    return OpenStdioDevice("/dev/kmsg", 0);
655d9f0492fSopenharmony_ci#else
656d9f0492fSopenharmony_ci    return 0;
657d9f0492fSopenharmony_ci#endif
658d9f0492fSopenharmony_ci}
659d9f0492fSopenharmony_ci
660d9f0492fSopenharmony_ciINIT_LOCAL_API int StringToLL(const char *str, long long int *out)
661d9f0492fSopenharmony_ci{
662d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(str != NULL && out != NULL, return -1, "Invalid parament");
663d9f0492fSopenharmony_ci    const char *s = str;
664d9f0492fSopenharmony_ci    while (isspace(*s)) {
665d9f0492fSopenharmony_ci        s++;
666d9f0492fSopenharmony_ci    }
667d9f0492fSopenharmony_ci
668d9f0492fSopenharmony_ci    size_t len = strlen(s);
669d9f0492fSopenharmony_ci    int positiveHex = (len > 1 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X'));
670d9f0492fSopenharmony_ci    int negativeHex = (len > 2 && s[0] == '-' && s[1] == '0' && (s[2] == 'x' || s[2] == 'X')); // 2: shorttest
671d9f0492fSopenharmony_ci    int base = (positiveHex || negativeHex) ? HEX_BASE : DECIMAL_BASE;
672d9f0492fSopenharmony_ci    char *end = NULL;
673d9f0492fSopenharmony_ci    errno = 0;
674d9f0492fSopenharmony_ci    *out = strtoll(s, &end, base);
675d9f0492fSopenharmony_ci    if (errno != 0) {
676d9f0492fSopenharmony_ci        INIT_LOGE("StringToLL %s err = %d", str, errno);
677d9f0492fSopenharmony_ci        return -1;
678d9f0492fSopenharmony_ci    }
679d9f0492fSopenharmony_ci    BEGET_CHECK(!(s == end || *end != '\0'), return -1);
680d9f0492fSopenharmony_ci    return 0;
681d9f0492fSopenharmony_ci}
682d9f0492fSopenharmony_ci
683d9f0492fSopenharmony_ciINIT_LOCAL_API int StringToULL(const char *str, unsigned long long int *out)
684d9f0492fSopenharmony_ci{
685d9f0492fSopenharmony_ci    INIT_ERROR_CHECK(str != NULL && out != NULL, return -1, "Invalid parament");
686d9f0492fSopenharmony_ci    const char *s = str;
687d9f0492fSopenharmony_ci    while (isspace(*s)) {
688d9f0492fSopenharmony_ci        s++;
689d9f0492fSopenharmony_ci    }
690d9f0492fSopenharmony_ci    BEGET_CHECK(s[0] != '-', return -1);
691d9f0492fSopenharmony_ci    int base = (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) ? HEX_BASE : DECIMAL_BASE;
692d9f0492fSopenharmony_ci    char *end = NULL;
693d9f0492fSopenharmony_ci    errno = 0;
694d9f0492fSopenharmony_ci    *out = strtoull(s, &end, base);
695d9f0492fSopenharmony_ci    if (errno != 0) {
696d9f0492fSopenharmony_ci        INIT_LOGE("StringToULL %s err = %d", str, errno);
697d9f0492fSopenharmony_ci        return -1;
698d9f0492fSopenharmony_ci    }
699d9f0492fSopenharmony_ci    BEGET_CHECK(end != s, return -1);
700d9f0492fSopenharmony_ci    BEGET_CHECK(*end == '\0', return -1);
701d9f0492fSopenharmony_ci    return 0;
702d9f0492fSopenharmony_ci}
703d9f0492fSopenharmony_ci
704d9f0492fSopenharmony_civoid TrimTail(char *str, char c)
705d9f0492fSopenharmony_ci{
706d9f0492fSopenharmony_ci    char *end = str + strlen(str) - 1;
707d9f0492fSopenharmony_ci    while (end >= str && *end == c) {
708d9f0492fSopenharmony_ci        *end = '\0';
709d9f0492fSopenharmony_ci        end--;
710d9f0492fSopenharmony_ci    }
711d9f0492fSopenharmony_ci}
712d9f0492fSopenharmony_ci
713d9f0492fSopenharmony_cichar *TrimHead(char *str, char c)
714d9f0492fSopenharmony_ci{
715d9f0492fSopenharmony_ci    char *head = str;
716d9f0492fSopenharmony_ci    const char *end = str + strlen(str);
717d9f0492fSopenharmony_ci    while (head < end && *head == c) {
718d9f0492fSopenharmony_ci        *head = '\0';
719d9f0492fSopenharmony_ci        head++;
720d9f0492fSopenharmony_ci    }
721d9f0492fSopenharmony_ci    return head;
722d9f0492fSopenharmony_ci}
723d9f0492fSopenharmony_ci
724d9f0492fSopenharmony_ciint GetParameterFromCmdLine(const char *paramName, char *value, size_t valueLen)
725d9f0492fSopenharmony_ci{
726d9f0492fSopenharmony_ci    char *buffer = ReadFileData(BOOT_CMD_LINE);
727d9f0492fSopenharmony_ci    BEGET_ERROR_CHECK(buffer != NULL, return -1, "Failed to read /proc/cmdline");
728d9f0492fSopenharmony_ci    int ret = GetProcCmdlineValue(paramName, buffer, value, valueLen);
729d9f0492fSopenharmony_ci    free(buffer);
730d9f0492fSopenharmony_ci    return ret;
731d9f0492fSopenharmony_ci}
732d9f0492fSopenharmony_ci
733d9f0492fSopenharmony_ciuint32_t IntervalTime(struct timespec *startTime, struct timespec *endTime)
734d9f0492fSopenharmony_ci{
735d9f0492fSopenharmony_ci    uint32_t diff = 0;
736d9f0492fSopenharmony_ci    if (endTime->tv_sec > startTime->tv_sec) {
737d9f0492fSopenharmony_ci        diff = (uint32_t)(endTime->tv_sec - startTime->tv_sec);
738d9f0492fSopenharmony_ci    } else {
739d9f0492fSopenharmony_ci        diff = (uint32_t)(startTime->tv_sec - endTime->tv_sec);
740d9f0492fSopenharmony_ci    }
741d9f0492fSopenharmony_ci    return diff;
742d9f0492fSopenharmony_ci}
743d9f0492fSopenharmony_ci
744d9f0492fSopenharmony_citypedef int (*str_compare)(const char *s1, const char *s2);
745d9f0492fSopenharmony_ciint OH_ExtendableStrArrayGetIndex(const char *strArray[], const char *target, int ignoreCase, const char *extend[])
746d9f0492fSopenharmony_ci{
747d9f0492fSopenharmony_ci    int i;
748d9f0492fSopenharmony_ci    int idx;
749d9f0492fSopenharmony_ci    str_compare cmp = strcmp;
750d9f0492fSopenharmony_ci
751d9f0492fSopenharmony_ci    if ((strArray == NULL) || (target == NULL) || (target[0] == '\0')) {
752d9f0492fSopenharmony_ci        return -1;
753d9f0492fSopenharmony_ci    }
754d9f0492fSopenharmony_ci
755d9f0492fSopenharmony_ci    if (ignoreCase) {
756d9f0492fSopenharmony_ci        cmp = strcasecmp;
757d9f0492fSopenharmony_ci    }
758d9f0492fSopenharmony_ci
759d9f0492fSopenharmony_ci    for (i = 0; strArray[i] != NULL; i++) {
760d9f0492fSopenharmony_ci        if (cmp(strArray[i], target) == 0) {
761d9f0492fSopenharmony_ci            return i;
762d9f0492fSopenharmony_ci        }
763d9f0492fSopenharmony_ci    }
764d9f0492fSopenharmony_ci    if (extend == NULL) {
765d9f0492fSopenharmony_ci        return -1;
766d9f0492fSopenharmony_ci    }
767d9f0492fSopenharmony_ci    idx = 0;
768d9f0492fSopenharmony_ci    while (extend[idx] != NULL) {
769d9f0492fSopenharmony_ci        if (cmp(extend[idx], target) == 0) {
770d9f0492fSopenharmony_ci            return i + idx;
771d9f0492fSopenharmony_ci        }
772d9f0492fSopenharmony_ci        idx++;
773d9f0492fSopenharmony_ci    }
774d9f0492fSopenharmony_ci    return -1;
775d9f0492fSopenharmony_ci}
776d9f0492fSopenharmony_ci
777d9f0492fSopenharmony_ciint OH_StrArrayGetIndex(const char *strArray[], const char *target, int ignoreCase)
778d9f0492fSopenharmony_ci{
779d9f0492fSopenharmony_ci    return OH_ExtendableStrArrayGetIndex(strArray, target, ignoreCase, NULL);
780d9f0492fSopenharmony_ci}
781d9f0492fSopenharmony_ci
782d9f0492fSopenharmony_civoid *OH_ExtendableStrDictGet(void **strDict, int dictSize, const char *target, int ignoreCase, void **extendStrDict)
783d9f0492fSopenharmony_ci{
784d9f0492fSopenharmony_ci    int i;
785d9f0492fSopenharmony_ci    const char *pos;
786d9f0492fSopenharmony_ci    str_compare cmp = strcmp;
787d9f0492fSopenharmony_ci
788d9f0492fSopenharmony_ci    if ((strDict == NULL) || dictSize < 0 || ((size_t)dictSize < sizeof(const char *)) ||
789d9f0492fSopenharmony_ci        (target == NULL) || (target[0] == '\0')) {
790d9f0492fSopenharmony_ci        return NULL;
791d9f0492fSopenharmony_ci    }
792d9f0492fSopenharmony_ci
793d9f0492fSopenharmony_ci    if (ignoreCase) {
794d9f0492fSopenharmony_ci        cmp = strcasecmp;
795d9f0492fSopenharmony_ci    }
796d9f0492fSopenharmony_ci
797d9f0492fSopenharmony_ci    i = 0;
798d9f0492fSopenharmony_ci    pos = (const char *)strDict;
799d9f0492fSopenharmony_ci    while (*(const char **)pos != NULL) {
800d9f0492fSopenharmony_ci        if (cmp(*(const char **)pos, target) == 0) {
801d9f0492fSopenharmony_ci            return (void *)pos;
802d9f0492fSopenharmony_ci        }
803d9f0492fSopenharmony_ci        i++;
804d9f0492fSopenharmony_ci        pos = pos + dictSize;
805d9f0492fSopenharmony_ci    }
806d9f0492fSopenharmony_ci    if (extendStrDict == NULL) {
807d9f0492fSopenharmony_ci        return NULL;
808d9f0492fSopenharmony_ci    }
809d9f0492fSopenharmony_ci    pos = (const char *)extendStrDict;
810d9f0492fSopenharmony_ci    while (*(const char **)pos != NULL) {
811d9f0492fSopenharmony_ci        if (cmp(*(const char **)pos, target) == 0) {
812d9f0492fSopenharmony_ci            return (void *)pos;
813d9f0492fSopenharmony_ci        }
814d9f0492fSopenharmony_ci        i++;
815d9f0492fSopenharmony_ci        pos = pos + dictSize;
816d9f0492fSopenharmony_ci    }
817d9f0492fSopenharmony_ci    return NULL;
818d9f0492fSopenharmony_ci}
819d9f0492fSopenharmony_ci
820d9f0492fSopenharmony_civoid *OH_StrDictGet(void **strDict, int dictSize, const char *target, int ignoreCase)
821d9f0492fSopenharmony_ci{
822d9f0492fSopenharmony_ci    return OH_ExtendableStrDictGet(strDict, dictSize, target, ignoreCase, NULL);
823d9f0492fSopenharmony_ci}
824d9f0492fSopenharmony_ci
825d9f0492fSopenharmony_cilong long GetUptimeInMicroSeconds(const struct timespec *uptime)
826d9f0492fSopenharmony_ci{
827d9f0492fSopenharmony_ci    struct timespec now;
828d9f0492fSopenharmony_ci
829d9f0492fSopenharmony_ci    if (uptime == NULL) {
830d9f0492fSopenharmony_ci        clock_gettime(CLOCK_MONOTONIC, &now);
831d9f0492fSopenharmony_ci        uptime = &now;
832d9f0492fSopenharmony_ci    }
833d9f0492fSopenharmony_ci
834d9f0492fSopenharmony_ci    #define SECOND_TO_MICRO_SECOND (1000000)
835d9f0492fSopenharmony_ci    #define MICRO_SECOND_TO_NANOSECOND (1000)
836d9f0492fSopenharmony_ci
837d9f0492fSopenharmony_ci    return ((long long)uptime->tv_sec * SECOND_TO_MICRO_SECOND) +
838d9f0492fSopenharmony_ci            (uptime->tv_nsec / MICRO_SECOND_TO_NANOSECOND);
839d9f0492fSopenharmony_ci}
840