[U-Boot] [PATCH v3] easylogo: add optional gzip support

Wolfgang Denk wd at denx.de
Fri Dec 12 00:45:30 CET 2008


Dear Mike Frysinger,

In message <1228941641-27682-1-git-send-email-vapier at gentoo.org> you wrote:
> Some images can be quite large, so add an option to compress the image data
> with gzip in the U-Boot image.  Then at runtime, the board can decompress it
> with the normal zlib functions.
...
> +		gz = popen (gzcmd, "w");
> +		if (!gz) {
> +			perror ("\nerror: popen() failed");
> + gzerr:
> +			free (gzfilename);
> +			free (gzcmd);
> +			return -1;
> +		}
> +		if (fwrite (image->data, image->size, 1, gz) != 1) {
> +			perror ("\nerror: writing data to gzip failed");
> +			goto gzerr;
> +		}
> +		if (pclose (gz)) {
> +			perror ("\nerror: gzip process failed");
> +			goto gzerr;
> +		}
> +
> +		gz = fopen (gzfilename, "r");
> +		if (!gz) {
> +			perror ("\nerror: open() on gzip data failed");
> +			goto gzerr;
> +		}
> +		if (stat (gzfilename, &st)) {
> +			perror ("\nerror: stat() on gzip file failed");
> +			goto gzerr;
> +		}
> +		compressed = xmalloc (st.st_size);
> +		if (fread (compressed, st.st_size, 1, gz) != 1) {
> +			perror ("\nerror: reading gzip data failed");
> +			goto gzerr;
> +		}
> +		fclose (gz);
> +
> +		unlink (gzfilename);
> +
> +		dataptr = compressed;
> +		count = st.st_size;
> +		fprintf (file, "#define EASYLOGO_ENABLE_GZIP %i\n\n", count);
> +		if (use_gzip & 0x2)
> +			fprintf (file, "static unsigned char EASYLOGO_DECOMP_BUFFER[%i];\n\n", image->size);
> +
> +		free (gzfilename);
> +		free (gzcmd);

Umm... no. Jumping back to a random place upward in the code just to
get an error exit is ugly, and you duplicate code (the 2 x free()
calls).

How about something like this:

	char *errstr = NULL;

	...
	gz = popen (gzcmd, "w");
	if (!gz) {
		errstr = "\nerror: popen() failed";
		goto out;
	}
	if (fwrite (image->data, image->size, 1, gz) != 1) {
		errstr = "\nerror: writing data to gzip failed";
		goto out;
	}
	if (pclose (gz)) {
		errstr = "\nerror: gzip process failed";
		goto out;
	}

	gz = fopen (gzfilename, "r");
	if (!gz) {
		errstr = "\nerror: open() on gzip data failed";
		goto out;
	}
	if (stat (gzfilename, &st)) {
		errstr = "\nerror: stat() on gzip file failed";
		goto out;
	}
	compressed = xmalloc (st.st_size);
	if (fread (compressed, st.st_size, 1, gz) != 1) {
		errstr = "\nerror: reading gzip data failed";
		goto out;
	}
	fclose (gz);

	unlink (gzfilename);

	dataptr = compressed;
	count = st.st_size;
	fprintf (file, "#define EASYLOGO_ENABLE_GZIP %i\n\n", count);
	if (use_gzip & 0x2)
		fprintf (file, "static unsigned char EASYLOGO_DECOMP_BUFFER[%i];\n\n", image->size);

out:
	if (errstr)
		perror (errstr);
	free (gzfilename);
	free (gzcmd);
	if (errstr)
		return -1;
	...

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
The price of curiosity is a terminal experience.
                         - Terry Pratchett, _The Dark Side of the Sun_


More information about the U-Boot mailing list