9
0
Fork 0

Add readf command

The readf command is useful to read the content of a file into
a shell variable. It should be used for ascii content and thus
stops reading at all nonprintable characters including newline.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2014-02-13 19:32:30 +01:00
parent 6280e991ee
commit 3b7a102d3e
3 changed files with 70 additions and 0 deletions

View File

@ -57,6 +57,12 @@ config CMD_READLINE
tristate
prompt "readline"
config CMD_READF
tristate
prompt "readf"
help
The readf command is used to read a files content into a shell variable.
config CMD_LET
tristate
prompt "let"

View File

@ -93,3 +93,4 @@ obj-$(CONFIG_CMD_MIITOOL) += miitool.o
obj-$(CONFIG_CMD_DETECT) += detect.o
obj-$(CONFIG_CMD_BOOT) += boot.o
obj-$(CONFIG_CMD_DEVINFO) += devinfo.o
obj-$(CONFIG_CMD_READF) += readf.o

63
commands/readf.c Normal file
View File

@ -0,0 +1,63 @@
#include <common.h>
#include <command.h>
#include <fs.h>
#include <malloc.h>
#include <linux/stat.h>
#include <linux/ctype.h>
#include <environment.h>
static int do_readf(int argc, char *argv[])
{
unsigned char *buf = NULL, *val;
char *variable, *filename;
struct stat s;
size_t size;
int ret, i;
if (argc != 3)
return COMMAND_ERROR_USAGE;
filename = argv[1];
variable = argv[2];
ret = stat(filename, &s);
if (ret)
goto out;
if (s.st_size > 1024) {
ret = -EFBIG;
goto out;
}
buf = read_file(filename, &size);
if (!buf)
goto out;
for (i = 0; i < size; i++) {
if (!isprint(buf[i])) {
buf[i] = '\0';
break;
}
}
val = strim(buf);
ret = setenv(variable, val);
out:
free(buf);
return ret;
}
BAREBOX_CMD_HELP_START(readf)
BAREBOX_CMD_HELP_USAGE("readf <file> <variable>\n")
BAREBOX_CMD_HELP_SHORT("Read a single line of a file into a shell variable. Leading and trailing whitespaces\n")
BAREBOX_CMD_HELP_SHORT("are removed, nonvisible characters are stripped. Input is limited to 1024\n")
BAREBOX_CMD_HELP_SHORT("characters.\n")
BAREBOX_CMD_HELP_END
BAREBOX_CMD_START(readf)
.cmd = do_readf,
.usage = "read file into variable",
BAREBOX_CMD_HELP(cmd_readf_help)
BAREBOX_CMD_END