separating environment commands, part 1
Signed-off-by: Juergen Beisert <j.beisert@pengutronix.de>
This commit is contained in:
parent
d59c600c65
commit
2966bba216
|
@ -22,6 +22,14 @@ config CMD_ENVIRONMENT
|
|||
tristate
|
||||
prompt "saveenv / loadenv"
|
||||
|
||||
config CMD_EXPORT
|
||||
tristate
|
||||
prompt "export"
|
||||
|
||||
config CMD_PRINTENV
|
||||
tristate
|
||||
prompt "printenv"
|
||||
|
||||
config CMD_HELP
|
||||
tristate
|
||||
default y
|
||||
|
|
|
@ -36,3 +36,6 @@ obj-$(CONFIG_CMD_MC) += mc.o
|
|||
obj-$(CONFIG_CMD_MD) += md.o
|
||||
obj-$(CONFIG_CMD_MEMCPY) += memcpy.o
|
||||
obj-$(CONFIG_CMD_MV) += mv.o
|
||||
obj-$(CONFIG_SIMPLE_PARSER) += setenv.o
|
||||
obj-$(CONFIG_CMD_EXPORT) += export.o
|
||||
obj-$(CONFIG_CMD_PRINTENV) += printenv.o
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* Copyright (c) 2007 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief export: Export an environment variable
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <errno.h>
|
||||
#include <environment.h>
|
||||
|
||||
static int do_export ( cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||
{
|
||||
int i = 1;
|
||||
char *ptr;
|
||||
|
||||
if (argc < 2) {
|
||||
printf ("Usage:\n%s\n", cmdtp->usage);
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (i < argc) {
|
||||
if ((ptr = strchr(argv[i], '='))) {
|
||||
*ptr++ = 0;
|
||||
setenv(argv[i], ptr);
|
||||
}
|
||||
if (export(argv[i])) {
|
||||
printf("could not export: %s\n", argv[i]);
|
||||
return 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __maybe_unused char cmd_export_help[] =
|
||||
"Usage: export <var>[=value]...\n"
|
||||
"export an environment variable to subsequently executed scripts\n";
|
||||
|
||||
U_BOOT_CMD_START(export)
|
||||
.maxargs = CONFIG_MAXARGS,
|
||||
.cmd = do_export,
|
||||
.usage = "export environment variables",
|
||||
U_BOOT_CMD_HELP(cmd_export_help)
|
||||
U_BOOT_CMD_END
|
||||
|
||||
/**
|
||||
* @page export_command export: Export an environment variable
|
||||
*
|
||||
* Usage: export \<var>[=value]...
|
||||
*
|
||||
* Export an environment variable to subsequently executed scripts.
|
||||
*/
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Copyright (c) 2007 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief printenv: Print out environment variables
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <errno.h>
|
||||
#include <environment.h>
|
||||
|
||||
static int do_printenv (cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||
{
|
||||
struct variable_d *var;
|
||||
struct env_context *c, *current_c;
|
||||
|
||||
if (argc == 2) {
|
||||
const char *val = getenv(argv[1]);
|
||||
if (val) {
|
||||
printf("%s=%s\n", argv[1], val);
|
||||
return 0;
|
||||
}
|
||||
printf("## Error: \"%s\" not defined\n", argv[1]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
current_c = get_current_context();
|
||||
var = current_c->local->next;
|
||||
printf("locals:\n");
|
||||
while (var) {
|
||||
printf("%s=%s\n", var_name(var), var_val(var));
|
||||
var = var->next;
|
||||
}
|
||||
|
||||
printf("globals:\n");
|
||||
c = get_current_context();
|
||||
while(c) {
|
||||
var = c->global->next;
|
||||
while (var) {
|
||||
printf("%s=%s\n", var_name(var), var_val(var));
|
||||
var = var->next;
|
||||
}
|
||||
c = c->parent;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U_BOOT_CMD_START(printenv)
|
||||
.maxargs = CONFIG_MAXARGS,
|
||||
.cmd = do_printenv,
|
||||
.usage = "print environment variables",
|
||||
U_BOOT_CMD_HELP(
|
||||
"\n - print values of all environment variables\n"
|
||||
"printenv name ...\n"
|
||||
" - print value of environment variable 'name'\n")
|
||||
U_BOOT_CMD_END
|
||||
|
||||
/**
|
||||
* @page printenv_command printenv
|
||||
*
|
||||
* Usage: printenv [\<name>]
|
||||
*
|
||||
* Print environment variables.
|
||||
* If \<name> was given, it prints out its content if the environment variable
|
||||
* \<name> exists.
|
||||
*
|
||||
* Without the \<name> argument all current environment variables are printed.
|
||||
*/
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* Copyright (c) 2007 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief setenv: Set an environment variables
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <errno.h>
|
||||
#include <environment.h>
|
||||
|
||||
static int do_setenv ( cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||
{
|
||||
if (argc < 2) {
|
||||
printf ("Usage:\n%s\n", cmdtp->usage);
|
||||
return 1;
|
||||
}
|
||||
|
||||
setenv(argv[1], argv[2]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U_BOOT_CMD_START(setenv)
|
||||
.maxargs = CONFIG_MAXARGS,
|
||||
.cmd = do_setenv,
|
||||
.usage = "set environment variables",
|
||||
U_BOOT_CMD_HELP(
|
||||
"name value ...\n"
|
||||
" - set environment variable 'name' to 'value ...'\n"
|
||||
"setenv name\n"
|
||||
" - delete environment variable 'name'\n")
|
||||
U_BOOT_CMD_END
|
||||
|
||||
/**
|
||||
* @page setenv_command setenv: set an environment variable
|
||||
*
|
||||
* Usage: setenv \<name> [\<value>]
|
||||
*
|
||||
* Set environment variable \<name> to \<value>. Without a given value, the
|
||||
* environment variable will be deleted.
|
||||
*
|
||||
* @note This command is only available if the simple command line parser is
|
||||
* in use. Within the hush shell \c setenv is not required.
|
||||
*/
|
178
common/env.c
178
common/env.c
|
@ -26,37 +26,15 @@
|
|||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <driver.h>
|
||||
#include <malloc.h>
|
||||
#include <xfuncs.h>
|
||||
#include <errno.h>
|
||||
#include <init.h>
|
||||
|
||||
/**
|
||||
* Managment of a environment variable
|
||||
*/
|
||||
struct variable_d {
|
||||
/*! List management */
|
||||
struct variable_d *next;
|
||||
/*! variable length data */
|
||||
char data[0];
|
||||
};
|
||||
#include <environment.h>
|
||||
|
||||
#define VARIABLE_D_SIZE(name, value) (sizeof(struct variable_d) + strlen(name) + strlen(value) + 2)
|
||||
|
||||
/**
|
||||
* FIXME
|
||||
*/
|
||||
struct env_context {
|
||||
/*! FIXME */
|
||||
struct env_context *parent;
|
||||
/*! FIXME */
|
||||
struct variable_d *local;
|
||||
/*! FIXME */
|
||||
struct variable_d *global;
|
||||
};
|
||||
|
||||
static struct env_context *context;
|
||||
|
||||
/**
|
||||
|
@ -74,6 +52,14 @@ static void free_variables(struct variable_d *v)
|
|||
}
|
||||
}
|
||||
|
||||
/** Read back current context */
|
||||
struct env_context *get_current_context(void)
|
||||
{
|
||||
return context;
|
||||
}
|
||||
EXPORT_SYMBOL(get_current_context);
|
||||
|
||||
|
||||
/**
|
||||
* FIXME
|
||||
*/
|
||||
|
@ -120,7 +106,7 @@ int env_pop_context(void)
|
|||
* @param[in] var Variable of interest
|
||||
* @return Value as text
|
||||
*/
|
||||
static char *var_val(struct variable_d *var)
|
||||
char *var_val(struct variable_d *var)
|
||||
{
|
||||
return &var->data[strlen(var->data) + 1];
|
||||
}
|
||||
|
@ -130,7 +116,7 @@ static char *var_val(struct variable_d *var)
|
|||
* @param[in] var Variable of interest
|
||||
* @return Name as text
|
||||
*/
|
||||
static char *var_name(struct variable_d *var)
|
||||
char *var_name(struct variable_d *var)
|
||||
{
|
||||
return var->data;
|
||||
}
|
||||
|
@ -256,145 +242,3 @@ int export(const char *varname)
|
|||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL(export);
|
||||
|
||||
static int do_printenv (cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||
{
|
||||
struct variable_d *var;
|
||||
struct env_context *c;
|
||||
|
||||
if (argc == 2) {
|
||||
const char *val = getenv(argv[1]);
|
||||
if (val) {
|
||||
printf("%s=%s\n", argv[1], val);
|
||||
return 0;
|
||||
}
|
||||
printf("## Error: \"%s\" not defined\n", argv[1]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
var = context->local->next;
|
||||
printf("locals:\n");
|
||||
while (var) {
|
||||
printf("%s=%s\n", var_name(var), var_val(var));
|
||||
var = var->next;
|
||||
}
|
||||
|
||||
printf("globals:\n");
|
||||
c = context;
|
||||
while(c) {
|
||||
var = c->global->next;
|
||||
while (var) {
|
||||
printf("%s=%s\n", var_name(var), var_val(var));
|
||||
var = var->next;
|
||||
}
|
||||
c = c->parent;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U_BOOT_CMD_START(printenv)
|
||||
.maxargs = CONFIG_MAXARGS,
|
||||
.cmd = do_printenv,
|
||||
.usage = "print environment variables",
|
||||
U_BOOT_CMD_HELP(
|
||||
"\n - print values of all environment variables\n"
|
||||
"printenv name ...\n"
|
||||
" - print value of environment variable 'name'\n")
|
||||
U_BOOT_CMD_END
|
||||
|
||||
/**
|
||||
* @page printenv_command printenv
|
||||
*
|
||||
* Usage: printenv [\<name>]
|
||||
*
|
||||
* Print environment variables.
|
||||
* If \<name> was given, it prints out its content if the environment variable
|
||||
* \<name> exists.
|
||||
* Without the \<name> argument all current environment variables are printed.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_SIMPLE_PARSER
|
||||
static int do_setenv ( cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||
{
|
||||
if (argc < 2) {
|
||||
printf ("Usage:\n%s\n", cmdtp->usage);
|
||||
return 1;
|
||||
}
|
||||
|
||||
setenv(argv[1], argv[2]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U_BOOT_CMD_START(setenv)
|
||||
.maxargs = CONFIG_MAXARGS,
|
||||
.cmd = do_setenv,
|
||||
.usage = "set environment variables",
|
||||
U_BOOT_CMD_HELP(
|
||||
"name value ...\n"
|
||||
" - set environment variable 'name' to 'value ...'\n"
|
||||
"setenv name\n"
|
||||
" - delete environment variable 'name'\n")
|
||||
U_BOOT_CMD_END
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @page setenv_command setenv
|
||||
*
|
||||
* Usage: setenv \<name> [\<val>]
|
||||
*
|
||||
* Set environment variable \<name> to \<val ...>
|
||||
* If no \<val> was given, the variable \<name> will be removed.
|
||||
*
|
||||
* This command can be replaced by using the simpler form in the hush:
|
||||
*
|
||||
* \<name> = \<val>
|
||||
*
|
||||
* @note This command is only required if the simple
|
||||
* parser (not the hush) is in use.
|
||||
*/
|
||||
|
||||
static int do_export ( cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||
{
|
||||
int i = 1;
|
||||
char *ptr;
|
||||
|
||||
if (argc < 2) {
|
||||
printf ("Usage:\n%s\n", cmdtp->usage);
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (i < argc) {
|
||||
if ((ptr = strchr(argv[i], '='))) {
|
||||
*ptr++ = 0;
|
||||
setenv(argv[i], ptr);
|
||||
}
|
||||
if (export(argv[i])) {
|
||||
printf("could not export: %s\n", argv[i]);
|
||||
return 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __maybe_unused char cmd_export_help[] =
|
||||
"Usage: export <var>[=value]...\n"
|
||||
"export an environment variable to subsequently executed scripts\n";
|
||||
|
||||
U_BOOT_CMD_START(export)
|
||||
.maxargs = CONFIG_MAXARGS,
|
||||
.cmd = do_export,
|
||||
.usage = "export environment variables",
|
||||
U_BOOT_CMD_HELP(cmd_export_help)
|
||||
U_BOOT_CMD_END
|
||||
|
||||
/**
|
||||
* @page export_command export
|
||||
*
|
||||
* Usage: export \<var>[=value]...
|
||||
*
|
||||
* Export an environment variable to subsequently executed scripts
|
||||
*/
|
||||
|
|
|
@ -24,6 +24,24 @@
|
|||
#ifndef _ENVIRONMENT_H_
|
||||
#define _ENVIRONMENT_H_
|
||||
|
||||
/**
|
||||
* Managment of a environment variable
|
||||
*/
|
||||
struct variable_d {
|
||||
struct variable_d *next; /**< List management */
|
||||
char data[0]; /**< variable length data */
|
||||
};
|
||||
|
||||
struct env_context {
|
||||
struct env_context *parent; /**< FIXME */
|
||||
struct variable_d *local; /**< FIXME */
|
||||
struct variable_d *global; /**< FIXME */
|
||||
};
|
||||
|
||||
struct env_context *get_current_context(void);
|
||||
char *var_val(struct variable_d *);
|
||||
char *var_name(struct variable_d *);
|
||||
|
||||
const char *getenv(const char *);
|
||||
int setenv(const char *, const char *);
|
||||
|
||||
|
@ -33,5 +51,10 @@ int env_push_context(void);
|
|||
int envfs_load(char *filename, char *dirname);
|
||||
int envfs_save(char *filename, char *dirname);
|
||||
|
||||
int export(const char *);
|
||||
|
||||
#endif /* _ENVIRONMENT_H_ */
|
||||
|
||||
/** @file
|
||||
* @brief Environment handling
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue