commands: add 'findstr' to get string from file
PATCH 1/1 commands: add 'findstr' to get string from file
Command 'findstr' can be for example used to find the string "MAC=1C:BA:8C:F3:82:BB" in file /dev/eeprom0 to set the appropriate variable:
$ findstr -o 4 -l 17 -t eth0.ethaddr MAC /dev/eeprom0
Usage: findstr [OPTIONS] <STRING> <FILE>
Find string in file and print it
-o <offset> set offset of string which gets printed -l <length> set length of string which gets printed -t <var> print into variable instead of stdio
--- commands/Kconfig | 7 +++ commands/Makefile | 1 + commands/findstr.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 commands/findstr.c
commands/Kconfig +7 -0
@@ -149,6 +149,13 @@ config CMD_GLOBAL help The global command allows to create global variables +config CMD_FINDSTR + tristate + default n + prompt "findstr" + help + Find string in file. + endmenu menu "file commands"
commands/Makefile +1 -0
@@ -97,3 +97,4 @@ obj-$(CONFIG_CMD_READF) += readf.o obj-$(CONFIG_CMD_MENUTREE) += menutree.o obj-$(CONFIG_CMD_2048) += 2048.o obj-$(CONFIG_CMD_REGULATOR) += regulator.o +obj-$(CONFIG_CMD_FINDSTR) += findstr.o
commands/findstr.c new file +138 -0
138 lines not on this page · raw message
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Quoted 25 lines · Christoph Fritz
Command 'findstr' can be for example used to find the string "MAC=1C:BA:8C:F3:82:BB" in file
/dev/eeprom0to set the appropriate variable:$ findstr -o 4 -l 17 -t eth0.ethaddr MAC /dev/eeprom0Usage: findstr [OPTIONS] <STRING> <FILE>
Find string in file and print it(quoted diff) +0
-3-o <offset> set offset of string which gets printed -l <length> set length of string which gets printed -t <var> print into variable instead of stdioSigned-off-by Christoph Fritz <[email protected]>--- commands/Kconfig | 7 +++ commands/Makefile | 1 + commands/findstr.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 commands/findstr.ccommands/Kconfig +0
-0
commands/Kconfig config CMD_GLOBAL · line 154
Quoted 6 lines
commands/Kconfig +3
-0@@ -149,6 +149,13 @@ config CMD_GLOBAL help The global command allows to create global variables +config CMD_FINDSTR + tristate + default n
not needed.
Quoted 71 lines
commands/Kconfig +4
-0+ prompt "findstr" + help + Find string in file. + endmenu menu "file commands"commands/Makefile +1
-0@@ -97,3 +97,4 @@ obj-$(CONFIG_CMD_READF) += readf.o obj-$(CONFIG_CMD_MENUTREE) += menutree.o obj-$(CONFIG_CMD_2048) += 2048.o obj-$(CONFIG_CMD_REGULATOR) += regulator.o +obj-$(CONFIG_CMD_FINDSTR) += findstr.ocommands/findstr.c new file +48
-0@@ -0,0 +1,138 @@ +/* +* Copyright (c) 2014 Christoph Fritz <[email protected]> +* +* 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. +* +*/ + +/** +* @file +* @brief Find string in file +*/ + +#include <common.h> +#include <command.h> +#include <fs.h> +#include <fcntl.h> +#include <errno.h> +#include <getopt.h> +#include <environment.h> + +extern char *mem_rw_buf; + +/** +* @param[in] argc Argument count from command line +* @param[in] argv List of input arguments +*/ +static int do_findstr (int argc,char *argv[]) +{ +int opt, fd, r, ret =1 ; +loff_t len =0 , offset =0 , idx =0 ; +u_char *s, *t =NULL , *v = (u_char *)mem_rw_buf; +unsigned int v_idx, s_idx =0 ; + +if (argc <2 ) +return COMMAND_ERROR_USAGE ; + +while ((opt =getopt (argc, argv,"o:l:t:" )) >0 ) { +switch (opt) {
commands/findstr.c line 58
Quoted 10 lines
commands/findstr.c new file +10
-0+case 'o' : + offset =simple_strtoul (optarg,NULL ,0 ); +break ; +case 'l' : + len =simple_strtoul (optarg,NULL ,0 ); +break ; +case 't' : + t = optarg; +break ; + }
switch case without default branch can occur compiler warnings.
You should return COMMAND_ERROR_USAGE in the default branch if non valid parameter is given.
Quoted 51 lines
commands/findstr.c new file +51
-0+ } + +if (argc - optind !=2 ) +return COMMAND_ERROR_USAGE ; + + s = argv[optind]; + + fd =open (argv[optind+1 ],O_RDONLY ); +if (fd <0 ) +return COMMAND_ERROR_USAGE ; + +while (1 ) { + r =read (fd, mem_rw_buf,RW_BUF_SIZE ); +if (r <0 ) { + ret = -EIO ; + goto out; + } +if (!r) +break ; + + v_idx =0 ; + +while (r) { +if (v[v_idx] == s[s_idx]) + s_idx++; +else + s_idx =0 ; + + idx++; + v_idx++; + +if (s_idx ==strlen (s)) {/* found */ +loff_t sz; +loff_t hit = idx -strlen (s); + +if (lseek (fd, hit + offset,SEEK_SET ) <0 ) { + ret = -EIO ; + goto out; + } + +if (!len) + len =strlen (s); + sz =min_t (loff_t, len,RW_BUF_SIZE -1 ); + r =read (fd, mem_rw_buf, sz); +if (r != sz) { + ret = -EIO ; + goto out; + } + + v[sz] ='\0' ; +
commands/findstr.c line 119
Quoted 10 lines
commands/findstr.c new file +10
-0+if (t) +setenv (t, v); +else +printf ("%s\n" , v); + + ret =0 ; + goto out; + } + r--; + }
Why not use read_file and the awesome string function strstr and then write the file back.
- Alex
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
Hi Alexander
Quoted 6 lines · Alexander Aring
commands/Kconfig config CMD_GLOBAL · line 154
Quoted 3 lines · Christoph Fritz
commands/Kconfig +3
-0+config CMD_FINDSTR + tristate + default nnot needed.
Ok
Quoted 15 lines
commands/findstr.c line 58
Quoted 12 lines
commands/findstr.c new file +12
-0+while ((opt =getopt (argc, argv,"o:l:t:" )) >0 ) { +switch (opt) { +case 'o' : + offset =simple_strtoul (optarg,NULL ,0 ); +break ; +case 'l' : + len =simple_strtoul (optarg,NULL ,0 ); +break ; +case 't' : + t = optarg; +break ; + }switch case without default branch can occur compiler warnings.
Quoted 2 lines
You should return
COMMAND_ERROR_USAGEin the default branch if non valid parameter is given.
Ok
Quoted 49 lines
Quoted 49 lines
commands/findstr.c new file +49
-0+ fd =open (argv[optind+1 ],O_RDONLY ); +if (fd <0 ) +return COMMAND_ERROR_USAGE ; + +while (1 ) { + r =read (fd, mem_rw_buf,RW_BUF_SIZE ); +if (r <0 ) { + ret = -EIO ; + goto out; + } +if (!r) +break ; + + v_idx =0 ; + +while (r) { +if (v[v_idx] == s[s_idx]) + s_idx++; +else + s_idx =0 ; + + idx++; + v_idx++; + +if (s_idx ==strlen (s)) {/* found */ +loff_t sz; +loff_t hit = idx -strlen (s); + +if (lseek (fd, hit + offset,SEEK_SET ) <0 ) { + ret = -EIO ; + goto out; + } + +if (!len) + len =strlen (s); + sz =min_t (loff_t, len,RW_BUF_SIZE -1 ); + r =read (fd, mem_rw_buf, sz); +if (r != sz) { + ret = -EIO ; + goto out; + } + + v[sz] ='\0' ; + +if (t) +setenv (t, v); +else +printf ("%s\n" , v); +
Quoted 8 lines
commands/findstr.c line 119
Quoted 5 lines
commands/findstr.c new file +5
-0+ ret =0 ; + goto out; + } + r--; + }Why not use
read_fileand the awesome string function strstr and then write the file back.
read_file() reads the whole file which can get pretty slow over an i2c link accessing an eeprom which mostly holds the configuration-string at the beginning.
Why would I want to write the file back?
Thanks
-- Christoph
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
Quoted 90 lines · Christoph Fritz
Hi Alexander
Quoted 6 lines · Alexander Aring
commands/Kconfig config CMD_GLOBAL · line 154
Quoted 3 lines · Christoph Fritz
commands/Kconfig +3
-0+config CMD_FINDSTR + tristate + default nnot needed.
Ok
Quoted 15 lines
commands/findstr.c line 58
Quoted 12 lines
commands/findstr.c new file +12
-0+while ((opt =getopt (argc, argv,"o:l:t:" )) >0 ) { +switch (opt) { +case 'o' : + offset =simple_strtoul (optarg,NULL ,0 ); +break ; +case 'l' : + len =simple_strtoul (optarg,NULL ,0 ); +break ; +case 't' : + t = optarg; +break ; + }switch case without default branch can occur compiler warnings.
Quoted 2 lines
You should return
COMMAND_ERROR_USAGEin the default branch if non valid parameter is given.Ok
Quoted 49 lines
Quoted 49 lines
commands/findstr.c new file +49
-0+ fd =open (argv[optind+1 ],O_RDONLY ); +if (fd <0 ) +return COMMAND_ERROR_USAGE ; + +while (1 ) { + r =read (fd, mem_rw_buf,RW_BUF_SIZE ); +if (r <0 ) { + ret = -EIO ; + goto out; + } +if (!r) +break ; + + v_idx =0 ; + +while (r) { +if (v[v_idx] == s[s_idx]) + s_idx++; +else + s_idx =0 ; + + idx++; + v_idx++; + +if (s_idx ==strlen (s)) {/* found */ +loff_t sz; +loff_t hit = idx -strlen (s); + +if (lseek (fd, hit + offset,SEEK_SET ) <0 ) { + ret = -EIO ; + goto out; + } + +if (!len) + len =strlen (s); + sz =min_t (loff_t, len,RW_BUF_SIZE -1 ); + r =read (fd, mem_rw_buf, sz); +if (r != sz) { + ret = -EIO ; + goto out; + } + + v[sz] ='\0' ; + +if (t) +setenv (t, v); +else +printf ("%s\n" , v); +Quoted 8 lines
commands/findstr.c line 119
Quoted 5 lines
commands/findstr.c new file +5
-0+ ret =0 ; + goto out; + } + r--; + }Why not use
read_fileand the awesome string function strstr and then write the file back.
Quoted 6 lines
read_file()reads the whole file which can get pretty slow over an i2c link accessing an eeprom which mostly holds the configuration-string at the beginning.Why would I want to write the file back?
Oh, thought you do that to manipulate the MAC configuration... Yea, this could be slow and of course on big files like /dev/mem but this would be more a pebcak related problem like somebody will do a "edit /dev/mem", which should not work because edit use read_file.
Are you sure that the command also works if the searched string is overlapped in two areas of RW_BUF_SIZE? I don't see that in the current implementation.
You also assume here that the content is ascii based. Maybe you should write that in the command description.
This handling would be much easier with a proper eeprom configurationlayout with a static offset for each setting.
- Alex
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 1/1 commands: add 'findstr' to search file for string
Command 'findstr' can be for example used to find string "MAC=1C:BA:8C:F3:82:BB" in file /dev/eeprom0 to set an appropriate environment variable:
$ findstr -o 16 -l 17 -t eth0.ethaddr pcm051_eth0_MAC= /dev/eeprom0
Usage: findstr [OPTIONS] <STRING> <FILE>
Find ASCII string in file and print it
-o <offset> set offset of string which gets printed -l <length> set length of string which gets printed -t <var> print into variable instead of stdio
---
Changes in v2:
- fix Kconfig: 'default n' is default
- add default branch to switch
- fix search string read-buffer overlap
--- commands/Kconfig | 6 +++ commands/Makefile | 1 + commands/findstr.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 commands/findstr.c
commands/Kconfig +6 -0
@@ -149,6 +149,12 @@ config CMD_GLOBAL help The global command allows to create global variables +config CMD_FINDSTR + tristate + prompt "findstr" + help + Find ASCII string in file. + endmenu menu "file commands"
commands/Makefile +1 -0
@@ -97,3 +97,4 @@ obj-$(CONFIG_CMD_READF) += readf.o obj-$(CONFIG_CMD_MENUTREE) += menutree.o obj-$(CONFIG_CMD_2048) += 2048.o obj-$(CONFIG_CMD_REGULATOR) += regulator.o +obj-$(CONFIG_CMD_FINDSTR) += findstr.o
commands/findstr.c new file +140 -0
140 lines not on this page · raw message
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Re: [PATCH v2] commands: add 'findstr' to search file for string
Quoted 1 line · On Wed, 21 May 2014 10:02:42 +0200 Christoph Fritz <[email protected]>…
Command 'findstr' can be for example used to find string
We already have some commands with string.h style names:
memcmp, memcpy, memset
Can we use 'strstr' name for your new command?
Another proposition:
can we add <offset from file start> and <no more N characters to search> parameters?
Using these parameters you can speed up your search and use your command with /dev/mem.
Quoted 204 lines
"MAC=1C:BA:8C:F3:82:BB" in file
/dev/eeprom0to set an appropriate environment variable:$ findstr -o 16 -l 17 -t eth0.ethaddr pcm051_eth0_MAC= /dev/eeprom0Usage: findstr [OPTIONS] <STRING> <FILE>
Find ASCII string in file and print it(quoted diff) +0
-3-o <offset> set offset of string which gets printed -l <length> set length of string which gets printed -t <var> print into variable instead of stdioSigned-off-by Christoph Fritz <[email protected]>---
Changes in v2:
- fixKconfig: 'default n' is default
- add default branch to switch
- fix search string read-buffer overlap--- commands/Kconfig | 6 +++ commands/Makefile | 1 + commands/findstr.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 commands/findstr.ccommands/Kconfig +6
-0@@ -149,6 +149,12 @@ config CMD_GLOBAL help The global command allows to create global variables +config CMD_FINDSTR + tristate + prompt "findstr" + help + Find ASCII string in file. + endmenu menu "file commands"commands/Makefile +1
-0@@ -97,3 +97,4 @@ obj-$(CONFIG_CMD_READF) += readf.o obj-$(CONFIG_CMD_MENUTREE) += menutree.o obj-$(CONFIG_CMD_2048) += 2048.o obj-$(CONFIG_CMD_REGULATOR) += regulator.o +obj-$(CONFIG_CMD_FINDSTR) += findstr.ocommands/findstr.c new file +140
-0@@ -0,0 +1,140 @@ +/* +* Copyright (c) 2014 Christoph Fritz <[email protected]> +* +* 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. +* +*/ + +/** +* @file +* @brief Find string in file +*/ + +#include <common.h> +#include <command.h> +#include <fs.h> +#include <fcntl.h> +#include <errno.h> +#include <getopt.h> +#include <environment.h> + +#define FINDSTR_BUF_SIZE RW_BUF_SIZE + +extern char *mem_rw_buf; + +/** +* @param[in] argc Argument count from command line +* @param[in] argv List of input arguments +*/ +static int do_findstr (int argc,char *argv[]) +{ +int opt, fd, r, ret =1 ; +loff_t len =0 , offset =0 , idx =0 ; +u_char *s, *t =NULL , *v = (u_char *)mem_rw_buf; +unsigned int v_idx, s_idx =0 ; + +if (argc <2 ) +return COMMAND_ERROR_USAGE ; + +while ((opt =getopt (argc, argv,"o:l:t:" )) >0 ) { +switch (opt) { +case 'o' : + offset =simple_strtoul (optarg,NULL ,0 ); +break ; +case 'l' : + len =simple_strtoul (optarg,NULL ,0 ); +break ; +case 't' : + t = optarg; +break ; +default : +return COMMAND_ERROR_USAGE ; + } + } + +if (argc - optind !=2 ) +return COMMAND_ERROR_USAGE ; + + s = argv[optind]; + + fd =open (argv[optind+1 ],O_RDONLY ); +if (fd <0 ) +return COMMAND_ERROR_USAGE ; + +while (1 ) { + r =read (fd, mem_rw_buf,FINDSTR_BUF_SIZE ); +if (r <0 ) { + ret = -EIO ; + goto out; + } +if (!r) +break ; + + v_idx =0 ; + +while (r) { +if (v[v_idx] == s[s_idx]) + s_idx++; +else + s_idx =0 ; + + idx++; + v_idx++; + +if (s_idx ==strlen (s)) {/* found */ +loff_t hit = idx -strlen (s); + +if (lseek (fd, hit + offset,SEEK_SET ) <0 ) { + ret = -EIO ; + goto out; + } + +if (!len) + len =strlen (s); + r =read (fd, mem_rw_buf, len); +if (r != len) { + ret = -EIO ; + goto out; + } + + v[r] ='\0' ; + +if (t) +setenv (t, v); +else +printf ("%s\n" , v); + + ret =0 ; + goto out; + } + r--; + } + } +out: +close (fd); +return ret; +} + +BAREBOX_CMD_HELP_START(findstr) +BAREBOX_CMD_HELP_USAGE("findstr [OPTIONS] <STRING> <FILE>\n") +BAREBOX_CMD_HELP_SHORT("Find ASCII string in file and print it\n") +BAREBOX_CMD_HELP_OPT("-o <offset>", "set offset of string which gets printed\n") +BAREBOX_CMD_HELP_OPT("-l <length>", "set length of string which gets printed\n") +BAREBOX_CMD_HELP_OPT("-t <var>", "print into variable instead of stdio\n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(findstr) + .cmd = do_findstr, + .usage = "findstr [OPTIONS] <STRING> <FILE>", + BAREBOX_CMD_HELP(cmd_findstr_help) +BAREBOX_CMD_ENDSignature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Signature · 8 lines
-- Best regards, Antony Pavlov _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Re: [PATCH v2] commands: add 'findstr' to search file for string
Hi Antony
Quoted 9 lines · Antony Pavlov
Quoted 1 line · On Wed, 21 May 2014 10:02:42 +0200 Christoph Fritz <[email protected]>…
Command 'findstr' can be for example used to find string
We already have some commands with
string.hstyle names:
memcmp, memcpy, memsetCan we use 'strstr' name for your new command?
Sure, anyone with any objections?
Quoted 6 lines
Another proposition:
can we add <offset from file start> and <no more N characters to
search> parameters?Using these parameters you can speed up your search and use your command with
/dev/mem.
Ok, I can add this to a [PATCH v3], anyone with any objections?
Quoted 10 lines
Review
Quoted 10 lines
"MAC=1C:BA:8C:F3:82:BB" in file
/dev/eeprom0to set an appropriate environment variable:$ findstr -o 16 -l 17 -t eth0.ethaddr pcm051_eth0_MAC= /dev/eeprom0Usage: findstr [OPTIONS] <STRING> <FILE>
Find ASCII string in file and print it(quoted diff) +0
-3-o <offset> set offset of string which gets printed -l <length> set length of string which gets printed -t <var> print into variable instead of stdio
Thanks
-- Christoph
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
Hi Christoph,
Review
Quoted 11 lines · Christoph Fritz
Command 'findstr' can be for example used to find the string "MAC=1C:BA:8C:F3:82:BB" in file
/dev/eeprom0to set the appropriate variable:$ findstr -o 4 -l 17 -t eth0.ethaddr MAC /dev/eeprom0Usage: findstr [OPTIONS] <STRING> <FILE>
Find string in file and print it(quoted diff) +0
-3-o <offset> set offset of string which gets printed -l <length> set length of string which gets printed -t <var> print into variable instead of stdio
I wonder how useful such a command is. I mean normally I would expect a MAC address to be stored in binary format and not ASCII. Matching 'MAC' (what about the '='?) seems not very robust. What about strings with dynamic lengths?
If the command is primarily intended for the MAC address then maybe a more dedicated command or a piece of code called from board code is more robust. If the command is intended as a general eeprom-variable-store then I think it's not flexible enough.
Sascha
Signature · 9 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Hi Sascha
Quoted 7 lines · Sascha Hauer
Quoted 6 lines · Christoph Fritz
Command 'findstr' can be for example used to find the string "MAC=1C:BA:8C:F3:82:BB" in file
/dev/eeprom0to set the appropriate variable:$ findstr -o 4 -l 17 -t eth0.ethaddr MAC /dev/eeprom0
Quoted 8 lines
Review
Quoted 5 lines
Usage: findstr [OPTIONS] <STRING> <FILE>
Find string in file and print it(quoted diff) +0
-3-o <offset> set offset of string which gets printed -l <length> set length of string which gets printed -t <var> print into variable instead of stdioI wonder how useful such a command is. I mean normally I would expect a MAC address to be stored in binary format and not ASCII.
Yes, and if a user wants to set it to another value, there is variable 'ethaddr' in 'env/network/eth0' which can be changed.
The use case here I'm facing: User wants to change 'ethaddr' and store it in eeprom instead. If the whole /dev/eeprom0 would be a barebox-script, it could be processed, but I can't rely on.
Quoted 1 line
Matching 'MAC' (what about the '='?) seems not very robust.
From the example above, the offset is 4 and a '=' or any other char gets bypassed.
Quoted 1 line
What about strings with dynamic lengths?
A more robust and flexible approach I have in mind is this: Find string xy and delimiter z in file and optionally execute what is in between as a command.
Quoted 3 lines
If the command is primarily intended for the MAC address then maybe a more dedicated command or a piece of code called from board code is more robust.
That's what I'm already doing here, but want to get a more general solution for all kinds of settings.
Quoted 2 lines
If the command is intended as a general
eeprom-variable-store then I think it's not flexible enough.
What do you think about the more robust approach from above?
Thanks
-- Christoph
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox