*
* (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
* Andreas Heppel <aheppel@sysgo.de>
-
+ *
+ * Copyright 2011 Freescale Semiconductor, Inc.
+ *
* See file CREDITS for list of people who contributed to this
* project.
*
return rcode;
}
+#ifdef CONFIG_CMD_GREPENV
+static int do_env_grep (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ ENTRY *match;
+ unsigned char matched[env_htab.size / 8];
+ int rcode = 1, arg = 1, idx;
+
+ if (argc < 2)
+ return cmd_usage(cmdtp);
+
+ memset(matched, 0, env_htab.size / 8);
+
+ while (arg <= argc) {
+ idx = 0;
+ while ((idx = hstrstr_r(argv[arg], idx, &match, &env_htab))) {
+ if (!(matched[idx / 8] & (1 << (idx & 7)))) {
+ puts(match->key);
+ puts("=");
+ puts(match->data);
+ puts("\n");
+ }
+ matched[idx / 8] |= 1 << (idx & 7);
+ rcode = 0;
+ }
+ arg++;
+ }
+
+ return rcode;
+}
+#endif
+
/*
* Set a new environment variable,
* or replace or delete an existing one.
#if defined(CONFIG_CMD_EXPORTENV)
U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""),
#endif
+#if defined(CONFIG_CMD_GREPENV)
+ U_BOOT_CMD_MKENT(grep, CONFIG_SYS_MAXARGS, 1, do_env_grep, "", ""),
+#endif
#if defined(CONFIG_CMD_IMPORTENV)
U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""),
#endif
#if defined(CONFIG_CMD_EDITENV)
"env edit name - edit environment variable\n"
#endif
- "env export [-t | -b | -c] addr [size] - export environmnt\n"
- "env import [-d] [-t | -b | -c] addr [size] - import environmnt\n"
+ "env export [-t | -b | -c] addr [size] - export environment\n"
+#if defined(CONFIG_CMD_GREPENV)
+ "env grep string [...] - search environment\n"
+#endif
+ "env import [-d] [-t | -b | -c] addr [size] - import environment\n"
"env print [name ...] - print environment\n"
#if defined(CONFIG_CMD_RUN)
"env run var [...] - run commands in an environment variable\n"
var_complete
);
+#ifdef CONFIG_CMD_GREPENV
+U_BOOT_CMD_COMPLETE(
+ grepenv, CONFIG_SYS_MAXARGS, 0, do_env_grep,
+ "search environment variables",
+ "string ...\n"
+ " - list environment name=value pairs matching 'string'",
+ var_complete
+);
+#endif
+
U_BOOT_CMD_COMPLETE(
setenv, CONFIG_SYS_MAXARGS, 0, do_env_set,
"set environment variables",
*/
extern int hmatch_r(const char *__match, int __last_idx, ENTRY ** __retval,
struct hsearch_data *__htab);
+/*
+ * Search for an entry whose key or data contains `MATCH'. Otherwise,
+ * Same semantics as hsearch_r().
+ */
+extern int hstrstr_r(const char *__match, int __last_idx, ENTRY ** __retval,
+ struct hsearch_data *__htab);
/* Search and delete entry matching ITEM.key in internal hash table. */
extern int hdelete_r(const char *__key, struct hsearch_data *__htab);
* example for functions like hdelete().
*/
+/*
+ * hstrstr_r - return index to entry whose key and/or data contains match
+ */
+int hstrstr_r(const char *match, int last_idx, ENTRY ** retval,
+ struct hsearch_data *htab)
+{
+ unsigned int idx;
+
+ for (idx = last_idx + 1; idx < htab->size; ++idx) {
+ if (htab->table[idx].used <= 0)
+ continue;
+ if (strstr(htab->table[idx].entry.key, match) ||
+ strstr(htab->table[idx].entry.data, match)) {
+ *retval = &htab->table[idx].entry;
+ return idx;
+ }
+ }
+
+ __set_errno(ESRCH);
+ *retval = NULL;
+ return 0;
+}
+
int hmatch_r(const char *match, int last_idx, ENTRY ** retval,
struct hsearch_data *htab)
{