common: add a grepenv command
PATCH v2 1/1 common: add a grepenv command
u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring.
---
v2: rebased
common/cmd_nvedit.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 51 insertions(+), 0 deletions(-)
common/cmd_nvedit.c +51 -0
@@ -160,6 +160,49 @@ int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])return rcode; } +int do_grepenv (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) +{ +char buf[CONFIG_SYS_CBSIZE ], *searchstr; +int i =0 , j =0 , k =0 ; +int rcode =1 ; + +if (argc !=2 ) { +cmd_usage (cmdtp); +return 1 ; + } + + searchstr = argv[1 ]; + +/* find and print matching env vars */ +do { + buf[j] =env_get_char (i); +if (buf[j] == searchstr[k]) { + k++; +if (searchstr[k] =='\0' ) { +/* match complete */ + rcode =0 ; +do { + i++; j++; + buf[j] =env_get_char (i); + }while (buf[j] !='\0' ); +puts (buf);puts ("\n" ); + j =0 ; k =0 ; + }else + j++; + }else { + k =0 ; +if (buf[j] =='\0' ) { + j =0 ; +if (ctrlc ()) +return -1 ; + }else + j++; + } + i++; + }while (!(j ==0 &&env_get_char (i) =='\0' )); + +return rcode; +}/* * Set a new environment variable, * or replace or delete an existing one.
@@ -904,6 +947,14 @@ U_BOOT_CMD_COMPLETE( );U_BOOT_CMD_COMPLETE ( + grepenv,2 ,0 , do_grepenv, +"search environment" , +"fixed-string\n" +" - list environment name and value pairs matching 'fixed-string'" , + var_complete +); + +U_BOOT_CMD_COMPLETE ( setenv,CONFIG_SYS_MAXARGS ,0 , do_env_set,"set environment variables" , "name value ...\n"
Signature · 1 line
1.7.4
PATCH v2 1/1 common: add a grepenv command
Dear Kim Phillips,
Quoted 6 lines · In message <[email protected]> you wrote:
u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring.
It would be nice if you gave an example of how to use this.
common/cmd_nvedit.c int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) · line 172
Quoted 10 lines
common/cmd_nvedit.c +10
-0+int do_grepenv (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) +{ +char buf[CONFIG_SYS_CBSIZE ], *searchstr; +int i =0 , j =0 , k =0 ; +int rcode =1 ; + +if (argc !=2 ) { +cmd_usage (cmdtp); +return 1 ; + }
Why don't you allow for an arbitrary number of arguments here?
Quoted 3 lines
common/cmd_nvedit.c +3
-0+/* find and print matching env vars */ + do { + buf[j] = env_get_char(i);
...
common/cmd_nvedit.c int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) · line 202
Quoted 1 line
common/cmd_nvedit.c +1
-0+ }while (!(j ==0 &&env_get_char (i) =='\0' ));
This does not work as you might expect. The current environment cannot be parsed like that, becuase it is not stored in a linear list any more, but in a hash table instead.
You may be lucky on some systems (especially NOR flash based ones) to read the last saved data from the persistent storage, but this is NOT the current environment.
Best regards,
Wolfgang Denk
Signature · 4 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "Deliver yesterday, code today, think tomorrow."
PATCH v2 1/1 common: add a grepenv command
In reply to Kim PhillipsQuoted 6 lines · Kim Phillips
u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. ?grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring.
please add a proper #ifdef like CONFIG_CMD_GREPENV and do not enable it by default.
Quoted 1 line
+int
do_grepenv(cmd_tbl_t*cmdtp, int flag, int argc, char * const argv[])
static
Quoted 1 line
+ ? ? ? char buf[CONFIG_SYS_CBSIZE], *searchstr;
i dont think that is correct usage of this define
-mike
PATCH v3 1/1 common: add a grepenv command
u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring.
the following examples are on a board with a 5313 byte environment that spans multiple screen pages:
Example 1: summarize ethernet configuration:
=> grepenv eth TSEC
etact=FM1 at DTSEC2
eth=FM1 at DTSEC4
ethact=FM1 at DTSEC2
eth1addr=00:E0:0C:00:8b:01
eth2addr=00:E0:0C:00:8b:02
eth3addr=00:E0:0C:00:8b:03
eth4addr=00:E0:0C:00:8b:04
eth5addr=00:E0:0C:00:8b:05
eth6addr=00:E0:0C:00:8b:06
eth7addr=00:E0:0C:00:8b:07
eth8addr=00:E0:0C:00:8b:08
eth9addr=00:E0:0C:00:8b:09
ethaddr=00:E0:0C:00:8b:00
netdev=eth0
uprcw=setenv ethact $eth;setenv filename p4080ds/R_PPSXX_0xe/rcw_0xe_2sgmii_rev2_high.bin;setenv start 0xe8000000;protect off all;run upimage;protect on all
upuboot=setenv ethact $eth;setenv filename u-boot.bin;setenv start eff80000;protect off all;run upimage;protect on all
upucode=setenv ethact $eth;setenv filename fsl_fman_ucode_P4080_101_6.bin;setenv start 0xef000000;protect off all;run upimage;protect on all
usdboot=setenv ethact $eth;tftp 1000000 $dir/$bootfile;tftp 2000000 $dir/initramfs.cpio.gz.uboot;tftp c00000 $dir/p4080ds-usdpaa.dtb;setenv bootargs root=/dev/ram rw console=ttyS0,115200 $othbootargs;bootm 1000000 2000000 c00000; =>
Example 2: detect unused env vars:
=> grepenv etact
etact=FM1 at DTSEC2
=>
Example 3: reveal hardcoded variables; e.g., for fdtaddr:
=> grepenv fdtaddr
fdtaddr=c00000
nfsboot=setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off console=$consoledev,$baudrate $othbootargs;tftp $loadaddr $bootfile;tftp $fdtaddr $fdtfile;bootm $loadaddr - $fdtaddr ramboot=setenv bootargs root=/dev/ram rw console=$consoledev,$baudrate $othbootargs;tftp $ramdiskaddr $ramdiskfile;tftp $loadaddr $bootfile;tftp $fdtaddr $fdtfile;bootm $loadaddr $ramdiskaddr $fdtaddr
=> grep $fdtaddr
fdtaddr=c00000
my_boot=bootm 0x40000000 0x41000000 0x00c00000
my_dtb=tftp 0x00c00000 $prefix/p4080ds.dtb
nohvboot=tftp 1000000 $dir/$bootfile;tftp 2000000 $dir/$ramdiskfile;tftp c00000 $dir/$fdtfile;setenv bootargs root=/dev/ram rw ramdisk_size=0x10000000 console=ttyS0,115200;bootm 1000000 2000000 c00000;
=>
This patch also enables the grepenv command by default on corenet_ds based boards (and repositions the DHCP command entry to keep the list sorted).
---
v2: rebase
v3: address comments from Mike Frysinger, Wolfgang Denk:
- hexport first, so as to always get current environment
- handle multiple strings per invocation, in an OR fashion, uniquify output
- add a proper #ifdef like CONFIG_CMD_GREPENV, only enabled by default on corenet_ds systems
- don't use dubious CONFIG_SYS_CBSIZE - use hexported memory
- assign index variables better names than i,j,k.
- provide usage examples in commit text
- add copyright
README | 1 + common/cmd_nvedit.c | 70 +++++++++++++++++++++++++++++++++++++++++- include/configs/corenet_ds.h | 3 +- 3 files changed, 72 insertions(+), 2 deletions(-)
README +1 -0
@@ -643,6 +643,7 @@ The following options need to be configured: CONFIG_CMD_FDOS * Dos diskette Support CONFIG_CMD_FLASH flinfo, erase, protect CONFIG_CMD_FPGA FPGA device initialization support + CONFIG_CMD_GREPENV * search environment CONFIG_CMD_HWFLOW * RTS/CTS hw flow control CONFIG_CMD_I2C * I2C serial bus support CONFIG_CMD_IDE * IDE harddisk support
common/cmd_nvedit.c +69 -1
88 lines not on this page · raw message
include/configs/corenet_ds.h +2 -1
@@ -473,14 +473,15 @@*/ #include <config_cmd_default.h> +#define CONFIG_CMD_DHCP #define CONFIG_CMD_ELF #define CONFIG_CMD_ERRATA +#define CONFIG_CMD_GREPENV #define CONFIG_CMD_IRQ #define CONFIG_CMD_I2C #define CONFIG_CMD_MII #define CONFIG_CMD_PING #define CONFIG_CMD_SETEXPR -#define CONFIG_CMD_DHCP #ifdef CONFIG_PCI #define CONFIG_CMD_PCI
Signature · 1 line
1.7.4.2.dirty
PATCH v3 1/1 common: add a grepenv command
Dear Kim Phillips,
Quoted 6 lines · In message <[email protected]> you wrote:
u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring.
Wishlist: add options to restrict search on variable name resp. value only.
Quoted 2 lines
v3: address comments from Mike Frysinger, Wolfgang Denk:
- hexport first, so as to always get current environment
Oops. This was not the way I expected you to change the code.
Can you please operate on the hash table data instead? See for example commit 560d424 for how to iterate over the variables.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Karl's version of Parkinson's Law: Work expands to exceed the time alloted it.
PATCH v4 1/1 common: add a grepenv command
u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring.
the following examples are on a board with a 5313 byte environment that spans multiple screen pages:
Example 1: summarize ethernet configuration:
=> grepenv eth TSEC
etact=FM1 at DTSEC2
eth=FM1 at DTSEC4
ethact=FM1 at DTSEC2
eth1addr=00:E0:0C:00:8b:01
eth2addr=00:E0:0C:00:8b:02
eth3addr=00:E0:0C:00:8b:03
eth4addr=00:E0:0C:00:8b:04
eth5addr=00:E0:0C:00:8b:05
eth6addr=00:E0:0C:00:8b:06
eth7addr=00:E0:0C:00:8b:07
eth8addr=00:E0:0C:00:8b:08
eth9addr=00:E0:0C:00:8b:09
ethaddr=00:E0:0C:00:8b:00
netdev=eth0
uprcw=setenv ethact $eth;setenv filename p4080ds/R_PPSXX_0xe/rcw_0xe_2sgmii_rev2_high.bin;setenv start 0xe8000000;protect off all;run upimage;protect on all
upuboot=setenv ethact $eth;setenv filename u-boot.bin;setenv start eff80000;protect off all;run upimage;protect on all
upucode=setenv ethact $eth;setenv filename fsl_fman_ucode_P4080_101_6.bin;setenv start 0xef000000;protect off all;run upimage;protect on all
usdboot=setenv ethact $eth;tftp 1000000 $dir/$bootfile;tftp 2000000 $dir/initramfs.cpio.gz.uboot;tftp c00000 $dir/p4080ds-usdpaa.dtb;setenv bootargs root=/dev/ram rw console=ttyS0,115200 $othbootargs;bootm 1000000 2000000 c00000; =>
Example 2: detect unused env vars:
=> grepenv etact
etact=FM1 at DTSEC2
=>
Example 3: reveal hardcoded variables; e.g., for fdtaddr:
=> grepenv fdtaddr
fdtaddr=c00000
nfsboot=setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off console=$consoledev,$baudrate $othbootargs;tftp $loadaddr $bootfile;tftp $fdtaddr $fdtfile;bootm $loadaddr - $fdtaddr ramboot=setenv bootargs root=/dev/ram rw console=$consoledev,$baudrate $othbootargs;tftp $ramdiskaddr $ramdiskfile;tftp $loadaddr $bootfile;tftp $fdtaddr $fdtfile;bootm $loadaddr $ramdiskaddr $fdtaddr
=> grep $fdtaddr
fdtaddr=c00000
my_boot=bootm 0x40000000 0x41000000 0x00c00000
my_dtb=tftp 0x00c00000 $prefix/p4080ds.dtb
nohvboot=tftp 1000000 $dir/$bootfile;tftp 2000000 $dir/$ramdiskfile;tftp c00000 $dir/$fdtfile;setenv bootargs root=/dev/ram rw ramdisk_size=0x10000000 console=ttyS0,115200;bootm 1000000 2000000 c00000;
=>
This patch also enables the grepenv command by default on corenet_ds based boards (and repositions the DHCP command entry to keep the list sorted).
---
v2: rebase
v3: address comments from Mike Frysinger, Wolfgang Denk:
- hexport first, so as to always get current environment
- handle multiple strings per invocation, in an OR fashion, uniquify output
- add a proper #ifdef like CONFIG_CMD_GREPENV, only enabled by default on corenet_ds systems
- don't use dubious CONFIG_SYS_CBSIZE - use hexported memory
- assign index variables better names than i,j,k.
- provide usage examples in commit text
- add copyright
v4: change to use commit 560d424 as guidance for how to iterate directly over the variables in the hash table
README | 1 + common/cmd_nvedit.c | 47 +++++++++++++++++++++++++++++++++++++++++- include/configs/corenet_ds.h | 3 +- include/search.h | 6 +++++ lib/hashtable.c | 23 ++++++++++++++++++++ 5 files changed, 78 insertions(+), 2 deletions(-)
README +1 -0
@@ -643,6 +643,7 @@ The following options need to be configured: CONFIG_CMD_FDOS * Dos diskette Support CONFIG_CMD_FLASH flinfo, erase, protect CONFIG_CMD_FPGA FPGA device initialization support + CONFIG_CMD_GREPENV * search environment CONFIG_CMD_HWFLOW * RTS/CTS hw flow control CONFIG_CMD_I2C * I2C serial bus support CONFIG_CMD_IDE * IDE harddisk support
common/cmd_nvedit.c +46 -1
65 lines not on this page · raw message
include/configs/corenet_ds.h +2 -1
@@ -473,14 +473,15 @@*/ #include <config_cmd_default.h> +#define CONFIG_CMD_DHCP #define CONFIG_CMD_ELF #define CONFIG_CMD_ERRATA +#define CONFIG_CMD_GREPENV #define CONFIG_CMD_IRQ #define CONFIG_CMD_I2C #define CONFIG_CMD_MII #define CONFIG_CMD_PING #define CONFIG_CMD_SETEXPR -#define CONFIG_CMD_DHCP #ifdef CONFIG_PCI #define CONFIG_CMD_PCI
include/search.h +6 -0
@@ -80,6 +80,12 @@ extern int hsearch_r(ENTRY __item, ACTION __action, ENTRY ** __retval,*/ 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);
lib/hashtable.c +23 -0
@@ -202,6 +202,29 @@ void hdestroy_r(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) {
Signature · 1 line
1.7.4.2.dirty
PATCH v4 1/1 common: add a grepenv command
Hi Kim,
common/cmd_nvedit.c int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) · line 175
Quoted 11 lines
common/cmd_nvedit.c +11
-0+#ifdef CONFIG_CMD_GREPENV +static int do_env_grep (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) +{ +ENTRY *match; +int matched[env_htab.size]; +int rcode =1 , idx; + +if (argc <2 ) { +cmd_usage (cmdtp); +return 1 ; + }
This could be:
if (argc < 2)
return cmd_usage(cmdtp);
common/cmd_nvedit.c int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) · line 178
Quoted 2 lines
common/cmd_nvedit.c +2
-0+for (idx =0 ; idx < env_htab.size; idx++) + matched[idx] =0 ;
memset()?
<snip>
common/cmd_nvedit.c U_BOOT_CMD_COMPLETE( · line 949
Quoted 9 lines
common/cmd_nvedit.c +9
-0+#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
Support for "env grep" should also be added to the "env" command in cmd_nvedit.c. My understanding was that the individual printenv, setenv, etc commands were deprecated in favor of the unified "env" command.
Cool feature!
Peter
PATCH v4 1/1 common: add a grepenv command
Quoted 7 lines · Peter Tyser
Quoted 7 lines
common/cmd_nvedit.c +7
-0+#ifdef CONFIG_CMD_GREPENV +static int do_env_grep (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) +{ + ? ? ENTRY *match; + ? ? int matched[env_htab.size]; + ? ? int rcode = 1, idx; +
Quoted 8 lines
Quoted 4 lines
+ ? ? if (argc < 2) {
+ ? ? ? ? ? ?cmd_usage(cmdtp);
+ ? ? ? ? ? ? return 1;
+ ? ? }This could be:
if (argc < 2)
? ? ? ?returncmd_usage(cmdtp);
s/could/should/
-mike
PATCH v5 1/1 common: add a grepenv command
u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring.
the following examples are on a board with a 5313 byte environment that spans multiple screen pages:
Example 1: summarize ethernet configuration:
=> grepenv eth TSEC
etact=FM1 at DTSEC2
eth=FM1 at DTSEC4
ethact=FM1 at DTSEC2
eth1addr=00:E0:0C:00:8b:01
eth2addr=00:E0:0C:00:8b:02
eth3addr=00:E0:0C:00:8b:03
eth4addr=00:E0:0C:00:8b:04
eth5addr=00:E0:0C:00:8b:05
eth6addr=00:E0:0C:00:8b:06
eth7addr=00:E0:0C:00:8b:07
eth8addr=00:E0:0C:00:8b:08
eth9addr=00:E0:0C:00:8b:09
ethaddr=00:E0:0C:00:8b:00
netdev=eth0
uprcw=setenv ethact $eth;setenv filename p4080ds/R_PPSXX_0xe/rcw_0xe_2sgmii_rev2_high.bin;setenv start 0xe8000000;protect off all;run upimage;protect on all
upuboot=setenv ethact $eth;setenv filename u-boot.bin;setenv start eff80000;protect off all;run upimage;protect on all
upucode=setenv ethact $eth;setenv filename fsl_fman_ucode_P4080_101_6.bin;setenv start 0xef000000;protect off all;run upimage;protect on all
usdboot=setenv ethact $eth;tftp 1000000 $dir/$bootfile;tftp 2000000 $dir/initramfs.cpio.gz.uboot;tftp c00000 $dir/p4080ds-usdpaa.dtb;setenv bootargs root=/dev/ram rw console=ttyS0,115200 $othbootargs;bootm 1000000 2000000 c00000; =>
Example 2: detect unused env vars:
=> grepenv etact
etact=FM1 at DTSEC2
=>
Example 3: reveal hardcoded variables; e.g., for fdtaddr:
=> grepenv fdtaddr
fdtaddr=c00000
nfsboot=setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off console=$consoledev,$baudrate $othbootargs;tftp $loadaddr $bootfile;tftp $fdtaddr $fdtfile;bootm $loadaddr - $fdtaddr ramboot=setenv bootargs root=/dev/ram rw console=$consoledev,$baudrate $othbootargs;tftp $ramdiskaddr $ramdiskfile;tftp $loadaddr $bootfile;tftp $fdtaddr $fdtfile;bootm $loadaddr $ramdiskaddr $fdtaddr
=> grep $fdtaddr
fdtaddr=c00000
my_boot=bootm 0x40000000 0x41000000 0x00c00000
my_dtb=tftp 0x00c00000 $prefix/p4080ds.dtb
nohvboot=tftp 1000000 $dir/$bootfile;tftp 2000000 $dir/$ramdiskfile;tftp c00000 $dir/$fdtfile;setenv bootargs root=/dev/ram rw ramdisk_size=0x10000000 console=ttyS0,115200;bootm 1000000 2000000 c00000;
=>
This patch also enables the grepenv command by default on corenet_ds based boards (and repositions the DHCP command entry to keep the list sorted).
---
v2: rebase
v3: address comments from Mike Frysinger, Wolfgang Denk:
- hexport first, so as to always get current environment
- handle multiple strings per invocation, in an OR fashion, uniquify
output
- add a proper #ifdef like CONFIG_CMD_GREPENV, only enabled by default
on corenet_ds systems
- don't use dubious CONFIG_SYS_CBSIZE - use hexported memory
- assign index variables better names than i,j,k.
- provide usage examples in commit text
- add copyright
v4: change to use commit 560d424 as guidance for how to iterate
directly over the variables in the hash table
v5: comments from Peter Tyser:
- add "env grep" to the "env" command
- use memset for matched
also in v5:
- make 'already matched' an array of bits instead of ints to reduce stack usage
- perform in-order argument matching -- previous version would search for last token first
- fix spelling whilst in there: environmnt->environment
README | 1 + common/cmd_nvedit.c | 55 +++++++++++++++++++++++++++++++++++++++-- include/configs/corenet_ds.h | 3 +- include/search.h | 6 ++++ lib/hashtable.c | 23 +++++++++++++++++ 5 files changed, 84 insertions(+), 4 deletions(-)
README +1 -0
@@ -643,6 +643,7 @@ The following options need to be configured: CONFIG_CMD_FDOS * Dos diskette Support CONFIG_CMD_FLASH flinfo, erase, protect CONFIG_CMD_FPGA FPGA device initialization support + CONFIG_CMD_GREPENV * search environment CONFIG_CMD_HWFLOW * RTS/CTS hw flow control CONFIG_CMD_I2C * I2C serial bus support CONFIG_CMD_IDE * IDE harddisk support
common/cmd_nvedit.c +52 -3
85 lines not on this page · raw message
include/configs/corenet_ds.h +2 -1
@@ -474,14 +474,15 @@*/ #include <config_cmd_default.h> +#define CONFIG_CMD_DHCP #define CONFIG_CMD_ELF #define CONFIG_CMD_ERRATA +#define CONFIG_CMD_GREPENV #define CONFIG_CMD_IRQ #define CONFIG_CMD_I2C #define CONFIG_CMD_MII #define CONFIG_CMD_PING #define CONFIG_CMD_SETEXPR -#define CONFIG_CMD_DHCP #ifdef CONFIG_PCI #define CONFIG_CMD_PCI
include/search.h +6 -0
@@ -80,6 +80,12 @@ extern int hsearch_r(ENTRY __item, ACTION __action, ENTRY ** __retval,*/ 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);
lib/hashtable.c +23 -0
@@ -202,6 +202,29 @@ void hdestroy_r(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) {
Signature · 1 line
1.7.4.2.dirty
Wolfgang Denk
AppliedPATCH v5 1/1 common: add a grepenv command
Dear Kim Phillips,
Quoted 9 lines · In message <[email protected]> you wrote:
u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring.
the following examples are on a board with a 5313 byte environment that spans multiple screen pages:
...
Quoted 6 lines
README | 1 + common/cmd_nvedit.c | 55 +++++++++++++++++++++++++++++++++++++++-- include/configs/corenet_ds.h | 3 +- include/search.h | 6 ++++ lib/hashtable.c | 23 +++++++++++++++++ 5 files changed, 84 insertions(+), 4 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 6 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Lispers are among the best grads of the Sweep-It-Under-Someone- Else's-Carpet School of Simulated Simplicity. [Was that sufficiently incendiary? :-)] - Larry Wall in <[email protected]