/* * \file cmd_defenv_without.c * \brief use this cmd but not 'env default', * to reserve some envs after defaulting envs * * \version 1.0.0 * \date 15/09/29 * \author Sam.Wu * * Copyright (c) 2015 Amlogic. 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("Err"), printf(fmt) #define MsgP(fmt...) ModPrefix("Err"), printf(fmt) static int _reserve_env_list_after_defenv(const int reservNum, const char* const reservNameList[]) { int ret = 0; int index = 0; unsigned sumOfEnvVal = 0;//sum of strlen(getenv(env_i)) const int MaxReservNum = CONFIG_SYS_MAXARGS - 1; const char* valListBuf[MaxReservNum];//store at most 64 envs char* tmpEnvBuf = NULL; 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]; const char* cfgEnvVal = getenv(cfgEnvKey); if (cfgEnvVal) { sumOfEnvVal += strlen(cfgEnvVal) + 1; } valListBuf[index] = cfgEnvVal; } //2, transfer the env values to buffer if (sumOfEnvVal) { tmpEnvBuf = (char*)malloc(sumOfEnvVal); if (!tmpEnvBuf) { errorP("Fail in malloc(%d)\n", sumOfEnvVal); return __LINE__; } memset(tmpEnvBuf, 0, sumOfEnvVal); char* tmpbuf = tmpEnvBuf; for (index = 0; index < reservNum; ++index ) { const char* valBeforeDef = valListBuf[index]; if (!valBeforeDef) continue; const unsigned thisValLen = strlen(valBeforeDef) + 1; memcpy(tmpbuf, valBeforeDef, thisValLen); valListBuf[index] = tmpbuf; tmpbuf += thisValLen ; debugP("tmpEnvBuf=%p, tmpbuf=%p, thisValLen=%d\n", tmpEnvBuf, tmpbuf, thisValLen); debugP("cp:k[%s]%s-->%s\n", reservNameList[index], valBeforeDef, tmpEnvBuf); } } set_default_env("## defenv_reserve\n"); if (sumOfEnvVal) { for (index = 0; index < reservNum; ++index) { const char* cfgEnvKey = reservNameList[index]; const char* valAftDef = valListBuf[index]; if (valAftDef) { setenv(cfgEnvKey, valAftDef); debugP("set[%s=%s]\n", cfgEnvKey, valAftDef); } } } if (tmpEnvBuf) free(tmpEnvBuf) ; 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 );