Blame view

common/cmd_nvedit.c 28.9 KB
a68d3ed0a   wdenk   Initial revision
1
  /*
ea009d474   Wolfgang Denk   hashtable: prepar...
2
   * (C) Copyright 2000-2013
a68d3ed0a   wdenk   Initial revision
3
4
5
6
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
   * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
   * Andreas Heppel <aheppel@sysgo.de>
a000b7950   Kim Phillips   common: add a gre...
7
8
9
   *
   * Copyright 2011 Freescale Semiconductor, Inc.
   *
3765b3e7b   Wolfgang Denk   Coding Style clea...
10
   * SPDX-License-Identifier:	GPL-2.0+
a68d3ed0a   wdenk   Initial revision
11
   */
ea882baf9   Wolfgang Denk   New implementatio...
12
  /*
a68d3ed0a   wdenk   Initial revision
13
14
   * Support for persistent environment data
   *
ea882baf9   Wolfgang Denk   New implementatio...
15
16
17
18
19
   * The "environment" is stored on external storage as a list of '\0'
   * terminated "name=value" strings. The end of the list is marked by
   * a double '\0'. The environment is preceeded by a 32 bit CRC over
   * the data part and, in case of redundant environment, a byte of
   * flags.
a68d3ed0a   wdenk   Initial revision
20
   *
ea882baf9   Wolfgang Denk   New implementatio...
21
22
23
   * This linearized representation will also be used before
   * relocation, i. e. as long as we don't have a full C runtime
   * environment. After that, we use a hash table.
a68d3ed0a   wdenk   Initial revision
24
25
26
27
28
   */
  
  #include <common.h>
  #include <command.h>
  #include <environment.h>
ea882baf9   Wolfgang Denk   New implementatio...
29
30
  #include <search.h>
  #include <errno.h>
246c69225   Peter Tyser   Add 'editenv' com...
31
  #include <malloc.h>
2a3cb0207   wdenk   Quick & Dirty fix...
32
  #include <watchdog.h>
a68d3ed0a   wdenk   Initial revision
33
34
  #include <linux/stddef.h>
  #include <asm/byteorder.h>
a68d3ed0a   wdenk   Initial revision
35

d87080b72   Wolfgang Denk   GCC-4.x fixes: cl...
36
  DECLARE_GLOBAL_DATA_PTR;
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
37
38
39
  #if	!defined(CONFIG_ENV_IS_IN_EEPROM)	&& \
  	!defined(CONFIG_ENV_IS_IN_FLASH)	&& \
  	!defined(CONFIG_ENV_IS_IN_DATAFLASH)	&& \
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
40
  	!defined(CONFIG_ENV_IS_IN_MMC)		&& \
57210c7cc   Maximilian Schwerin   Add support for l...
41
  	!defined(CONFIG_ENV_IS_IN_FAT)		&& \
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
42
43
44
45
  	!defined(CONFIG_ENV_IS_IN_NAND)		&& \
  	!defined(CONFIG_ENV_IS_IN_NVRAM)	&& \
  	!defined(CONFIG_ENV_IS_IN_ONENAND)	&& \
  	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)	&& \
0a85a9e70   Liu Gang   powerpc/corenet_d...
46
  	!defined(CONFIG_ENV_IS_IN_REMOTE)	&& \
2b74433f3   Joe Hershberger   env: Add support ...
47
  	!defined(CONFIG_ENV_IS_IN_UBI)		&& \
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
48
  	!defined(CONFIG_ENV_IS_NOWHERE)
75eb82ec7   unsik Kim   mflash: Initial m...
49
  # error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|\
2b74433f3   Joe Hershberger   env: Add support ...
50
  SPI_FLASH|NVRAM|MMC|FAT|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE
a68d3ed0a   wdenk   Initial revision
51
  #endif
ea882baf9   Wolfgang Denk   New implementatio...
52
53
54
55
  /*
   * Maximum expected input data size for import command
   */
  #define	MAX_ENV_SIZE	(1 << 20)	/* 1 MiB */
a68d3ed0a   wdenk   Initial revision
56

a68d3ed0a   wdenk   Initial revision
57
  /*
ea882baf9   Wolfgang Denk   New implementatio...
58
   * This variable is incremented on each do_env_set(), so it can
da95427ce   Heiko Schocher   netloop: updates ...
59
60
61
62
63
   * be used via get_env_id() as an indication, if the environment
   * has changed or not. So it is possible to reread an environment
   * variable only if the environment was changed ... done so for
   * example in NetInitLoop()
   */
2f70c49e5   Heiko Schocher   netloop: speed up...
64
  static int env_id = 1;
a68d3ed0a   wdenk   Initial revision
65

f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
66
  int get_env_id(void)
2f70c49e5   Heiko Schocher   netloop: speed up...
67
68
69
  {
  	return env_id;
  }
a68d3ed0a   wdenk   Initial revision
70

7ac2fe2da   Ilya Yanok   OMAP: networking ...
71
  #ifndef CONFIG_SPL_BUILD
4c94f6c54   Mike Frysinger   nvedit: speed up ...
72
  /*
ea882baf9   Wolfgang Denk   New implementatio...
73
74
75
   * Command interface: print one or all environment variables
   *
   * Returns 0 in case of error, or length of printed string
4c94f6c54   Mike Frysinger   nvedit: speed up ...
76
   */
be11235ab   Joe Hershberger   env: Hide '.' var...
77
  static int env_print(char *name, int flag)
a68d3ed0a   wdenk   Initial revision
78
  {
ea882baf9   Wolfgang Denk   New implementatio...
79
  	char *res = NULL;
22a4a6c5c   Maxime Larocque   printenv: Correct...
80
  	ssize_t len;
ea882baf9   Wolfgang Denk   New implementatio...
81
82
83
84
85
86
  
  	if (name) {		/* print a single name */
  		ENTRY e, *ep;
  
  		e.key = name;
  		e.data = NULL;
be11235ab   Joe Hershberger   env: Hide '.' var...
87
  		hsearch_r(e, FIND, &ep, &env_htab, flag);
ea882baf9   Wolfgang Denk   New implementatio...
88
89
  		if (ep == NULL)
  			return 0;
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
90
91
  		len = printf("%s=%s
  ", ep->key, ep->data);
ea882baf9   Wolfgang Denk   New implementatio...
92
93
  		return len;
  	}
a68d3ed0a   wdenk   Initial revision
94

ea882baf9   Wolfgang Denk   New implementatio...
95
  	/* print whole list */
be11235ab   Joe Hershberger   env: Hide '.' var...
96
97
  	len = hexport_r(&env_htab, '
  ', flag, &res, 0, 0, NULL);
a68d3ed0a   wdenk   Initial revision
98

ea882baf9   Wolfgang Denk   New implementatio...
99
100
101
102
  	if (len > 0) {
  		puts(res);
  		free(res);
  		return len;
a68d3ed0a   wdenk   Initial revision
103
  	}
ea882baf9   Wolfgang Denk   New implementatio...
104
  	/* should never happen */
22a4a6c5c   Maxime Larocque   printenv: Correct...
105
106
  	printf("## Error: cannot export environment
  ");
ea882baf9   Wolfgang Denk   New implementatio...
107
  	return 0;
4c94f6c54   Mike Frysinger   nvedit: speed up ...
108
  }
a68d3ed0a   wdenk   Initial revision
109

088f1b199   Kim Phillips   common/cmd_*.c: s...
110
111
  static int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc,
  			char * const argv[])
4c94f6c54   Mike Frysinger   nvedit: speed up ...
112
113
114
  {
  	int i;
  	int rcode = 0;
be11235ab   Joe Hershberger   env: Hide '.' var...
115
116
117
118
119
120
121
  	int env_flag = H_HIDE_DOT;
  
  	if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'a') {
  		argc--;
  		argv++;
  		env_flag &= ~H_HIDE_DOT;
  	}
a68d3ed0a   wdenk   Initial revision
122

4c94f6c54   Mike Frysinger   nvedit: speed up ...
123
124
  	if (argc == 1) {
  		/* print all env vars */
be11235ab   Joe Hershberger   env: Hide '.' var...
125
  		rcode = env_print(NULL, env_flag);
ea882baf9   Wolfgang Denk   New implementatio...
126
  		if (!rcode)
4c94f6c54   Mike Frysinger   nvedit: speed up ...
127
128
129
130
131
132
133
  			return 1;
  		printf("
  Environment size: %d/%ld bytes
  ",
  			rcode, (ulong)ENV_SIZE);
  		return 0;
  	}
a68d3ed0a   wdenk   Initial revision
134

4c94f6c54   Mike Frysinger   nvedit: speed up ...
135
  	/* print selected env vars */
be11235ab   Joe Hershberger   env: Hide '.' var...
136
  	env_flag &= ~H_HIDE_DOT;
4c94f6c54   Mike Frysinger   nvedit: speed up ...
137
  	for (i = 1; i < argc; ++i) {
be11235ab   Joe Hershberger   env: Hide '.' var...
138
  		int rc = env_print(argv[i], env_flag);
ea882baf9   Wolfgang Denk   New implementatio...
139
140
141
  		if (!rc) {
  			printf("## Error: \"%s\" not defined
  ", argv[i]);
4c94f6c54   Mike Frysinger   nvedit: speed up ...
142
  			++rcode;
a68d3ed0a   wdenk   Initial revision
143
144
  		}
  	}
4c94f6c54   Mike Frysinger   nvedit: speed up ...
145

a68d3ed0a   wdenk   Initial revision
146
147
  	return rcode;
  }
a000b7950   Kim Phillips   common: add a gre...
148
  #ifdef CONFIG_CMD_GREPENV
d09b1787a   Igor Grinberg   env: clean cmd_nv...
149
150
  static int do_env_grep(cmd_tbl_t *cmdtp, int flag,
  		       int argc, char * const argv[])
a000b7950   Kim Phillips   common: add a gre...
151
  {
5a31ea04c   Wolfgang Denk   "env grep" - reim...
152
  	char *res = NULL;
be29df6a1   Wolfgang Denk   "env grep" - add ...
153
  	int len, grep_how, grep_what;
a000b7950   Kim Phillips   common: add a gre...
154
155
  
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
156
  		return CMD_RET_USAGE;
a000b7950   Kim Phillips   common: add a gre...
157

be29df6a1   Wolfgang Denk   "env grep" - add ...
158
159
  	grep_how  = H_MATCH_SUBSTR;	/* default: substring search	*/
  	grep_what = H_MATCH_BOTH;	/* default: grep names and values */
d87244d5a   Wolfgang Denk   "env grep" - add ...
160

9a8323311   Pierre Aubert   env: fix the env ...
161
162
  	while (--argc > 0 && **++argv == '-') {
  		char *arg = *argv;
d87244d5a   Wolfgang Denk   "env grep" - add ...
163
164
  		while (*++arg) {
  			switch (*arg) {
be29df6a1   Wolfgang Denk   "env grep" - add ...
165
166
167
168
169
  #ifdef CONFIG_REGEX
  			case 'e':		/* use regex matching */
  				grep_how  = H_MATCH_REGEX;
  				break;
  #endif
d87244d5a   Wolfgang Denk   "env grep" - add ...
170
  			case 'n':		/* grep for name */
be29df6a1   Wolfgang Denk   "env grep" - add ...
171
  				grep_what = H_MATCH_KEY;
d87244d5a   Wolfgang Denk   "env grep" - add ...
172
173
  				break;
  			case 'v':		/* grep for value */
be29df6a1   Wolfgang Denk   "env grep" - add ...
174
  				grep_what = H_MATCH_DATA;
d87244d5a   Wolfgang Denk   "env grep" - add ...
175
176
  				break;
  			case 'b':		/* grep for both */
be29df6a1   Wolfgang Denk   "env grep" - add ...
177
  				grep_what = H_MATCH_BOTH;
d87244d5a   Wolfgang Denk   "env grep" - add ...
178
179
180
181
182
183
184
185
186
187
  				break;
  			case '-':
  				goto DONE;
  			default:
  				return CMD_RET_USAGE;
  			}
  		}
  	}
  
  DONE:
5a31ea04c   Wolfgang Denk   "env grep" - reim...
188
189
  	len = hexport_r(&env_htab, '
  ',
be29df6a1   Wolfgang Denk   "env grep" - add ...
190
  			flag | grep_what | grep_how,
5a31ea04c   Wolfgang Denk   "env grep" - reim...
191
  			&res, 0, argc, argv);
a000b7950   Kim Phillips   common: add a gre...
192

5a31ea04c   Wolfgang Denk   "env grep" - reim...
193
194
195
  	if (len > 0) {
  		puts(res);
  		free(res);
a000b7950   Kim Phillips   common: add a gre...
196
  	}
5a31ea04c   Wolfgang Denk   "env grep" - reim...
197
198
199
200
  	if (len < 2)
  		return 1;
  
  	return 0;
a000b7950   Kim Phillips   common: add a gre...
201
202
  }
  #endif
7ac2fe2da   Ilya Yanok   OMAP: networking ...
203
  #endif /* CONFIG_SPL_BUILD */
a000b7950   Kim Phillips   common: add a gre...
204

ea882baf9   Wolfgang Denk   New implementatio...
205
  /*
c3f652585   Gerlando Falauto   env: unify logic ...
206
207
   * Set a new environment variable,
   * or replace or delete an existing one.
2598090b7   Joe Hershberger   env: Add environm...
208
   */
088f1b199   Kim Phillips   common/cmd_*.c: s...
209
  static int _do_env_set(int flag, int argc, char * const argv[])
c3f652585   Gerlando Falauto   env: unify logic ...
210
211
212
213
  {
  	int   i, len;
  	char  *name, *value, *s;
  	ENTRY e, *ep;
24ab5a191   Joe Hershberger   env: Add setenv f...
214
  	int env_flag = H_INTERACTIVE;
c3f652585   Gerlando Falauto   env: unify logic ...
215

24ab5a191   Joe Hershberger   env: Add setenv f...
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  	debug("Initial value for argc=%d
  ", argc);
  	while (argc > 1 && **(argv + 1) == '-') {
  		char *arg = *++argv;
  
  		--argc;
  		while (*++arg) {
  			switch (*arg) {
  			case 'f':		/* force */
  				env_flag |= H_FORCE;
  				break;
  			default:
  				return CMD_RET_USAGE;
  			}
  		}
  	}
  	debug("Final value for argc=%d
  ", argc);
c3f652585   Gerlando Falauto   env: unify logic ...
234
235
236
237
238
239
240
241
242
243
244
  	name = argv[1];
  	value = argv[2];
  
  	if (strchr(name, '=')) {
  		printf("## Error: illegal character '='"
  		       "in variable name \"%s\"
  ", name);
  		return 1;
  	}
  
  	env_id++;
c3f652585   Gerlando Falauto   env: unify logic ...
245

a68d3ed0a   wdenk   Initial revision
246
  	/* Delete only ? */
d09b1787a   Igor Grinberg   env: clean cmd_nv...
247
  	if (argc < 3 || argv[2] == NULL) {
24ab5a191   Joe Hershberger   env: Add setenv f...
248
  		int rc = hdelete_r(name, &env_htab, env_flag);
ea882baf9   Wolfgang Denk   New implementatio...
249
  		return !rc;
a68d3ed0a   wdenk   Initial revision
250
251
252
  	}
  
  	/*
ea882baf9   Wolfgang Denk   New implementatio...
253
  	 * Insert / replace new value
a68d3ed0a   wdenk   Initial revision
254
  	 */
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
255
  	for (i = 2, len = 0; i < argc; ++i)
a68d3ed0a   wdenk   Initial revision
256
  		len += strlen(argv[i]) + 1;
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
257
258
259
  
  	value = malloc(len);
  	if (value == NULL) {
ea882baf9   Wolfgang Denk   New implementatio...
260
261
  		printf("## Can't malloc %d bytes
  ", len);
a68d3ed0a   wdenk   Initial revision
262
263
  		return 1;
  	}
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
264
  	for (i = 2, s = value; i < argc; ++i) {
ea882baf9   Wolfgang Denk   New implementatio...
265
  		char *v = argv[i];
a68d3ed0a   wdenk   Initial revision
266

ea882baf9   Wolfgang Denk   New implementatio...
267
  		while ((*s++ = *v++) != '\0')
a68d3ed0a   wdenk   Initial revision
268
  			;
d09b1787a   Igor Grinberg   env: clean cmd_nv...
269
  		*(s - 1) = ' ';
ea882baf9   Wolfgang Denk   New implementatio...
270
271
272
  	}
  	if (s != value)
  		*--s = '\0';
d09b1787a   Igor Grinberg   env: clean cmd_nv...
273
274
  	e.key	= name;
  	e.data	= value;
24ab5a191   Joe Hershberger   env: Add setenv f...
275
  	hsearch_r(e, ENTER, &ep, &env_htab, env_flag);
ea882baf9   Wolfgang Denk   New implementatio...
276
277
278
279
280
281
  	free(value);
  	if (!ep) {
  		printf("## Error inserting \"%s\" variable, errno=%d
  ",
  			name, errno);
  		return 1;
a68d3ed0a   wdenk   Initial revision
282
  	}
a68d3ed0a   wdenk   Initial revision
283

a68d3ed0a   wdenk   Initial revision
284
285
  	return 0;
  }
84b5e8022   Wolfgang Denk   Constify getenv()...
286
  int setenv(const char *varname, const char *varvalue)
a68d3ed0a   wdenk   Initial revision
287
  {
84b5e8022   Wolfgang Denk   Constify getenv()...
288
  	const char * const argv[4] = { "setenv", varname, varvalue, NULL };
a7eb1d66c   Joe Hershberger   mtd: Make mtdpart...
289
290
291
  	/* before import into hashtable */
  	if (!(gd->flags & GD_FLG_ENV_READY))
  		return 1;
d09b1787a   Igor Grinberg   env: clean cmd_nv...
292
  	if (varvalue == NULL || varvalue[0] == '\0')
84b5e8022   Wolfgang Denk   Constify getenv()...
293
  		return _do_env_set(0, 2, (char * const *)argv);
9ffd451af   Jeffrey Mann   [patch] setenv(.....
294
  	else
84b5e8022   Wolfgang Denk   Constify getenv()...
295
  		return _do_env_set(0, 3, (char * const *)argv);
a68d3ed0a   wdenk   Initial revision
296
  }
d67f10ce0   Simon Glass   Add setenv_ulong(...
297
298
299
  /**
   * Set an environment variable to an integer value
   *
9602286d3   Simon Glass   env: Fix minor co...
300
   * @param varname	Environment variable to set
d67f10ce0   Simon Glass   Add setenv_ulong(...
301
302
303
304
305
306
307
308
309
310
311
312
   * @param value		Value to set it to
   * @return 0 if ok, 1 on error
   */
  int setenv_ulong(const char *varname, ulong value)
  {
  	/* TODO: this should be unsigned */
  	char *str = simple_itoa(value);
  
  	return setenv(varname, str);
  }
  
  /**
bfc599664   Simon Glass   Update set_workin...
313
   * Set an environment variable to an value in hex
d67f10ce0   Simon Glass   Add setenv_ulong(...
314
   *
9602286d3   Simon Glass   env: Fix minor co...
315
   * @param varname	Environment variable to set
bfc599664   Simon Glass   Update set_workin...
316
   * @param value		Value to set it to
d67f10ce0   Simon Glass   Add setenv_ulong(...
317
318
   * @return 0 if ok, 1 on error
   */
bfc599664   Simon Glass   Update set_workin...
319
  int setenv_hex(const char *varname, ulong value)
d67f10ce0   Simon Glass   Add setenv_ulong(...
320
321
  {
  	char str[17];
bfc599664   Simon Glass   Update set_workin...
322
  	sprintf(str, "%lx", value);
d67f10ce0   Simon Glass   Add setenv_ulong(...
323
324
  	return setenv(varname, str);
  }
76b8f79c2   Simon Glass   Add getenv_hex() ...
325
326
327
328
329
330
331
332
333
334
335
336
337
338
  ulong getenv_hex(const char *varname, ulong default_val)
  {
  	const char *s;
  	ulong value;
  	char *endp;
  
  	s = getenv(varname);
  	if (s)
  		value = simple_strtoul(s, &endp, 16);
  	if (!s || endp == s)
  		return default_val;
  
  	return value;
  }
7ac2fe2da   Ilya Yanok   OMAP: networking ...
339
  #ifndef CONFIG_SPL_BUILD
088f1b199   Kim Phillips   common/cmd_*.c: s...
340
  static int do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
a68d3ed0a   wdenk   Initial revision
341
  {
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
342
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
343
  		return CMD_RET_USAGE;
a68d3ed0a   wdenk   Initial revision
344

ea882baf9   Wolfgang Denk   New implementatio...
345
  	return _do_env_set(flag, argc, argv);
a68d3ed0a   wdenk   Initial revision
346
  }
ea882baf9   Wolfgang Denk   New implementatio...
347
  /*
a68d3ed0a   wdenk   Initial revision
348
349
   * Prompt for environment variable
   */
c76fe4742   Jon Loeliger   common/cmd_[i-n]*...
350
  #if defined(CONFIG_CMD_ASKENV)
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
351
  int do_env_ask(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
a68d3ed0a   wdenk   Initial revision
352
  {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
353
  	char message[CONFIG_SYS_CBSIZE];
7d85591dd   Wolfgang Denk   env: fix "env ask...
354
  	int i, len, pos, size;
a68d3ed0a   wdenk   Initial revision
355
  	char *local_args[4];
7d85591dd   Wolfgang Denk   env: fix "env ask...
356
  	char *endptr;
a68d3ed0a   wdenk   Initial revision
357
358
359
360
361
  
  	local_args[0] = argv[0];
  	local_args[1] = argv[1];
  	local_args[2] = NULL;
  	local_args[3] = NULL;
7d85591dd   Wolfgang Denk   env: fix "env ask...
362
363
364
365
366
367
  	/*
  	 * Check the syntax:
  	 *
  	 * env_ask envname [message1 ...] [size]
  	 */
  	if (argc == 1)
4c12eeb8b   Simon Glass   Convert cmd_usage...
368
  		return CMD_RET_USAGE;
a68d3ed0a   wdenk   Initial revision
369

7d85591dd   Wolfgang Denk   env: fix "env ask...
370
371
372
373
374
375
376
377
378
379
380
381
382
  	/*
  	 * We test the last argument if it can be converted
  	 * into a decimal number.  If yes, we assume it's
  	 * the size.  Otherwise we echo it as part of the
  	 * message.
  	 */
  	i = simple_strtoul(argv[argc - 1], &endptr, 10);
  	if (*endptr != '\0') {			/* no size */
  		size = CONFIG_SYS_CBSIZE - 1;
  	} else {				/* size given */
  		size = i;
  		--argc;
  	}
a68d3ed0a   wdenk   Initial revision
383

7d85591dd   Wolfgang Denk   env: fix "env ask...
384
385
386
387
388
  	if (argc <= 2) {
  		sprintf(message, "Please enter '%s': ", argv[1]);
  	} else {
  		/* env_ask envname message1 ... messagen [size] */
  		for (i = 2, pos = 0; i < argc; i++) {
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
389
  			if (pos)
a68d3ed0a   wdenk   Initial revision
390
  				message[pos++] = ' ';
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
391

d09b1787a   Igor Grinberg   env: clean cmd_nv...
392
  			strcpy(message + pos, argv[i]);
a68d3ed0a   wdenk   Initial revision
393
394
  			pos += strlen(argv[i]);
  		}
7d85591dd   Wolfgang Denk   env: fix "env ask...
395
  		message[pos++] = ' ';
a68d3ed0a   wdenk   Initial revision
396
  		message[pos] = '\0';
a68d3ed0a   wdenk   Initial revision
397
  	}
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
398
399
  	if (size >= CONFIG_SYS_CBSIZE)
  		size = CONFIG_SYS_CBSIZE - 1;
a68d3ed0a   wdenk   Initial revision
400
401
402
403
404
  
  	if (size <= 0)
  		return 1;
  
  	/* prompt for input */
ea882baf9   Wolfgang Denk   New implementatio...
405
  	len = readline(message);
a68d3ed0a   wdenk   Initial revision
406
407
408
409
410
411
412
413
414
415
416
  
  	if (size < len)
  		console_buffer[size] = '\0';
  
  	len = 2;
  	if (console_buffer[0] != '\0') {
  		local_args[2] = console_buffer;
  		len = 3;
  	}
  
  	/* Continue calling setenv code */
ea882baf9   Wolfgang Denk   New implementatio...
417
  	return _do_env_set(flag, len, local_args);
a68d3ed0a   wdenk   Initial revision
418
  }
902531788   Jon Loeliger   common/: Remove l...
419
  #endif
a68d3ed0a   wdenk   Initial revision
420

5e2b3e0c5   Joe Hershberger   env: Add a comman...
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
  #if defined(CONFIG_CMD_ENV_CALLBACK)
  static int print_static_binding(const char *var_name, const char *callback_name)
  {
  	printf("\t%-20s %-20s
  ", var_name, callback_name);
  
  	return 0;
  }
  
  static int print_active_callback(ENTRY *entry)
  {
  	struct env_clbk_tbl *clbkp;
  	int i;
  	int num_callbacks;
  
  	if (entry->callback == NULL)
  		return 0;
  
  	/* look up the callback in the linker-list */
  	num_callbacks = ll_entry_count(struct env_clbk_tbl, env_clbk);
  	for (i = 0, clbkp = ll_entry_start(struct env_clbk_tbl, env_clbk);
  	     i < num_callbacks;
  	     i++, clbkp++) {
  #if defined(CONFIG_NEEDS_MANUAL_RELOC)
  		if (entry->callback == clbkp->callback + gd->reloc_off)
  #else
  		if (entry->callback == clbkp->callback)
  #endif
  			break;
  	}
  
  	if (i == num_callbacks)
  		/* this should probably never happen, but just in case... */
  		printf("\t%-20s %p
  ", entry->key, entry->callback);
  	else
  		printf("\t%-20s %-20s
  ", entry->key, clbkp->name);
  
  	return 0;
  }
  
  /*
   * Print the callbacks available and what they are bound to
   */
  int do_env_callback(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
  	struct env_clbk_tbl *clbkp;
  	int i;
  	int num_callbacks;
  
  	/* Print the available callbacks */
  	puts("Available callbacks:
  ");
  	puts("\tCallback Name
  ");
  	puts("\t-------------
  ");
  	num_callbacks = ll_entry_count(struct env_clbk_tbl, env_clbk);
  	for (i = 0, clbkp = ll_entry_start(struct env_clbk_tbl, env_clbk);
  	     i < num_callbacks;
  	     i++, clbkp++)
  		printf("\t%s
  ", clbkp->name);
  	puts("
  ");
  
  	/* Print the static bindings that may exist */
  	puts("Static callback bindings:
  ");
  	printf("\t%-20s %-20s
  ", "Variable Name", "Callback Name");
  	printf("\t%-20s %-20s
  ", "-------------", "-------------");
  	env_attr_walk(ENV_CALLBACK_LIST_STATIC, print_static_binding);
  	puts("
  ");
  
  	/* walk through each variable and print the callback if it has one */
  	puts("Active callback bindings:
  ");
  	printf("\t%-20s %-20s
  ", "Variable Name", "Callback Name");
  	printf("\t%-20s %-20s
  ", "-------------", "-------------");
  	hwalk_r(&env_htab, print_active_callback);
  	return 0;
  }
  #endif
fffad71bc   Joe Hershberger   env: Add a comman...
510
511
512
513
  #if defined(CONFIG_CMD_ENV_FLAGS)
  static int print_static_flags(const char *var_name, const char *flags)
  {
  	enum env_flags_vartype type = env_flags_parse_vartype(flags);
267541f77   Joe Hershberger   env: Add support ...
514
  	enum env_flags_varaccess access = env_flags_parse_varaccess(flags);
fffad71bc   Joe Hershberger   env: Add a comman...
515

267541f77   Joe Hershberger   env: Add support ...
516
517
518
519
  	printf("\t%-20s %-20s %-20s
  ", var_name,
  		env_flags_get_vartype_name(type),
  		env_flags_get_varaccess_name(access));
fffad71bc   Joe Hershberger   env: Add a comman...
520
521
522
523
524
525
526
  
  	return 0;
  }
  
  static int print_active_flags(ENTRY *entry)
  {
  	enum env_flags_vartype type;
267541f77   Joe Hershberger   env: Add support ...
527
  	enum env_flags_varaccess access;
fffad71bc   Joe Hershberger   env: Add a comman...
528
529
530
531
532
533
  
  	if (entry->flags == 0)
  		return 0;
  
  	type = (enum env_flags_vartype)
  		(entry->flags & ENV_FLAGS_VARTYPE_BIN_MASK);
267541f77   Joe Hershberger   env: Add support ...
534
535
536
537
538
  	access = env_flags_parse_varaccess_from_binflags(entry->flags);
  	printf("\t%-20s %-20s %-20s
  ", entry->key,
  		env_flags_get_vartype_name(type),
  		env_flags_get_varaccess_name(access));
fffad71bc   Joe Hershberger   env: Add a comman...
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
  
  	return 0;
  }
  
  /*
   * Print the flags available and what variables have flags
   */
  int do_env_flags(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
  	/* Print the available variable types */
  	printf("Available variable type flags (position %d):
  ",
  		ENV_FLAGS_VARTYPE_LOC);
  	puts("\tFlag\tVariable Type Name
  ");
  	puts("\t----\t------------------
  ");
  	env_flags_print_vartypes();
  	puts("
  ");
267541f77   Joe Hershberger   env: Add support ...
559
560
561
562
563
564
565
566
567
568
569
  	/* Print the available variable access types */
  	printf("Available variable access flags (position %d):
  ",
  		ENV_FLAGS_VARACCESS_LOC);
  	puts("\tFlag\tVariable Access Name
  ");
  	puts("\t----\t--------------------
  ");
  	env_flags_print_varaccess();
  	puts("
  ");
fffad71bc   Joe Hershberger   env: Add a comman...
570
571
572
  	/* Print the static flags that may exist */
  	puts("Static flags:
  ");
267541f77   Joe Hershberger   env: Add support ...
573
574
575
576
577
578
  	printf("\t%-20s %-20s %-20s
  ", "Variable Name", "Variable Type",
  		"Variable Access");
  	printf("\t%-20s %-20s %-20s
  ", "-------------", "-------------",
  		"---------------");
fffad71bc   Joe Hershberger   env: Add a comman...
579
580
581
582
583
584
585
  	env_attr_walk(ENV_FLAGS_LIST_STATIC, print_static_flags);
  	puts("
  ");
  
  	/* walk through each variable and print the flags if non-default */
  	puts("Active flags:
  ");
267541f77   Joe Hershberger   env: Add support ...
586
587
588
589
590
591
  	printf("\t%-20s %-20s %-20s
  ", "Variable Name", "Variable Type",
  		"Variable Access");
  	printf("\t%-20s %-20s %-20s
  ", "-------------", "-------------",
  		"---------------");
fffad71bc   Joe Hershberger   env: Add a comman...
592
593
594
595
  	hwalk_r(&env_htab, print_active_flags);
  	return 0;
  }
  #endif
ea882baf9   Wolfgang Denk   New implementatio...
596
  /*
246c69225   Peter Tyser   Add 'editenv' com...
597
598
599
   * Interactively edit an environment variable
   */
  #if defined(CONFIG_CMD_EDITENV)
088f1b199   Kim Phillips   common/cmd_*.c: s...
600
601
  static int do_env_edit(cmd_tbl_t *cmdtp, int flag, int argc,
  		       char * const argv[])
246c69225   Peter Tyser   Add 'editenv' com...
602
603
604
  {
  	char buffer[CONFIG_SYS_CBSIZE];
  	char *init_val;
246c69225   Peter Tyser   Add 'editenv' com...
605

47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
606
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
607
  		return CMD_RET_USAGE;
246c69225   Peter Tyser   Add 'editenv' com...
608
609
610
611
  
  	/* Set read buffer to initial value or empty sting */
  	init_val = getenv(argv[1]);
  	if (init_val)
7fcd9bbd6   Marek Vasut   GCC4.6: Squash wa...
612
  		sprintf(buffer, "%s", init_val);
246c69225   Peter Tyser   Add 'editenv' com...
613
614
  	else
  		buffer[0] = '\0';
18a3cce9f   Joe Hershberger   env: Avoid clobbe...
615
616
  	if (readline_into_buffer("edit: ", buffer, 0) < 0)
  		return 1;
246c69225   Peter Tyser   Add 'editenv' com...
617
618
619
620
  
  	return setenv(argv[1], buffer);
  }
  #endif /* CONFIG_CMD_EDITENV */
7ac2fe2da   Ilya Yanok   OMAP: networking ...
621
  #endif /* CONFIG_SPL_BUILD */
246c69225   Peter Tyser   Add 'editenv' com...
622

ea882baf9   Wolfgang Denk   New implementatio...
623
  /*
a68d3ed0a   wdenk   Initial revision
624
625
626
627
   * Look up variable from environment,
   * return address of storage for that variable,
   * or NULL if not found
   */
84b5e8022   Wolfgang Denk   Constify getenv()...
628
  char *getenv(const char *name)
a68d3ed0a   wdenk   Initial revision
629
  {
d09b1787a   Igor Grinberg   env: clean cmd_nv...
630
  	if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */
ea882baf9   Wolfgang Denk   New implementatio...
631
  		ENTRY e, *ep;
a68d3ed0a   wdenk   Initial revision
632

91a76751a   Wolfgang Denk   Make getenv() wor...
633
  		WATCHDOG_RESET();
2a3cb0207   wdenk   Quick & Dirty fix...
634

d09b1787a   Igor Grinberg   env: clean cmd_nv...
635
636
  		e.key	= name;
  		e.data	= NULL;
c4e0057fa   Joe Hershberger   env: Refactor do_...
637
  		hsearch_r(e, FIND, &ep, &env_htab, 0);
91a76751a   Wolfgang Denk   Make getenv() wor...
638

f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
639
  		return ep ? ep->data : NULL;
a68d3ed0a   wdenk   Initial revision
640
  	}
ea882baf9   Wolfgang Denk   New implementatio...
641
  	/* restricted capabilities before import */
ea882baf9   Wolfgang Denk   New implementatio...
642
643
  	if (getenv_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
  		return (char *)(gd->env_buf);
91a76751a   Wolfgang Denk   Make getenv() wor...
644

ea882baf9   Wolfgang Denk   New implementatio...
645
  	return NULL;
a68d3ed0a   wdenk   Initial revision
646
  }
ea882baf9   Wolfgang Denk   New implementatio...
647
648
649
  /*
   * Look up variable from environment for restricted C runtime env.
   */
84b5e8022   Wolfgang Denk   Constify getenv()...
650
  int getenv_f(const char *name, char *buf, unsigned len)
a68d3ed0a   wdenk   Initial revision
651
652
  {
  	int i, nxt;
d09b1787a   Igor Grinberg   env: clean cmd_nv...
653
  	for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
a68d3ed0a   wdenk   Initial revision
654
  		int val, n;
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
655
656
657
  		for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) {
  			if (nxt >= CONFIG_ENV_SIZE)
  				return -1;
a68d3ed0a   wdenk   Initial revision
658
  		}
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
659
660
661
  
  		val = envmatch((uchar *)name, i);
  		if (val < 0)
a68d3ed0a   wdenk   Initial revision
662
  			continue;
9ed4a9582   Wolfgang Denk   getenv_f(): fix h...
663

a68d3ed0a   wdenk   Initial revision
664
  		/* found; copy out */
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
665
  		for (n = 0; n < len; ++n, ++buf) {
d09b1787a   Igor Grinberg   env: clean cmd_nv...
666
667
  			*buf = env_get_char(val++);
  			if (*buf == '\0')
9ed4a9582   Wolfgang Denk   getenv_f(): fix h...
668
669
670
671
672
  				return n;
  		}
  
  		if (n)
  			*--buf = '\0';
a02a884b9   Wolfgang Denk   cmd_nvedit.c: mak...
673
674
675
  		printf("env_buf [%d bytes] too small for value of \"%s\"
  ",
  			len, name);
9ed4a9582   Wolfgang Denk   getenv_f(): fix h...
676
677
  
  		return n;
a68d3ed0a   wdenk   Initial revision
678
  	}
d09b1787a   Igor Grinberg   env: clean cmd_nv...
679

f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
680
  	return -1;
a68d3ed0a   wdenk   Initial revision
681
  }
4a9b41310   Simon Glass   Add getenv_ulong(...
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
  /**
   * Decode the integer value of an environment variable and return it.
   *
   * @param name		Name of environemnt variable
   * @param base		Number base to use (normally 10, or 16 for hex)
   * @param default_val	Default value to return if the variable is not
   *			found
   * @return the decoded value, or default_val if not found
   */
  ulong getenv_ulong(const char *name, int base, ulong default_val)
  {
  	/*
  	 * We can use getenv() here, even before relocation, since the
  	 * environment variable value is an integer and thus short.
  	 */
  	const char *str = getenv(name);
  
  	return str ? simple_strtoul(str, NULL, base) : default_val;
  }
7ac2fe2da   Ilya Yanok   OMAP: networking ...
701
  #ifndef CONFIG_SPL_BUILD
bdab39d35   Mike Frysinger   rename CONFIG_CMD...
702
  #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
088f1b199   Kim Phillips   common/cmd_*.c: s...
703
704
  static int do_env_save(cmd_tbl_t *cmdtp, int flag, int argc,
  		       char * const argv[])
a68d3ed0a   wdenk   Initial revision
705
  {
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
706
707
  	printf("Saving Environment to %s...
  ", env_name_spec);
a68d3ed0a   wdenk   Initial revision
708

f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
709
  	return saveenv() ? 1 : 0;
a68d3ed0a   wdenk   Initial revision
710
  }
8bde7f776   wdenk   * Code cleanup:
711

ba69dc26a   Mike Frysinger   saveenv: standard...
712
  U_BOOT_CMD(
ea882baf9   Wolfgang Denk   New implementatio...
713
  	saveenv, 1, 0,	do_env_save,
2fb2604d5   Peter Tyser   Command usage cle...
714
  	"save environment variables to persistent storage",
a89c33db9   Wolfgang Denk   General help mess...
715
  	""
ba69dc26a   Mike Frysinger   saveenv: standard...
716
  );
a68d3ed0a   wdenk   Initial revision
717
  #endif
7ac2fe2da   Ilya Yanok   OMAP: networking ...
718
  #endif /* CONFIG_SPL_BUILD */
a68d3ed0a   wdenk   Initial revision
719

ea882baf9   Wolfgang Denk   New implementatio...
720
  /*
a68d3ed0a   wdenk   Initial revision
721
722
723
724
   * Match a name / name=value pair
   *
   * s1 is either a simple 'name', or a 'name=value' pair.
   * i2 is the environment index for a 'name2=value2' pair.
d09b1787a   Igor Grinberg   env: clean cmd_nv...
725
   * If the names match, return the index for the value2, else -1.
a68d3ed0a   wdenk   Initial revision
726
   */
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
727
  int envmatch(uchar *s1, int i2)
a68d3ed0a   wdenk   Initial revision
728
  {
586197dfe   Joe Hershberger   env: Check for NU...
729
730
  	if (s1 == NULL)
  		return -1;
a68d3ed0a   wdenk   Initial revision
731
732
  	while (*s1 == env_get_char(i2++))
  		if (*s1++ == '=')
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
733
  			return i2;
d09b1787a   Igor Grinberg   env: clean cmd_nv...
734

a68d3ed0a   wdenk   Initial revision
735
  	if (*s1 == '\0' && env_get_char(i2-1) == '=')
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
736
  		return i2;
d09b1787a   Igor Grinberg   env: clean cmd_nv...
737

f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
738
  	return -1;
a68d3ed0a   wdenk   Initial revision
739
  }
8bde7f776   wdenk   * Code cleanup:
740

7ac2fe2da   Ilya Yanok   OMAP: networking ...
741
  #ifndef CONFIG_SPL_BUILD
b64b7c3df   Gerlando Falauto   env: make "env de...
742
  static int do_env_default(cmd_tbl_t *cmdtp, int __flag,
d09b1787a   Igor Grinberg   env: clean cmd_nv...
743
  			  int argc, char * const argv[])
ea882baf9   Wolfgang Denk   New implementatio...
744
  {
b64b7c3df   Gerlando Falauto   env: make "env de...
745
  	int all = 0, flag = 0;
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
746

b64b7c3df   Gerlando Falauto   env: make "env de...
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
  	debug("Initial value for argc=%d
  ", argc);
  	while (--argc > 0 && **++argv == '-') {
  		char *arg = *argv;
  
  		while (*++arg) {
  			switch (*arg) {
  			case 'a':		/* default all */
  				all = 1;
  				break;
  			case 'f':		/* force */
  				flag |= H_FORCE;
  				break;
  			default:
  				return cmd_usage(cmdtp);
  			}
  		}
  	}
  	debug("Final value for argc=%d
  ", argc);
  	if (all && (argc == 0)) {
  		/* Reset the whole environment */
  		set_default_env("## Resetting to default environment
  ");
  		return 0;
  	}
  	if (!all && (argc > 0)) {
  		/* Reset individual variables */
  		set_default_vars(argc, argv);
  		return 0;
  	}
  
  	return cmd_usage(cmdtp);
ea882baf9   Wolfgang Denk   New implementatio...
780
  }
d09b1787a   Igor Grinberg   env: clean cmd_nv...
781
782
  static int do_env_delete(cmd_tbl_t *cmdtp, int flag,
  			 int argc, char * const argv[])
ea882baf9   Wolfgang Denk   New implementatio...
783
  {
9d8d661d7   Joe Hershberger   env: Implement th...
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
  	int env_flag = H_INTERACTIVE;
  	int ret = 0;
  
  	debug("Initial value for argc=%d
  ", argc);
  	while (argc > 1 && **(argv + 1) == '-') {
  		char *arg = *++argv;
  
  		--argc;
  		while (*++arg) {
  			switch (*arg) {
  			case 'f':		/* force */
  				env_flag |= H_FORCE;
  				break;
  			default:
  				return CMD_RET_USAGE;
  			}
  		}
  	}
  	debug("Final value for argc=%d
  ", argc);
  
  	env_id++;
  
  	while (--argc > 0) {
  		char *name = *++argv;
  
  		if (!hdelete_r(name, &env_htab, env_flag))
  			ret = 1;
  	}
  
  	return ret;
ea882baf9   Wolfgang Denk   New implementatio...
816
  }
0c79cda01   Mike Frysinger   env: make import/...
817
  #ifdef CONFIG_CMD_EXPORTENV
ea882baf9   Wolfgang Denk   New implementatio...
818
  /*
37f2fe747   Wolfgang Denk   env: allow to exp...
819
   * env export [-t | -b | -c] [-s size] addr [var ...]
ea882baf9   Wolfgang Denk   New implementatio...
820
821
822
823
824
825
826
827
828
   *	-t:	export as text format; if size is given, data will be
   *		padded with '\0' bytes; if not, one terminating '\0'
   *		will be added (which is included in the "filesize"
   *		setting so you can for exmple copy this to flash and
   *		keep the termination).
   *	-b:	export as binary format (name=value pairs separated by
   *		'\0', list end marked by double "\0\0")
   *	-c:	export as checksum protected environment format as
   *		used for example by "saveenv" command
37f2fe747   Wolfgang Denk   env: allow to exp...
829
830
   *	-s size:
   *		size of output buffer
ea882baf9   Wolfgang Denk   New implementatio...
831
   *	addr:	memory address where environment gets stored
37f2fe747   Wolfgang Denk   env: allow to exp...
832
833
834
   *	var...	List of variable names that get included into the
   *		export. Without arguments, the whole environment gets
   *		exported.
ea882baf9   Wolfgang Denk   New implementatio...
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
   *
   * With "-c" and size is NOT given, then the export command will
   * format the data as currently used for the persistent storage,
   * i. e. it will use CONFIG_ENV_SECT_SIZE as output block size and
   * prepend a valid CRC32 checksum and, in case of resundant
   * environment, a "current" redundancy flag. If size is given, this
   * value will be used instead of CONFIG_ENV_SECT_SIZE; again, CRC32
   * checksum and redundancy flag will be inserted.
   *
   * With "-b" and "-t", always only the real data (including a
   * terminating '\0' byte) will be written; here the optional size
   * argument will be used to make sure not to overflow the user
   * provided buffer; the command will abort if the size is not
   * sufficient. Any remainign space will be '\0' padded.
   *
   * On successful return, the variable "filesize" will be set.
   * Note that filesize includes the trailing/terminating '\0' byte(s).
   *
   * Usage szenario:  create a text snapshot/backup of the current settings:
   *
   *	=> env export -t 100000
   *	=> era ${backup_addr} +${filesize}
   *	=> cp.b 100000 ${backup_addr} ${filesize}
   *
   * Re-import this snapshot, deleting all other settings:
   *
   *	=> env import -d -t ${backup_addr}
   */
d09b1787a   Igor Grinberg   env: clean cmd_nv...
863
864
  static int do_env_export(cmd_tbl_t *cmdtp, int flag,
  			 int argc, char * const argv[])
ea882baf9   Wolfgang Denk   New implementatio...
865
866
867
  {
  	char	buf[32];
  	char	*addr, *cmd, *res;
37f2fe747   Wolfgang Denk   env: allow to exp...
868
  	size_t	size = 0;
ea882baf9   Wolfgang Denk   New implementatio...
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
  	ssize_t	len;
  	env_t	*envp;
  	char	sep = '
  ';
  	int	chk = 0;
  	int	fmt = 0;
  
  	cmd = *argv;
  
  	while (--argc > 0 && **++argv == '-') {
  		char *arg = *argv;
  		while (*++arg) {
  			switch (*arg) {
  			case 'b':		/* raw binary format */
  				if (fmt++)
  					goto sep_err;
  				sep = '\0';
  				break;
  			case 'c':		/* external checksum format */
  				if (fmt++)
  					goto sep_err;
  				sep = '\0';
  				chk = 1;
  				break;
37f2fe747   Wolfgang Denk   env: allow to exp...
893
894
895
896
897
  			case 's':		/* size given */
  				if (--argc <= 0)
  					return cmd_usage(cmdtp);
  				size = simple_strtoul(*++argv, NULL, 16);
  				goto NXTARG;
ea882baf9   Wolfgang Denk   New implementatio...
898
899
900
901
902
903
904
  			case 't':		/* text format */
  				if (fmt++)
  					goto sep_err;
  				sep = '
  ';
  				break;
  			default:
4c12eeb8b   Simon Glass   Convert cmd_usage...
905
  				return CMD_RET_USAGE;
ea882baf9   Wolfgang Denk   New implementatio...
906
907
  			}
  		}
37f2fe747   Wolfgang Denk   env: allow to exp...
908
  NXTARG:		;
ea882baf9   Wolfgang Denk   New implementatio...
909
  	}
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
910
  	if (argc < 1)
4c12eeb8b   Simon Glass   Convert cmd_usage...
911
  		return CMD_RET_USAGE;
8bde7f776   wdenk   * Code cleanup:
912

ea882baf9   Wolfgang Denk   New implementatio...
913
  	addr = (char *)simple_strtoul(argv[0], NULL, 16);
37f2fe747   Wolfgang Denk   env: allow to exp...
914
  	if (size)
ea882baf9   Wolfgang Denk   New implementatio...
915
  		memset(addr, '\0', size);
37f2fe747   Wolfgang Denk   env: allow to exp...
916
917
918
  
  	argc--;
  	argv++;
ea882baf9   Wolfgang Denk   New implementatio...
919
920
  
  	if (sep) {		/* export as text file */
ea009d474   Wolfgang Denk   hashtable: prepar...
921
922
923
  		len = hexport_r(&env_htab, sep,
  				H_MATCH_KEY | H_MATCH_IDENT,
  				&addr, size, argc, argv);
ea882baf9   Wolfgang Denk   New implementatio...
924
  		if (len < 0) {
d09b1787a   Igor Grinberg   env: clean cmd_nv...
925
926
  			error("Cannot export environment: errno = %d
  ", errno);
ea882baf9   Wolfgang Denk   New implementatio...
927
928
  			return 1;
  		}
8c3aff525   Andreas Bießmann   cmd_nvedit: use e...
929
  		sprintf(buf, "%zX", (size_t)len);
ea882baf9   Wolfgang Denk   New implementatio...
930
931
932
933
934
935
936
937
938
939
940
  		setenv("filesize", buf);
  
  		return 0;
  	}
  
  	envp = (env_t *)addr;
  
  	if (chk)		/* export as checksum protected block */
  		res = (char *)envp->data;
  	else			/* export as raw binary data */
  		res = addr;
ea009d474   Wolfgang Denk   hashtable: prepar...
941
942
943
  	len = hexport_r(&env_htab, '\0',
  			H_MATCH_KEY | H_MATCH_IDENT,
  			&res, ENV_SIZE, argc, argv);
ea882baf9   Wolfgang Denk   New implementatio...
944
  	if (len < 0) {
d09b1787a   Igor Grinberg   env: clean cmd_nv...
945
946
  		error("Cannot export environment: errno = %d
  ", errno);
ea882baf9   Wolfgang Denk   New implementatio...
947
948
949
950
  		return 1;
  	}
  
  	if (chk) {
d09b1787a   Igor Grinberg   env: clean cmd_nv...
951
  		envp->crc = crc32(0, envp->data, ENV_SIZE);
ea882baf9   Wolfgang Denk   New implementatio...
952
953
954
955
  #ifdef CONFIG_ENV_ADDR_REDUND
  		envp->flags = ACTIVE_FLAG;
  #endif
  	}
41ef372c1   Simon Glass   common: Use new n...
956
  	setenv_hex("filesize", len + offsetof(env_t, data));
ea882baf9   Wolfgang Denk   New implementatio...
957
958
959
960
  
  	return 0;
  
  sep_err:
d09b1787a   Igor Grinberg   env: clean cmd_nv...
961
962
  	printf("## %s: only one of \"-b\", \"-c\" or \"-t\" allowed
  ",	cmd);
ea882baf9   Wolfgang Denk   New implementatio...
963
964
  	return 1;
  }
0c79cda01   Mike Frysinger   env: make import/...
965
  #endif
ea882baf9   Wolfgang Denk   New implementatio...
966

0c79cda01   Mike Frysinger   env: make import/...
967
  #ifdef CONFIG_CMD_IMPORTENV
ea882baf9   Wolfgang Denk   New implementatio...
968
969
970
971
972
973
974
975
976
977
978
979
  /*
   * env import [-d] [-t | -b | -c] addr [size]
   *	-d:	delete existing environment before importing;
   *		otherwise overwrite / append to existion definitions
   *	-t:	assume text format; either "size" must be given or the
   *		text data must be '\0' terminated
   *	-b:	assume binary format ('\0' separated, "\0\0" terminated)
   *	-c:	assume checksum protected environment format
   *	addr:	memory address to read from
   *	size:	length of input data; if missing, proper '\0'
   *		termination is mandatory
   */
d09b1787a   Igor Grinberg   env: clean cmd_nv...
980
981
  static int do_env_import(cmd_tbl_t *cmdtp, int flag,
  			 int argc, char * const argv[])
ea882baf9   Wolfgang Denk   New implementatio...
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
  {
  	char	*cmd, *addr;
  	char	sep = '
  ';
  	int	chk = 0;
  	int	fmt = 0;
  	int	del = 0;
  	size_t	size;
  
  	cmd = *argv;
  
  	while (--argc > 0 && **++argv == '-') {
  		char *arg = *argv;
  		while (*++arg) {
  			switch (*arg) {
  			case 'b':		/* raw binary format */
  				if (fmt++)
  					goto sep_err;
  				sep = '\0';
  				break;
  			case 'c':		/* external checksum format */
  				if (fmt++)
  					goto sep_err;
  				sep = '\0';
  				chk = 1;
  				break;
  			case 't':		/* text format */
  				if (fmt++)
  					goto sep_err;
  				sep = '
  ';
  				break;
  			case 'd':
  				del = 1;
  				break;
  			default:
4c12eeb8b   Simon Glass   Convert cmd_usage...
1018
  				return CMD_RET_USAGE;
ea882baf9   Wolfgang Denk   New implementatio...
1019
1020
1021
  			}
  		}
  	}
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
1022
  	if (argc < 1)
4c12eeb8b   Simon Glass   Convert cmd_usage...
1023
  		return CMD_RET_USAGE;
ea882baf9   Wolfgang Denk   New implementatio...
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
  
  	if (!fmt)
  		printf("## Warning: defaulting to text format
  ");
  
  	addr = (char *)simple_strtoul(argv[0], NULL, 16);
  
  	if (argc == 2) {
  		size = simple_strtoul(argv[1], NULL, 16);
  	} else {
  		char *s = addr;
  
  		size = 0;
  
  		while (size < MAX_ENV_SIZE) {
  			if ((*s == sep) && (*(s+1) == '\0'))
  				break;
  			++s;
  			++size;
  		}
  		if (size == MAX_ENV_SIZE) {
  			printf("## Warning: Input data exceeds %d bytes"
  				" - truncated
  ", MAX_ENV_SIZE);
  		}
d3f80c77c   Horst Kronstorfer   common/cmd_nvedit...
1049
  		size += 2;
79afc88d2   Simon Glass   Fix warnings in c...
1050
1051
  		printf("## Info: input data size = %zu = 0x%zX
  ", size, size);
ea882baf9   Wolfgang Denk   New implementatio...
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
  	}
  
  	if (chk) {
  		uint32_t crc;
  		env_t *ep = (env_t *)addr;
  
  		size -= offsetof(env_t, data);
  		memcpy(&crc, &ep->crc, sizeof(crc));
  
  		if (crc32(0, ep->data, size) != crc) {
  			puts("## Error: bad CRC, import failed
  ");
  			return 1;
  		}
  		addr = (char *)ep->data;
  	}
348b1f1c6   Gerlando Falauto   env: make himport...
1068
  	if (himport_r(&env_htab, addr, size, sep, del ? 0 : H_NOCLEAR,
c4e0057fa   Joe Hershberger   env: Refactor do_...
1069
  			0, NULL) == 0) {
ea882baf9   Wolfgang Denk   New implementatio...
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
  		error("Environment import failed: errno = %d
  ", errno);
  		return 1;
  	}
  	gd->flags |= GD_FLG_ENV_READY;
  
  	return 0;
  
  sep_err:
  	printf("## %s: only one of \"-b\", \"-c\" or \"-t\" allowed
  ",
  		cmd);
  	return 1;
  }
0c79cda01   Mike Frysinger   env: make import/...
1084
  #endif
ea882baf9   Wolfgang Denk   New implementatio...
1085

88733e2c6   Andrew Ruder   cmd_nvedit.c: Add...
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
  #if defined(CONFIG_CMD_ENV_EXISTS)
  static int do_env_exists(cmd_tbl_t *cmdtp, int flag, int argc,
  		       char * const argv[])
  {
  	ENTRY e, *ep;
  
  	if (argc < 2)
  		return CMD_RET_USAGE;
  
  	e.key = argv[1];
  	e.data = NULL;
  	hsearch_r(e, FIND, &ep, &env_htab, 0);
  
  	return (ep == NULL) ? 1 : 0;
  }
  #endif
ea882baf9   Wolfgang Denk   New implementatio...
1102
1103
1104
1105
1106
1107
1108
1109
  /*
   * New command line interface: "env" command with subcommands
   */
  static cmd_tbl_t cmd_env_sub[] = {
  #if defined(CONFIG_CMD_ASKENV)
  	U_BOOT_CMD_MKENT(ask, CONFIG_SYS_MAXARGS, 1, do_env_ask, "", ""),
  #endif
  	U_BOOT_CMD_MKENT(default, 1, 0, do_env_default, "", ""),
9d8d661d7   Joe Hershberger   env: Implement th...
1110
  	U_BOOT_CMD_MKENT(delete, CONFIG_SYS_MAXARGS, 0, do_env_delete, "", ""),
ea882baf9   Wolfgang Denk   New implementatio...
1111
1112
1113
  #if defined(CONFIG_CMD_EDITENV)
  	U_BOOT_CMD_MKENT(edit, 2, 0, do_env_edit, "", ""),
  #endif
5e2b3e0c5   Joe Hershberger   env: Add a comman...
1114
1115
1116
  #if defined(CONFIG_CMD_ENV_CALLBACK)
  	U_BOOT_CMD_MKENT(callbacks, 1, 0, do_env_callback, "", ""),
  #endif
fffad71bc   Joe Hershberger   env: Add a comman...
1117
1118
1119
  #if defined(CONFIG_CMD_ENV_FLAGS)
  	U_BOOT_CMD_MKENT(flags, 1, 0, do_env_flags, "", ""),
  #endif
0c79cda01   Mike Frysinger   env: make import/...
1120
  #if defined(CONFIG_CMD_EXPORTENV)
ea882baf9   Wolfgang Denk   New implementatio...
1121
  	U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""),
0c79cda01   Mike Frysinger   env: make import/...
1122
  #endif
a000b7950   Kim Phillips   common: add a gre...
1123
1124
1125
  #if defined(CONFIG_CMD_GREPENV)
  	U_BOOT_CMD_MKENT(grep, CONFIG_SYS_MAXARGS, 1, do_env_grep, "", ""),
  #endif
0c79cda01   Mike Frysinger   env: make import/...
1126
  #if defined(CONFIG_CMD_IMPORTENV)
ea882baf9   Wolfgang Denk   New implementatio...
1127
  	U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""),
0c79cda01   Mike Frysinger   env: make import/...
1128
  #endif
ea882baf9   Wolfgang Denk   New implementatio...
1129
1130
1131
1132
1133
1134
1135
1136
  	U_BOOT_CMD_MKENT(print, CONFIG_SYS_MAXARGS, 1, do_env_print, "", ""),
  #if defined(CONFIG_CMD_RUN)
  	U_BOOT_CMD_MKENT(run, CONFIG_SYS_MAXARGS, 1, do_run, "", ""),
  #endif
  #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
  	U_BOOT_CMD_MKENT(save, 1, 0, do_env_save, "", ""),
  #endif
  	U_BOOT_CMD_MKENT(set, CONFIG_SYS_MAXARGS, 0, do_env_set, "", ""),
88733e2c6   Andrew Ruder   cmd_nvedit.c: Add...
1137
1138
1139
  #if defined(CONFIG_CMD_ENV_EXISTS)
  	U_BOOT_CMD_MKENT(exists, 2, 0, do_env_exists, "", ""),
  #endif
ea882baf9   Wolfgang Denk   New implementatio...
1140
  };
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
1141
  #if defined(CONFIG_NEEDS_MANUAL_RELOC)
60f7da1f4   Heiko Schocher   env: fix cmd_env_...
1142
1143
1144
1145
1146
  void env_reloc(void)
  {
  	fixup_cmdtable(cmd_env_sub, ARRAY_SIZE(cmd_env_sub));
  }
  #endif
f3c615b8a   Macpaul Lin   cmd_nvedit.c: cle...
1147
  static int do_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
ea882baf9   Wolfgang Denk   New implementatio...
1148
1149
  {
  	cmd_tbl_t *cp;
5904da021   Thomas Weber   Common/cmd_nvedit...
1150
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
1151
  		return CMD_RET_USAGE;
5904da021   Thomas Weber   Common/cmd_nvedit...
1152

ea882baf9   Wolfgang Denk   New implementatio...
1153
1154
1155
1156
1157
1158
1159
1160
  	/* drop initial "env" arg */
  	argc--;
  	argv++;
  
  	cp = find_cmd_tbl(argv[0], cmd_env_sub, ARRAY_SIZE(cmd_env_sub));
  
  	if (cp)
  		return cp->cmd(cmdtp, flag, argc, argv);
4c12eeb8b   Simon Glass   Convert cmd_usage...
1161
  	return CMD_RET_USAGE;
ea882baf9   Wolfgang Denk   New implementatio...
1162
  }
088f1b199   Kim Phillips   common/cmd_*.c: s...
1163
1164
  #ifdef CONFIG_SYS_LONGHELP
  static char env_help_text[] =
ea882baf9   Wolfgang Denk   New implementatio...
1165
1166
1167
1168
  #if defined(CONFIG_CMD_ASKENV)
  	"ask name [message] [size] - ask for environment variable
  env "
  #endif
5e2b3e0c5   Joe Hershberger   env: Add a comman...
1169
1170
1171
1172
  #if defined(CONFIG_CMD_ENV_CALLBACK)
  	"callbacks - print callbacks and their associated variables
  env "
  #endif
b64b7c3df   Gerlando Falauto   env: make "env de...
1173
1174
1175
1176
  	"default [-f] -a - [forcibly] reset default environment
  "
  	"env default [-f] var [...] - [forcibly] reset variable(s) to their default values
  "
9d8d661d7   Joe Hershberger   env: Implement th...
1177
1178
  	"env delete [-f] var [...] - [forcibly] delete variable(s)
  "
ea882baf9   Wolfgang Denk   New implementatio...
1179
1180
1181
1182
  #if defined(CONFIG_CMD_EDITENV)
  	"env edit name - edit environment variable
  "
  #endif
88733e2c6   Andrew Ruder   cmd_nvedit.c: Add...
1183
1184
1185
1186
  #if defined(CONFIG_CMD_ENV_EXISTS)
  	"env exists name - tests for existence of variable
  "
  #endif
4796bc4bb   Benoît Thébaudeau   env import/export...
1187
  #if defined(CONFIG_CMD_EXPORTENV)
37f2fe747   Wolfgang Denk   env: allow to exp...
1188
1189
  	"env export [-t | -b | -c] [-s size] addr [var ...] - export environment
  "
4796bc4bb   Benoît Thébaudeau   env import/export...
1190
  #endif
fffad71bc   Joe Hershberger   env: Add a comman...
1191
1192
1193
1194
  #if defined(CONFIG_CMD_ENV_FLAGS)
  	"env flags - print variables that have non-default flags
  "
  #endif
a000b7950   Kim Phillips   common: add a gre...
1195
  #if defined(CONFIG_CMD_GREPENV)
be29df6a1   Wolfgang Denk   "env grep" - add ...
1196
1197
1198
1199
  #ifdef CONFIG_REGEX
  	"env grep [-e] [-n | -v | -b] string [...] - search environment
  "
  #else
d87244d5a   Wolfgang Denk   "env grep" - add ...
1200
1201
  	"env grep [-n | -v | -b] string [...] - search environment
  "
a000b7950   Kim Phillips   common: add a gre...
1202
  #endif
be29df6a1   Wolfgang Denk   "env grep" - add ...
1203
  #endif
4796bc4bb   Benoît Thébaudeau   env import/export...
1204
  #if defined(CONFIG_CMD_IMPORTENV)
a000b7950   Kim Phillips   common: add a gre...
1205
1206
  	"env import [-d] [-t | -b | -c] addr [size] - import environment
  "
4796bc4bb   Benoît Thébaudeau   env import/export...
1207
  #endif
be11235ab   Joe Hershberger   env: Hide '.' var...
1208
1209
  	"env print [-a | name ...] - print environment
  "
ea882baf9   Wolfgang Denk   New implementatio...
1210
1211
1212
1213
  #if defined(CONFIG_CMD_RUN)
  	"env run var [...] - run commands in an environment variable
  "
  #endif
d798a9b5d   Horst Kronstorfer   common/cmd_nvedit...
1214
  #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
ea882baf9   Wolfgang Denk   New implementatio...
1215
1216
  	"env save - save environment
  "
d798a9b5d   Horst Kronstorfer   common/cmd_nvedit...
1217
  #endif
088f1b199   Kim Phillips   common/cmd_*.c: s...
1218
1219
1220
1221
1222
1223
1224
  	"env set [-f] name [arg ...]
  ";
  #endif
  
  U_BOOT_CMD(
  	env, CONFIG_SYS_MAXARGS, 1, do_env,
  	"environment handling commands", env_help_text
ea882baf9   Wolfgang Denk   New implementatio...
1225
1226
1227
1228
1229
  );
  
  /*
   * Old command line interface, kept for compatibility
   */
8bde7f776   wdenk   * Code cleanup:
1230

246c69225   Peter Tyser   Add 'editenv' com...
1231
  #if defined(CONFIG_CMD_EDITENV)
722b061b6   Mike Frysinger   autocomplete: rem...
1232
  U_BOOT_CMD_COMPLETE(
ea882baf9   Wolfgang Denk   New implementatio...
1233
  	editenv, 2, 0,	do_env_edit,
246c69225   Peter Tyser   Add 'editenv' com...
1234
1235
1236
  	"edit environment variable",
  	"name
  "
722b061b6   Mike Frysinger   autocomplete: rem...
1237
1238
  	"    - edit environment variable 'name'",
  	var_complete
246c69225   Peter Tyser   Add 'editenv' com...
1239
1240
  );
  #endif
722b061b6   Mike Frysinger   autocomplete: rem...
1241
  U_BOOT_CMD_COMPLETE(
ea882baf9   Wolfgang Denk   New implementatio...
1242
  	printenv, CONFIG_SYS_MAXARGS, 1,	do_env_print,
2fb2604d5   Peter Tyser   Command usage cle...
1243
  	"print environment variables",
be11235ab   Joe Hershberger   env: Hide '.' var...
1244
1245
1246
  	"[-a]
      - print [all] values of all environment variables
  "
8bde7f776   wdenk   * Code cleanup:
1247
1248
  	"printenv name ...
  "
722b061b6   Mike Frysinger   autocomplete: rem...
1249
1250
  	"    - print value of environment variable 'name'",
  	var_complete
8bde7f776   wdenk   * Code cleanup:
1251
  );
a000b7950   Kim Phillips   common: add a gre...
1252
1253
1254
1255
  #ifdef CONFIG_CMD_GREPENV
  U_BOOT_CMD_COMPLETE(
  	grepenv, CONFIG_SYS_MAXARGS, 0,  do_env_grep,
  	"search environment variables",
be29df6a1   Wolfgang Denk   "env grep" - add ...
1256
1257
1258
1259
  #ifdef CONFIG_REGEX
  	"[-e] [-n | -v | -b] string ...
  "
  #else
d87244d5a   Wolfgang Denk   "env grep" - add ...
1260
1261
  	"[-n | -v | -b] string ...
  "
be29df6a1   Wolfgang Denk   "env grep" - add ...
1262
  #endif
d87244d5a   Wolfgang Denk   "env grep" - add ...
1263
1264
  	"    - list environment name=value pairs matching 'string'
  "
be29df6a1   Wolfgang Denk   "env grep" - add ...
1265
1266
1267
1268
  #ifdef CONFIG_REGEX
  	"      \"-e\": enable regular expressions;
  "
  #endif
d87244d5a   Wolfgang Denk   "env grep" - add ...
1269
1270
1271
  	"      \"-n\": search variable names; \"-v\": search values;
  "
  	"      \"-b\": search both names and values (default)",
a000b7950   Kim Phillips   common: add a gre...
1272
1273
1274
  	var_complete
  );
  #endif
722b061b6   Mike Frysinger   autocomplete: rem...
1275
  U_BOOT_CMD_COMPLETE(
ea882baf9   Wolfgang Denk   New implementatio...
1276
  	setenv, CONFIG_SYS_MAXARGS, 0,	do_env_set,
2fb2604d5   Peter Tyser   Command usage cle...
1277
  	"set environment variables",
24ab5a191   Joe Hershberger   env: Add setenv f...
1278
1279
1280
1281
1282
1283
1284
  	"[-f] name value ...
  "
  	"    - [forcibly] set environment variable 'name' to 'value ...'
  "
  	"setenv [-f] name
  "
  	"    - [forcibly] delete environment variable 'name'",
722b061b6   Mike Frysinger   autocomplete: rem...
1285
  	var_complete
8bde7f776   wdenk   * Code cleanup:
1286
  );
c76fe4742   Jon Loeliger   common/cmd_[i-n]*...
1287
  #if defined(CONFIG_CMD_ASKENV)
8bde7f776   wdenk   * Code cleanup:
1288

0d4983930   wdenk   Patch by Kenneth ...
1289
  U_BOOT_CMD(
ea882baf9   Wolfgang Denk   New implementatio...
1290
  	askenv,	CONFIG_SYS_MAXARGS,	1,	do_env_ask,
2fb2604d5   Peter Tyser   Command usage cle...
1291
  	"get environment variables from stdin",
8bde7f776   wdenk   * Code cleanup:
1292
1293
  	"name [message] [size]
  "
7d85591dd   Wolfgang Denk   env: fix "env ask...
1294
  	"    - get environment variable 'name' from stdin (max 'size' chars)"
8bde7f776   wdenk   * Code cleanup:
1295
  );
902531788   Jon Loeliger   common/: Remove l...
1296
  #endif
8bde7f776   wdenk   * Code cleanup:
1297

c76fe4742   Jon Loeliger   common/cmd_[i-n]*...
1298
  #if defined(CONFIG_CMD_RUN)
722b061b6   Mike Frysinger   autocomplete: rem...
1299
  U_BOOT_CMD_COMPLETE(
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
1300
  	run,	CONFIG_SYS_MAXARGS,	1,	do_run,
2fb2604d5   Peter Tyser   Command usage cle...
1301
  	"run commands in an environment variable",
8bde7f776   wdenk   * Code cleanup:
1302
1303
  	"var [...]
  "
722b061b6   Mike Frysinger   autocomplete: rem...
1304
1305
  	"    - run the commands in the environment variable(s) 'var'",
  	var_complete
8bde7f776   wdenk   * Code cleanup:
1306
  );
902531788   Jon Loeliger   common/: Remove l...
1307
  #endif
7ac2fe2da   Ilya Yanok   OMAP: networking ...
1308
  #endif /* CONFIG_SPL_BUILD */