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