From: Alexander Holler <holler@ahsoftware.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/4] Add option -r to env import to allow import of text files with CRLF as line endings
Date: Mon, 14 Jul 2014 17:49:55 +0200 [thread overview]
Message-ID: <1405352998-7707-2-git-send-email-holler@ahsoftware.de> (raw)
In-Reply-To: <1405352998-7707-1-git-send-email-holler@ahsoftware.de>
When this option is enabled, CRLF is treated like LF when importing environments
from text files, which means CRs ('\r') in front of LFs ('\n') are just ignored.
Drawback of enabling this option is that (maybe exported) variables which have
a trailing CR in their content will get imported without that CR. But this
drawback is very unlikely and the big advantage of letting Windows user create
a *working* uEnv.txt too is likely more welcome.
Signed-off-by: Alexander Holler <holler@ahsoftware.de>
---
common/cmd_nvedit.c | 19 +++++++++++++++----
common/env_common.c | 6 +++---
include/search.h | 3 ++-
lib/hashtable.c | 17 ++++++++++++++++-
4 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index e6c3395..855808c 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -950,11 +950,15 @@ sep_err:
#ifdef CONFIG_CMD_IMPORTENV
/*
- * env import [-d] [-t | -b | -c] addr [size]
+ * env import [-d] [-t [-r] | -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
+ * -r: handle CRLF like LF, that means exported variables with
+ * a content which ends with \r won't get imported. Used
+ * to import text files created with editors which are using CRLF
+ * for line endings. Only effective in addition to -t.
* -b: assume binary format ('\0' separated, "\0\0" terminated)
* -c: assume checksum protected environment format
* addr: memory address to read from
@@ -970,6 +974,7 @@ static int do_env_import(cmd_tbl_t *cmdtp, int flag,
int chk = 0;
int fmt = 0;
int del = 0;
+ int crlf_is_lf = 0;
size_t size;
cmd = *argv;
@@ -994,6 +999,9 @@ static int do_env_import(cmd_tbl_t *cmdtp, int flag,
goto sep_err;
sep = '\n';
break;
+ case 'r': /* handle CRLF like LF */
+ crlf_is_lf = 1;
+ break;
case 'd':
del = 1;
break;
@@ -1009,6 +1017,9 @@ static int do_env_import(cmd_tbl_t *cmdtp, int flag,
if (!fmt)
printf("## Warning: defaulting to text format\n");
+ if (sep != '\n' && crlf_is_lf )
+ crlf_is_lf = 0;
+
addr = simple_strtoul(argv[0], NULL, 16);
ptr = map_sysmem(addr, 0);
@@ -1050,8 +1061,8 @@ static int do_env_import(cmd_tbl_t *cmdtp, int flag,
ptr = (char *)ep->data;
}
- if (himport_r(&env_htab, ptr, size, sep, del ? 0 : H_NOCLEAR, 0,
- NULL) == 0) {
+ if (himport_r(&env_htab, ptr, size, sep, del ? 0 : H_NOCLEAR,
+ crlf_is_lf, 0, NULL) == 0) {
error("Environment import failed: errno = %d\n", errno);
return 1;
}
@@ -1180,7 +1191,7 @@ static char env_help_text[] =
#endif
#endif
#if defined(CONFIG_CMD_IMPORTENV)
- "env import [-d] [-t | -b | -c] addr [size] - import environment\n"
+ "env import [-d] [-t [-r] | -b | -c] addr [size] - import environment\n"
#endif
"env print [-a | name ...] - print environment\n"
#if defined(CONFIG_CMD_RUN)
diff --git a/common/env_common.c b/common/env_common.c
index cd7b4cd..af372a6 100644
--- a/common/env_common.c
+++ b/common/env_common.c
@@ -120,7 +120,7 @@ void set_default_env(const char *s)
}
if (himport_r(&env_htab, (char *)default_environment,
- sizeof(default_environment), '\0', flags,
+ sizeof(default_environment), '\0', flags, 0,
0, NULL) == 0)
error("Environment import failed: errno = %d\n", errno);
@@ -137,7 +137,7 @@ int set_default_vars(int nvars, char * const vars[])
*/
return himport_r(&env_htab, (const char *)default_environment,
sizeof(default_environment), '\0',
- H_NOCLEAR | H_INTERACTIVE, nvars, vars);
+ H_NOCLEAR | H_INTERACTIVE, 0, nvars, vars);
}
#ifdef CONFIG_ENV_AES
@@ -214,7 +214,7 @@ int env_import(const char *buf, int check)
return ret;
}
- if (himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', 0,
+ if (himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', 0, 0,
0, NULL)) {
gd->flags |= GD_FLG_ENV_READY;
return 1;
diff --git a/include/search.h b/include/search.h
index ae3efc4..9701efb 100644
--- a/include/search.h
+++ b/include/search.h
@@ -102,7 +102,8 @@ extern ssize_t hexport_r(struct hsearch_data *__htab,
*/
extern int himport_r(struct hsearch_data *__htab,
const char *__env, size_t __size, const char __sep,
- int __flag, int nvars, char * const vars[]);
+ int __flag, int __crlf_is_lf, int nvars,
+ char * const vars[]);
/* Walk the whole table calling the callback on each element */
extern int hwalk_r(struct hsearch_data *__htab, int (*callback)(ENTRY *));
diff --git a/lib/hashtable.c b/lib/hashtable.c
index 4356b23..18ed590 100644
--- a/lib/hashtable.c
+++ b/lib/hashtable.c
@@ -776,7 +776,7 @@ static int drop_var_from_set(const char *name, int nvars, char * vars[])
int himport_r(struct hsearch_data *htab,
const char *env, size_t size, const char sep, int flag,
- int nvars, char * const vars[])
+ int crlf_is_lf, int nvars, char * const vars[])
{
char *data, *sp, *dp, *name, *value;
char *localvars[nvars];
@@ -841,6 +841,21 @@ int himport_r(struct hsearch_data *htab,
}
}
+ if(!size)
+ return 1; /* everything OK */
+ if(crlf_is_lf) {
+ /* Remove Carriage Returns in front of Line Feeds */
+ unsigned ignored_crs = 0;
+ for(;dp < data + size && *dp; ++dp) {
+ if(*dp == '\r' &&
+ dp < data + size - 1 && *(dp+1) == '\n')
+ ++ignored_crs;
+ else
+ *(dp-ignored_crs) = *dp;
+ }
+ size -= ignored_crs;
+ dp = data;
+ }
/* Parse environment; allow for '\0' and 'sep' as separators */
do {
ENTRY e, *rv;
--
1.8.3.1
next prev parent reply other threads:[~2014-07-14 15:49 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-14 15:49 [U-Boot] [PATCH 0/4] Add option -r to env import to allow import of text files with CRLF as line endings Alexander Holler
2014-07-14 15:49 ` Alexander Holler [this message]
2014-07-22 19:23 ` [U-Boot] [U-Boot, 1/4] " Tom Rini
2014-07-30 22:47 ` [U-Boot] [PATCH " Stephen Warren
2014-07-31 19:51 ` Tom Rini
2014-07-31 19:57 ` Stephen Warren
2014-08-14 8:25 ` Alexander Holler
2014-08-14 15:49 ` Stephen Warren
2014-08-14 18:41 ` Robert Nelson
2014-08-14 19:38 ` Tom Rini
2014-08-14 19:50 ` Stephen Warren
2014-08-14 20:53 ` Tom Rini
2014-08-14 21:05 ` Alexander Holler
2014-08-14 21:35 ` Stephen Warren
2014-08-14 21:44 ` Alexander Holler
2014-08-14 19:38 ` Alexander Holler
2014-08-14 19:51 ` Stephen Warren
2014-08-14 19:59 ` Alexander Holler
2014-08-14 20:08 ` Stephen Warren
2014-08-14 20:39 ` Alexander Holler
2014-08-01 12:08 ` Wolfgang Denk
2014-08-02 21:09 ` Alexander Holler
2014-08-03 16:38 ` Alexander Holler
2014-08-03 17:51 ` Wolfgang Denk
2014-08-04 6:47 ` Alexander Holler
2014-08-04 7:00 ` Alexander Holler
2014-08-04 10:00 ` Måns Rullgård
2014-08-04 19:18 ` Alexander Holler
2014-08-06 6:43 ` Wolfgang Denk
2014-08-06 10:02 ` Alexander Holler
2014-08-06 10:28 ` Alexander Holler
2014-08-06 10:44 ` Måns Rullgård
2014-08-06 11:18 ` Alexander Holler
2014-08-06 11:48 ` Alexander Holler
2014-08-03 17:47 ` Wolfgang Denk
2014-07-14 15:49 ` [U-Boot] [PATCH 2/4] omap3_beagle: handle import of environments in " Alexander Holler
2014-07-22 19:23 ` [U-Boot] [U-Boot, " Tom Rini
2014-07-14 15:49 ` [U-Boot] [PATCH 3/4] am335x_evm: " Alexander Holler
2014-07-22 19:23 ` [U-Boot] [U-Boot, " Tom Rini
2014-07-14 15:49 ` [U-Boot] [PATCH 4/4] rpi_b: " Alexander Holler
2014-07-22 19:23 ` [U-Boot] [U-Boot, " Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1405352998-7707-2-git-send-email-holler@ahsoftware.de \
--to=holler@ahsoftware.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox