summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Hershberger <joe.hershberger@ni.com>2012-10-03 09:38:47 +0000
committerTom Rini <trini@ti.com>2012-10-15 11:54:05 -0700
commit62a34a04e7259ea1562749de3b0e35e94386b37b (patch)
treeb08a3e91a7a7b2a103b8f05dccf79f0195eea54b
parent497f2053f8cdd5df412e8dd01db525eb04201ebb (diff)
tools/env: Remove unneeded complexity
The length included the name length, and then it was subtracted back out on each use. Now we don't include it in the first place. Also realloc as we process arguments and eliminate memset. Use memcpy instead of manually copying each byte. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
-rw-r--r--tools/env/fw_env.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index 57ad8c9db7e..ccaa8896318 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -478,7 +478,6 @@ int fw_setenv(int argc, char *argv[])
int i, len;
char *name;
char *value = NULL;
- char *tmpval = NULL;
if (argc < 2) {
errno = EINVAL;
@@ -492,34 +491,28 @@ int fw_setenv(int argc, char *argv[])
name = argv[1];
- len = strlen(name) + 2;
- for (i = 2; i < argc; ++i)
- len += strlen(argv[i]) + 1;
-
- /* Allocate enough place to the data string */
+ len = 0;
for (i = 2; i < argc; ++i) {
char *val = argv[i];
+ size_t val_len = strlen(val);
+
+ value = realloc(value, len + val_len + 1);
if (!value) {
- value = (char *)malloc(len - strlen(name));
- if (!value) {
- fprintf(stderr,
+ fprintf(stderr,
"Cannot malloc %zu bytes: %s\n",
- len - strlen(name), strerror(errno));
- return -1;
- }
- memset(value, 0, len - strlen(name));
- tmpval = value;
+ len, strerror(errno));
+ return -1;
}
- if (i != 2)
- *tmpval++ = ' ';
- while (*val != '\0')
- *tmpval++ = *val++;
+
+ memcpy(value + len, val, val_len);
+ len += val_len;
+ value[len++] = ' ';
}
+ value[len - 1] = '\0';
fw_env_write(name, value);
- if (value)
- free(value);
+ free(value);
return fw_env_close();
}