[U-Boot] [PATCHv10] new tool mkenvimage: generates an env image from an arbitrary config file

Wolfgang Denk wd at denx.de
Sun Oct 23 22:44:38 CEST 2011


Dear David Wagner,

In message <1318612616-16799-1-git-send-email-david.wagner at free-electrons.com> you wrote:
> This tool takes a key=value configuration file (same as would a `printenv' show)
> and generates the corresponding environment image, ready to be flashed.
> 
> use case: flash the environment with an external tool

This patch fails to build when I try to run a plain "make
tools/mkenvimage":

tools/mkenvimage.c:35:22: fatal error: compiler.h: No such file or directory

tools/mkenvimage.c:39:24: fatal error: u-boot/crc.h: No such file or
directory



...
> +	/* Parse the cmdline */
> +	while ((option = getopt(argc, argv, "s:o:rbp:h")) != -1) {
> +		switch (option) {
> +		case 's':
> +			datasize = strtol(optarg, NULL, 0);
...
> +			padbyte = strtol(optarg, NULL, 0);

Please add error checking for invalid input formats here.

> +	if (datasize == 0) {
> +		fprintf(stderr,
> +			"Please specify the size of the envrionnment "
> +			"partition.\n");

Please don't split that string, and fix the "envrionment" typo.

> +	dataptr = malloc(datasize * sizeof(*dataptr));
> +	if (!dataptr) {
> +		fprintf(stderr, "Can't alloc dataptr.\n");

It might be helpful to know how many bytes you were trying to
allocate.

> +	/*
> +	 * envptr points to the beginning of the actual environment (after the
> +	 * crc and possible `redundant' bit

s/bit/byte/

> +	/* Open the input file ... */
> +	if (optind >= argc) {
> +		fprintf(stderr, "Please specify an input filename\n");
> +		return EXIT_FAILURE;
> +	}

Please also allow to use stdin as input when no "<input file>" arg is
given.

> +		int readlen = sizeof(*envptr) * 2048;
> +		txt_fd = STDIN_FILENO;
> +
> +		do {
> +			filebuf = realloc(filebuf, readlen);
> +			readbytes = read(txt_fd, filebuf + filesize, readlen);
> +			filesize += readbytes;
> +		} while (readbytes == readlen);

This is pretty much inefficient.  Consider a size increment of
something like  min(readlen, 4096).

Also, realloc() can fail - add error handling.

And read() can fail, too - add error handling.

> +		filesize = txt_file_stat.st_size;
> +		/* Read the raw input file and transform it */

Why don't you just use mmap() here?

> +	if (filesize >= envsize) {
> +		fprintf(stderr, "The input file is larger than the "
> +				"envrionnment partition size\n");

Please don't split such strings.  See CodingStyle:

        "However, never break user-visible strings such as printk
         messages, because that breaks the ability to grep for them."

Please fix globally.

> +		} else if (filebuf[fp] == '#') {
> +			if (fp != 0 && filebuf[fp-1] == '\n') {
> +				/* This line is a comment, let's skip it */
> +				while (fp < txt_file_stat.st_size &&
> +				       filebuf[fp] != '\n')
> +					fp++;
> +			} else {
> +				envptr[ep++] = filebuf[fp];
> +			}

printenv output does not contain any such "comments".
And - aren't you also catching embedded hashes here, like in "serial#"
for example?

...
> +
> +	/* Computes the CRC and put it at the beginning of the data */
> +	crc = crc32(0, envptr, envsize);
> +	targetendian_crc = bigendian ? cpu_to_be32(crc) : cpu_to_le32(crc);
> +
> +	memcpy(dataptr, &targetendian_crc, sizeof(uint32_t));

I fail to see where you set the redundant flag?


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
I am more bored than you could ever possibly be.  Go back to work.


More information about the U-Boot mailing list