Skip to contentSkip to conversation

commands: add 'findstr' to get string from file

PATCH Superseded Christoph Fritz 4 participants 9 messages May 20, 2014 – May 22, 2014

lore
Share & tools
lore
#0 lore raw

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
index 3ef8860..a2f817a 100644
@@ -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
index f927d21..b7c7e31 100644
@@ -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
\ No newline at end of file
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
#1 lore raw
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/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

(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
---
 commands/Kconfig   |    7 +++
 commands/Makefile  |    1 +
 commands/findstr.c |  138 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 146 insertions(+)
 create mode 100644 commands/findstr.c
commands/Kconfig +0 -0
index 3ef8860..a2f817a 100644

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
index f927d21..b7c7e31 100644
@@ -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
\ No newline at end of file
commands/findstr.c new file +48 -0
new file mode 100644
index 0000000..37cfee3
@@ -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

#2 lore raw

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 n

not 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_USAGE in 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_file and 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

#3 lore raw
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 n

not 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_USAGE in 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_file and 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

#4 lore raw

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
index 3ef8860..a795da9 100644
@@ -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
index f927d21..580b137 100644
@@ -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
#5 lore raw

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/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

(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

---
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
index 3ef8860..a795da9 100644
@@ -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
index f927d21..580b137 100644
@@ -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
new file mode 100644
index 0000000..934c300
@@ -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_END
Signature · 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
#6 lore raw

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.h style names:
memcmp, memcpy, memset

Can 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/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

(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

#7 lore raw
In reply to Christoph Fritz

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/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

(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
#8 lore raw

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/eeprom0 to 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 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.

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