Add the -c option for specifying the capacity of the disk image. When

a capcity is given, no partitions are required. When no partitions are
given, no scheme needs to be specified either. This makes it possible
to create an entirely empty disk image. To add an empty partitioning
table, specify the scheme.

Bump the version to 20150222.
This commit is contained in:
Marcel Moolenaar 2015-02-22 04:50:47 +00:00
parent 0a9ce08bc9
commit e6679c1a71
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=279139
3 changed files with 64 additions and 15 deletions

View File

@ -6,7 +6,7 @@ PROG= mkimg
SRCS= format.c image.c mkimg.c scheme.c
MAN= mkimg.1
MKIMG_VERSION=20141211
MKIMG_VERSION=20150222
mkimg.o: Makefile
CFLAGS+=-DMKIMG_VERSION=${MKIMG_VERSION}

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 27, 2014
.Dd February 22, 2015
.Dt MKIMG 1
.Os
.Sh NAME
@ -37,13 +37,12 @@
.Op Fl S Ar secsz
.Op Fl T Ar tracksz
.Op Fl b Ar bootcode
.Op Fl c Ar capacity
.Op Fl f Ar format
.Op Fl o Ar outfile
.Op Fl v
.Op Fl y
.Fl s Ar scheme
.Fl p Ar partition
.Op Fl p Ar partition ...
.Op Fl s Ar scheme Op Fl p Ar partition ...
.Nm
.Ar --formats | --schemes | --version
.Sh DESCRIPTION
@ -109,13 +108,29 @@ utility will use the (physical) block size to determine the start of
partitions and to round the size of the disk image.
.Pp
The
.Op Fl v
.Fl c
option can be used to specify a minimal capacity for the disk image.
Use this option without the
.Fl s
and
.Fl p
options to create an empty disk image with the given (virtual) size.
An empty partition table can be written to the disk when specifying a
partitioning scheme with the
.Fl s
option, but without specifying any partitions.
When the size required to for all the partitions is larger than the
given capacity, then the disk image will be larger than the capacity
given.
.Pp
The
.Fl v
option increases the level of output that the
.Nm
utility prints.
.Pp
The
.Op Fl y
.Fl y
option is used for testing purposes only and is not to be used in production.
When present, the
.Nm

View File

@ -60,6 +60,8 @@ static struct option longopts[] = {
{ NULL, 0, NULL, 0 }
};
static uint64_t capacity;
struct partlisthead partlist = STAILQ_HEAD_INITIALIZER(partlist);
u_int nparts = 0;
@ -147,6 +149,7 @@ usage(const char *why)
fprintf(stderr, "\t--version\t- show version information\n");
fputc('\n', stderr);
fprintf(stderr, "\t-b <file>\t- file containing boot code\n");
fprintf(stderr, "\t-c <num>\t- capacity (in bytes) of the disk\n");
fprintf(stderr, "\t-f <format>\n");
fprintf(stderr, "\t-o <file>\t- file to write image into\n");
fprintf(stderr, "\t-p <partition>\n");
@ -179,7 +182,7 @@ usage(const char *why)
}
static int
parse_number(u_int *valp, u_int min, u_int max, const char *arg)
parse_uint32(uint32_t *valp, uint32_t min, uint32_t max, const char *arg)
{
uint64_t val;
@ -187,7 +190,20 @@ parse_number(u_int *valp, u_int min, u_int max, const char *arg)
return (errno);
if (val > UINT_MAX || val < (uint64_t)min || val > (uint64_t)max)
return (EINVAL);
*valp = (u_int)val;
*valp = (uint32_t)val;
return (0);
}
static int
parse_uint64(uint64_t *valp, uint64_t min, uint64_t max, const char *arg)
{
uint64_t val;
if (expand_number(arg, &val) == -1)
return (errno);
if (val < min || val > max)
return (EINVAL);
*valp = val;
return (0);
}
@ -376,6 +392,17 @@ mkimg_uuid(struct uuid *uuid)
memcpy(uuid, gen, sizeof(uuid_t));
}
static int
capacity_resize(lba_t end)
{
lba_t capsz;
capsz = (capacity + secsz - 1) / secsz;
if (end >= capsz)
return (0);
return (image_set_size(capsz));
}
static void
mkimg(void)
{
@ -436,6 +463,8 @@ mkimg(void)
block = scheme_metadata(SCHEME_META_IMG_END, block);
error = image_set_size(block);
if (!error)
error = capacity_resize(block);
if (!error)
error = format_resize(block);
if (error)
@ -455,7 +484,7 @@ main(int argc, char *argv[])
bcfd = -1;
outfd = 1; /* Write to stdout by default */
while ((c = getopt_long(argc, argv, "b:f:o:p:s:vyH:P:S:T:",
while ((c = getopt_long(argc, argv, "b:c:f:o:p:s:vyH:P:S:T:",
longopts, NULL)) != -1) {
switch (c) {
case 'b': /* BOOT CODE */
@ -465,6 +494,11 @@ main(int argc, char *argv[])
if (bcfd == -1)
err(EX_UNAVAILABLE, "%s", optarg);
break;
case 'c': /* CAPACITY */
error = parse_uint64(&capacity, 1, OFF_MAX, optarg);
if (error)
errc(EX_DATAERR, error, "capacity in bytes");
break;
case 'f': /* OUTPUT FORMAT */
if (format_selected() != NULL)
usage("multiple formats given");
@ -499,26 +533,26 @@ main(int argc, char *argv[])
verbose++;
break;
case 'H': /* GEOMETRY: HEADS */
error = parse_number(&nheads, 1, 255, optarg);
error = parse_uint32(&nheads, 1, 255, optarg);
if (error)
errc(EX_DATAERR, error, "number of heads");
break;
case 'P': /* GEOMETRY: PHYSICAL SECTOR SIZE */
error = parse_number(&blksz, 512, INT_MAX+1U, optarg);
error = parse_uint32(&blksz, 512, INT_MAX+1U, optarg);
if (error == 0 && !pwr_of_two(blksz))
error = EINVAL;
if (error)
errc(EX_DATAERR, error, "physical sector size");
break;
case 'S': /* GEOMETRY: LOGICAL SECTOR SIZE */
error = parse_number(&secsz, 512, INT_MAX+1U, optarg);
error = parse_uint32(&secsz, 512, INT_MAX+1U, optarg);
if (error == 0 && !pwr_of_two(secsz))
error = EINVAL;
if (error)
errc(EX_DATAERR, error, "logical sector size");
break;
case 'T': /* GEOMETRY: TRACK SIZE */
error = parse_number(&nsecs, 1, 63, optarg);
error = parse_uint32(&nsecs, 1, 63, optarg);
if (error)
errc(EX_DATAERR, error, "track size");
break;
@ -543,7 +577,7 @@ main(int argc, char *argv[])
usage("trailing arguments");
if (scheme_selected() == NULL && nparts > 0)
usage("no scheme");
if (nparts == 0)
if (nparts == 0 && capacity == 0)
usage("no partitions");
if (secsz > blksz) {