Hi, I would like to give /dev/stdin to the flag -d of mkimage. The only thing that prevent doing it is the function copy_file of mkimage.c, which: - calls stat(2) on the file to get the input file size - calls mmap(2) with this size as length
When the file is a pipe, its size is set to 0 and mmap(2) fails. This patch replaces the use of mmap(2) with read(2). If accepted, I could give a look to accept /dev/stdout as output file (which is currently also required to be a file). >From e107bdc73ee7b2159956cfc753328f9f03c058e8 Mon Sep 17 00:00:00 2001 From: Julien Castets <castet...@gmail.com> Date: Fri, 26 Sep 2014 11:28:49 +0200 Subject: [PATCH] tools: mkimage can read input on /dev/stdin Use a sequential read(2) instead of a mmap(2) in copy_file. Signed-off-by: Julien Castets <castet...@gmail.com> --- tools/mkimage.c | 64 +++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/tools/mkimage.c b/tools/mkimage.c index c70408c..bb35110 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -522,14 +522,14 @@ static void copy_file (int ifd, const char *datafile, int pad) { int dfd; - struct stat sbuf; - unsigned char *ptr; int tail; int zero = 0; uint8_t zeros[4096]; - int offset = 0; - int size; struct image_type_params *tparams = mkimage_get_type (params.type); + unsigned char buf[4096]; + ssize_t nbytes; + ssize_t i; + ssize_t size = 0; if (pad >= sizeof(zeros)) { fprintf(stderr, "%s: Can't pad to %d\n", @@ -549,63 +549,62 @@ copy_file (int ifd, const char *datafile, int pad) exit (EXIT_FAILURE); } - if (fstat(dfd, &sbuf) < 0) { - fprintf (stderr, "%s: Can't stat %s: %s\n", - params.cmdname, datafile, strerror(errno)); - exit (EXIT_FAILURE); - } - - ptr = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, dfd, 0); - if (ptr == MAP_FAILED) { - fprintf (stderr, "%s: Can't read %s: %s\n", - params.cmdname, datafile, strerror(errno)); - exit (EXIT_FAILURE); - } - if (params.xflag) { - unsigned char *p = NULL; /* * XIP: do not append the image_header_t at the * beginning of the file, but consume the space * reserved for it. */ + nbytes = read(dfd, buf, tparams->header_size); + if (nbytes == -1) { + fprintf (stderr, "%s: Can't read XIP header of %s: %s\n", + params.cmdname, datafile, strerror(errno)); + exit (EXIT_FAILURE); + } - if ((unsigned)sbuf.st_size < tparams->header_size) { + if (nbytes < tparams->header_size) { fprintf (stderr, "%s: Bad size: \"%s\" is too small for XIP\n", params.cmdname, datafile); exit (EXIT_FAILURE); } - for (p = ptr; p < ptr + tparams->header_size; p++) { - if ( *p != 0xff ) { + for (i = 0; i < nbytes; ++i) { + if (buf[i] != 0xff) { fprintf (stderr, "%s: Bad file: \"%s\" has invalid buffer for XIP\n", params.cmdname, datafile); exit (EXIT_FAILURE); } } + } - offset = tparams->header_size; + while ((nbytes = read(dfd, buf, sizeof(buf))) > 0) { + if (write(ifd, buf, nbytes) != nbytes) { + fprintf (stderr, "%s: Write error on %s: %s\n", + params.cmdname, params.imagefile, strerror(errno)); + exit (EXIT_FAILURE); + } + size += nbytes; } - size = sbuf.st_size - offset; - if (write(ifd, ptr + offset, size) != size) { - fprintf (stderr, "%s: Write error on %s: %s\n", - params.cmdname, params.imagefile, strerror(errno)); - exit (EXIT_FAILURE); + if (nbytes == -1) { + fprintf (stderr, "%s: Read error on %s: %s\n", + params.cmdname, params.imagefile, strerror(errno)); + exit (EXIT_FAILURE); } tail = size % 4; if ((pad == 1) && (tail != 0)) { - - if (write(ifd, (char *)&zero, 4-tail) != 4-tail) { + if (write(ifd, (char *)&zero, 4 - tail) != 4 - tail) { fprintf (stderr, "%s: Write error on %s: %s\n", - params.cmdname, params.imagefile, - strerror(errno)); + params.cmdname, params.imagefile, + strerror(errno)); exit (EXIT_FAILURE); } - } else if (pad > 1) { + } + + else if (pad > 1) { if (write(ifd, (char *)&zeros, pad) != pad) { fprintf(stderr, "%s: Write error on %s: %s\n", params.cmdname, params.imagefile, @@ -614,7 +613,6 @@ copy_file (int ifd, const char *datafile, int pad) } } - (void) munmap((void *)ptr, sbuf.st_size); (void) close (dfd); } -- 1.7.9.5 -- Julien Castets _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot