/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ /* * common/cmd_defenv_without.c * * Copyright (C) 2020 Amlogic, Inc. All rights reserved. * */ #include #include #include #include #include #include #include #include #include static const char* const temp_for_compile[] = {"__test1","__test2","__test3",NULL}; extern const char * const _env_args_reserve_[0] __attribute__((weak, alias("temp_for_compile"))); #define ModPrefix(pre) printf(pre"[def_wi]") #define debugP(fmt...) //ModPrefix("Dbg"),printf("L%d:", __LINE__),printf(fmt) #define errorP(fmt...) ModPrefix("Err"), printf("L%d:", __LINE__),printf(fmt) #define wrnP(fmt...) ModPrefix("Wrn"), printf(fmt) #define MsgP(fmt...) ModPrefix("Msg"), printf(fmt) #define MaxEnvLen 2048 static int _reserve_env_list_after_defenv(const int reservNum, const char* const reservNameList[]) { int ret = 0; int index = 0; const int MaxReservNum = CONFIG_SYS_MAXARGS - 1; const char* valListBuf[MaxReservNum];//store at most 64 envs char tmpBuf[MaxEnvLen]; if (reservNum > MaxReservNum) { errorP("max reserved env list num %d < wanted %d\n", MaxReservNum, reservNum); return __LINE__; } //1, cal the total buf size needed to save the envs for (index = 0; index < reservNum; ++index) { const char* cfgEnvKey = reservNameList[index]; int i = 0; const char* envVal = getenv(cfgEnvKey); if (!envVal) {valListBuf[index] = NULL; continue;} int envLen = MaxEnvLen; for (; i < MaxEnvLen; ++i) { if ('\0' == envVal[i]) { envLen = i + 1;//include '\0' break; } } memcpy(tmpBuf, envVal, envLen); tmpBuf[--envLen] = '\0'; valListBuf[index] = strdup(tmpBuf); } set_default_env("## defenv_reserve\n"); for (index = 0; index < reservNum; ++index) { const char* cfgEnvKey = reservNameList[index]; const char* valAftDef = valListBuf[index]; if (!valAftDef) continue; setenv(cfgEnvKey, valAftDef); debugP("set[%s=%s]\n", cfgEnvKey, valAftDef); free((char*)valAftDef); } return ret; } static int do_defenv_reserv(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int envListNum = argc - 1; const char** envListArr = (const char**)(argv + 1); if (!envListNum) { envListArr = (const char**)_env_args_reserve_; const char** pArr = (const char**)envListArr; while (*pArr++) ++envListNum; } int ret = _reserve_env_list_after_defenv(envListNum, envListArr); return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS; } U_BOOT_CMD( defenv_reserv, //command name CONFIG_SYS_MAXARGS, //maxargs 0, //repeatable do_defenv_reserv, //command function "reserve some specified envs after defaulting env", //description " argv: defenv_reserve \n" //usage " - e.g. \n" " defenv_reserve :\n" //usage " NOT env list , reserv cfg array '_env_args_reserve_' in gxbb_p200.c\n" " defenv_reserve reserv_en0, reserv_env1, ...\n" //usage " reserve specified envs after defaulting env\n" //usage );