svn commit: r265548 - user/marcel/mkimg
Marcel Moolenaar
marcel at FreeBSD.org
Wed May 7 14:57:57 UTC 2014
Author: marcel
Date: Wed May 7 14:57:56 2014
New Revision: 265548
URL: http://svnweb.freebsd.org/changeset/base/265548
Log:
Eliminate mkimg_seek() by moving the lseek(2) calls into fdcopy().
While here, minimize use of the global tmpfd by passing it as ofd
to mkimg.
Modified:
user/marcel/mkimg/mkimg.c
Modified: user/marcel/mkimg/mkimg.c
==============================================================================
--- user/marcel/mkimg/mkimg.c Wed May 7 14:20:58 2014 (r265547)
+++ user/marcel/mkimg/mkimg.c Wed May 7 14:57:56 2014 (r265548)
@@ -269,14 +269,28 @@ sparse_write(int fd, const char *buf, si
#endif /* SPARSE_WRITE */
static int
-fdcopy(int src, int dst, uint64_t *count)
+fdcopy(int src, lba_t sblk, int dst, lba_t dblk, uint64_t *count)
{
char *buffer;
off_t ofs;
ssize_t rdsz, wrsz;
- /* A return value of -1 means that we can't write a sparse file. */
- ofs = lseek(dst, 0L, SEEK_CUR);
+ if (sblk != -1) {
+ ofs = sblk * secsz;
+ if (lseek(src, ofs, SEEK_SET) != ofs)
+ return (errno);
+ }
+
+ if (dblk != -1) {
+ ofs = dblk * secsz;
+ if (lseek(dst, ofs, SEEK_SET) != ofs)
+ return (errno);
+ } else
+ ofs = lseek(dst, 0L, SEEK_CUR);
+
+ /*
+ * We can't write a sparse file when ofs holds -1 at this point.
+ */
if (count != NULL)
*count = 0;
@@ -302,17 +316,6 @@ fdcopy(int src, int dst, uint64_t *count
return (errno);
}
-static int
-mkimg_seek(int fd, lba_t blk)
-{
- off_t off;
-
- off = blk * secsz;
- if (lseek(fd, off, SEEK_SET) != off)
- return (errno);
- return (0);
-}
-
int
mkimg_write(int fd, lba_t blk, void *buf, ssize_t len)
{
@@ -327,7 +330,7 @@ mkimg_write(int fd, lba_t blk, void *buf
}
static void
-mkimg(int bfd)
+mkimg(int ofd, int bfd)
{
FILE *fp;
struct part *part;
@@ -353,7 +356,6 @@ mkimg(int bfd)
fprintf(stderr, "partition %d: starting block %llu "
"... ", part->index + 1, (long long)block);
part->block = block;
- error = mkimg_seek(tmpfd, block);
switch (part->kind) {
case PART_KIND_SIZE:
if (expand_number(part->contents, &bytesize) == -1)
@@ -362,7 +364,7 @@ mkimg(int bfd)
case PART_KIND_FILE:
fd = open(part->contents, O_RDONLY, 0);
if (fd != -1) {
- error = fdcopy(fd, tmpfd, &bytesize);
+ error = fdcopy(fd, -1, ofd, block, &bytesize);
close(fd);
} else
error = errno;
@@ -370,7 +372,8 @@ mkimg(int bfd)
case PART_KIND_PIPE:
fp = popen(part->contents, "r");
if (fp != NULL) {
- error = fdcopy(fileno(fp), tmpfd, &bytesize);
+ fd = fileno(fp);
+ error = fdcopy(fd, -1, ofd, block, &bytesize);
pclose(fp);
} else
error = errno;
@@ -389,7 +392,7 @@ mkimg(int bfd)
}
block = scheme_metadata(SCHEME_META_IMG_END, block);
- error = (scheme_write(tmpfd, block));
+ error = (scheme_write(ofd, block));
}
int
@@ -497,15 +500,13 @@ main(int argc, char *argv[])
fprintf(stderr, "Number of heads: %u\n", nheads);
}
- mkimg(bcfd);
+ mkimg(tmpfd, bcfd);
if (verbose)
fprintf(stderr, "Number of cylinders: %u\n", ncyls);
if (tmpfd != outfd) {
- error = mkimg_seek(tmpfd, 0);
- if (error == 0)
- error = fdcopy(tmpfd, outfd, NULL);
+ error = fdcopy(tmpfd, 0, outfd, -1, NULL);
if (error)
errc(EX_IOERR, error, "writing to stdout");
}
More information about the svn-src-user
mailing list