blob: 611e5b62df90e911420ea9cc2f8eb1b7f76f2a06 [file] [log] [blame]
/*
* \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 <yihui.wu@amlgic.com>
*
* Copyright (c) 2015 Amlogic. All Rights Reserved.
*
*/
#include <config.h>
#include <common.h>
#include <command.h>
#include <environment.h>
#include <cli.h>
#include <errno.h>
#include <malloc.h>
#include <linux/stddef.h>
#include <asm/byteorder.h>
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 <reserv_en0 reserv_env1 ...> \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
);