svn commit: r328976 - in stable/11/usr.bin/mkimg: . tests
Emmanuel Vadot
manu at FreeBSD.org
Wed Feb 7 16:45:40 UTC 2018
Author: manu
Date: Wed Feb 7 16:45:38 2018
New Revision: 328976
URL: https://svnweb.freebsd.org/changeset/base/328976
Log:
Revert r328974, r307387 was not supposed to be part of it.
Deleted:
stable/11/usr.bin/mkimg/endian.h
stable/11/usr.bin/mkimg/uuid.c
Modified:
stable/11/usr.bin/mkimg/Makefile
stable/11/usr.bin/mkimg/apm.c
stable/11/usr.bin/mkimg/bsd.c
stable/11/usr.bin/mkimg/ebr.c
stable/11/usr.bin/mkimg/format.c
stable/11/usr.bin/mkimg/format.h
stable/11/usr.bin/mkimg/gpt.c
stable/11/usr.bin/mkimg/image.c
stable/11/usr.bin/mkimg/mbr.c
stable/11/usr.bin/mkimg/mkimg.1
stable/11/usr.bin/mkimg/mkimg.c
stable/11/usr.bin/mkimg/mkimg.h
stable/11/usr.bin/mkimg/pc98.c
stable/11/usr.bin/mkimg/qcow.c
stable/11/usr.bin/mkimg/raw.c
stable/11/usr.bin/mkimg/scheme.c
stable/11/usr.bin/mkimg/scheme.h
stable/11/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow2.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-4096-gpt.raw.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-4096-gpt.vhd.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-4096-gpt.vhdf.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-4096-gpt.vmdk.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-512-gpt.qcow.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-512-gpt.qcow2.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-512-gpt.raw.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-512-gpt.vhd.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-512-gpt.vhdf.gz.uu
stable/11/usr.bin/mkimg/tests/img-1x1-512-gpt.vmdk.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-4096-gpt.qcow.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-4096-gpt.qcow2.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-4096-gpt.raw.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-4096-gpt.vhd.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-4096-gpt.vhdf.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-4096-gpt.vmdk.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-512-gpt.qcow.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-512-gpt.qcow2.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-512-gpt.raw.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-512-gpt.vhd.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-512-gpt.vhdf.gz.uu
stable/11/usr.bin/mkimg/tests/img-63x255-512-gpt.vmdk.gz.uu
stable/11/usr.bin/mkimg/vhd.c
stable/11/usr.bin/mkimg/vmdk.c
stable/11/usr.bin/mkimg/vtoc8.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/usr.bin/mkimg/Makefile
==============================================================================
--- stable/11/usr.bin/mkimg/Makefile Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/Makefile Wed Feb 7 16:45:38 2018 (r328976)
@@ -3,15 +3,14 @@
.include <src.opts.mk>
PROG= mkimg
-SRCS= format.c image.c mkimg.c scheme.c uuid.c
+SRCS= format.c image.c mkimg.c scheme.c
MAN= mkimg.1
-MKIMG_VERSION=20161016
+MKIMG_VERSION=20151211
mkimg.o: Makefile
CFLAGS+=-DMKIMG_VERSION=${MKIMG_VERSION}
CFLAGS+=-DSPARSE_WRITE
-CFLAGS+=-I${SRCTOP}/sys/sys/disk
# List of formats to support
SRCS+= \
Modified: stable/11/usr.bin/mkimg/apm.c
==============================================================================
--- stable/11/usr.bin/mkimg/apm.c Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/apm.c Wed Feb 7 16:45:38 2018 (r328976)
@@ -27,19 +27,25 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/apm.h>
+#include <sys/endian.h>
#include <sys/errno.h>
-#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <sys/apm.h>
-
-#include "endian.h"
#include "image.h"
#include "mkimg.h"
#include "scheme.h"
+#ifndef APM_ENT_TYPE_APPLE_BOOT
+#define APM_ENT_TYPE_APPLE_BOOT "Apple_Bootstrap"
+#endif
+#ifndef APM_ENT_TYPE_FREEBSD_NANDFS
+#define APM_ENT_TYPE_FREEBSD_NANDFS "FreeBSD-nandfs"
+#endif
+
static struct mkimg_alias apm_aliases[] = {
{ ALIAS_FREEBSD, ALIAS_PTR2TYPE(APM_ENT_TYPE_FREEBSD) },
{ ALIAS_FREEBSD_BOOT, ALIAS_PTR2TYPE(APM_ENT_TYPE_APPLE_BOOT) },
@@ -85,7 +91,7 @@ apm_write(lba_t imgsz, void *bootcode __unused)
strncpy(ent->ent_type, APM_ENT_TYPE_SELF, sizeof(ent->ent_type));
strncpy(ent->ent_name, "Apple", sizeof(ent->ent_name));
- TAILQ_FOREACH(part, &partlist, link) {
+ STAILQ_FOREACH(part, &partlist, link) {
ent = (void *)(buf + (part->index + 2) * secsz);
be16enc(&ent->ent_sig, APM_ENT_SIG);
be32enc(&ent->ent_pmblkcnt, nparts + 1);
Modified: stable/11/usr.bin/mkimg/bsd.c
==============================================================================
--- stable/11/usr.bin/mkimg/bsd.c Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/bsd.c Wed Feb 7 16:45:38 2018 (r328976)
@@ -27,19 +27,22 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/disklabel.h>
+#include <sys/endian.h>
#include <sys/errno.h>
-#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <sys/disklabel.h>
-
-#include "endian.h"
#include "image.h"
#include "mkimg.h"
#include "scheme.h"
+#ifndef FS_NANDFS
+#define FS_NANDFS 30
+#endif
+
static struct mkimg_alias bsd_aliases[] = {
{ ALIAS_FREEBSD_NANDFS, ALIAS_INT2TYPE(FS_NANDFS) },
{ ALIAS_FREEBSD_SWAP, ALIAS_INT2TYPE(FS_SWAP) },
@@ -54,7 +57,7 @@ bsd_metadata(u_int where, lba_t blk)
{
if (where == SCHEME_META_IMG_START)
- blk += BSD_BOOTBLOCK_SIZE / secsz;
+ blk += BBSIZE / secsz;
else if (where == SCHEME_META_IMG_END)
blk = round_cylinder(blk);
else
@@ -72,21 +75,21 @@ bsd_write(lba_t imgsz, void *bootcode)
int bsdparts, error, n;
uint16_t checksum;
- buf = malloc(BSD_BOOTBLOCK_SIZE);
+ buf = malloc(BBSIZE);
if (buf == NULL)
return (ENOMEM);
if (bootcode != NULL) {
- memcpy(buf, bootcode, BSD_BOOTBLOCK_SIZE);
+ memcpy(buf, bootcode, BBSIZE);
memset(buf + secsz, 0, sizeof(struct disklabel));
} else
- memset(buf, 0, BSD_BOOTBLOCK_SIZE);
+ memset(buf, 0, BBSIZE);
bsdparts = nparts + 1; /* Account for c partition */
- if (bsdparts < BSD_NPARTS_MIN)
- bsdparts = BSD_NPARTS_MIN;
+ if (bsdparts < MAXPARTITIONS)
+ bsdparts = MAXPARTITIONS;
d = (void *)(buf + secsz);
- le32enc(&d->d_magic, BSD_MAGIC);
+ le32enc(&d->d_magic, DISKMAGIC);
le32enc(&d->d_secsize, secsz);
le32enc(&d->d_nsectors, nsecs);
le32enc(&d->d_ntracks, nheads);
@@ -94,14 +97,14 @@ bsd_write(lba_t imgsz, void *bootcode)
le32enc(&d->d_secpercyl, nsecs * nheads);
le32enc(&d->d_secperunit, imgsz);
le16enc(&d->d_rpm, 3600);
- le32enc(&d->d_magic2, BSD_MAGIC);
+ le32enc(&d->d_magic2, DISKMAGIC);
le16enc(&d->d_npartitions, bsdparts);
- le32enc(&d->d_bbsize, BSD_BOOTBLOCK_SIZE);
+ le32enc(&d->d_bbsize, BBSIZE);
- dp = &d->d_partitions[BSD_PART_RAW];
+ dp = &d->d_partitions[RAW_PART];
le32enc(&dp->p_size, imgsz);
- TAILQ_FOREACH(part, &partlist, link) {
- n = part->index + ((part->index >= BSD_PART_RAW) ? 1 : 0);
+ STAILQ_FOREACH(part, &partlist, link) {
+ n = part->index + ((part->index >= RAW_PART) ? 1 : 0);
dp = &d->d_partitions[n];
le32enc(&dp->p_size, part->size);
le32enc(&dp->p_offset, part->block);
@@ -117,7 +120,7 @@ bsd_write(lba_t imgsz, void *bootcode)
checksum ^= le16dec(p);
le16enc(&d->d_checksum, checksum);
- error = image_write(0, buf, BSD_BOOTBLOCK_SIZE / secsz);
+ error = image_write(0, buf, BBSIZE / secsz);
free(buf);
return (error);
}
@@ -128,8 +131,8 @@ static struct mkimg_scheme bsd_scheme = {
.aliases = bsd_aliases,
.metadata = bsd_metadata,
.write = bsd_write,
- .nparts = BSD_NPARTS_MAX - 1,
- .bootcode = BSD_BOOTBLOCK_SIZE,
+ .nparts = 19,
+ .bootcode = BBSIZE,
.maxsecsz = 512
};
Modified: stable/11/usr.bin/mkimg/ebr.c
==============================================================================
--- stable/11/usr.bin/mkimg/ebr.c Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/ebr.c Wed Feb 7 16:45:38 2018 (r328976)
@@ -27,21 +27,27 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/diskmbr.h>
+#include <sys/endian.h>
#include <sys/errno.h>
-#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <sys/diskmbr.h>
-
-#include "endian.h"
#include "image.h"
#include "mkimg.h"
#include "scheme.h"
+#ifndef DOSPTYP_FAT16B
+#define DOSPTYP_FAT16B 0x06
+#endif
+#ifndef DOSPTYP_FAT32
+#define DOSPTYP_FAT32 0x0b
+#endif
+
static struct mkimg_alias ebr_aliases[] = {
- { ALIAS_FAT16B, ALIAS_INT2TYPE(DOSPTYP_FAT16) },
+ { ALIAS_FAT16B, ALIAS_INT2TYPE(DOSPTYP_FAT16B) },
{ ALIAS_FAT32, ALIAS_INT2TYPE(DOSPTYP_FAT32) },
{ ALIAS_FREEBSD, ALIAS_INT2TYPE(DOSPTYP_386BSD) },
{ ALIAS_NONE, 0 }
@@ -82,7 +88,7 @@ ebr_write(lba_t imgsz __unused, void *bootcode __unuse
le16enc(ebr + DOSMAGICOFFSET, DOSMAGIC);
error = 0;
- TAILQ_FOREACH(part, &partlist, link) {
+ STAILQ_FOREACH_SAFE(part, &partlist, link, next) {
block = part->block - nsecs;
size = round_track(part->size);
dp = (void *)(ebr + DOSPARTOFF);
@@ -94,7 +100,6 @@ ebr_write(lba_t imgsz __unused, void *bootcode __unuse
le32enc(&dp->dp_size, size);
/* Add link entry */
- next = TAILQ_NEXT(part, link);
if (next != NULL) {
size = round_track(next->size);
dp++;
Modified: stable/11/usr.bin/mkimg/format.c
==============================================================================
--- stable/11/usr.bin/mkimg/format.c Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/format.c Wed Feb 7 16:45:38 2018 (r328976)
@@ -27,6 +27,9 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/linker_set.h>
+#include <sys/queue.h>
#include <sys/stat.h>
#include <err.h>
#include <errno.h>
@@ -39,24 +42,8 @@ __FBSDID("$FreeBSD$");
#include "format.h"
#include "mkimg.h"
-static struct mkimg_format *first;
static struct mkimg_format *format;
-struct mkimg_format *
-format_iterate(struct mkimg_format *f)
-{
-
- return ((f == NULL) ? first : f->next);
-}
-
-void
-format_register(struct mkimg_format *f)
-{
-
- f->next = first;
- first = f;
-}
-
int
format_resize(lba_t end)
{
@@ -69,10 +56,10 @@ format_resize(lba_t end)
int
format_select(const char *spec)
{
- struct mkimg_format *f;
+ struct mkimg_format *f, **iter;
- f = NULL;
- while ((f = format_iterate(f)) != NULL) {
+ SET_FOREACH(iter, formats) {
+ f = *iter;
if (strcasecmp(spec, f->name) == 0) {
format = f;
return (0);
Modified: stable/11/usr.bin/mkimg/format.h
==============================================================================
--- stable/11/usr.bin/mkimg/format.h Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/format.h Wed Feb 7 16:45:38 2018 (r328976)
@@ -29,24 +29,21 @@
#ifndef _MKIMG_FORMAT_H_
#define _MKIMG_FORMAT_H_
+#include <sys/linker_set.h>
+
struct mkimg_format {
- struct mkimg_format *next;
const char *name;
const char *description;
int (*resize)(lba_t);
int (*write)(int);
};
-#define FORMAT_DEFINE(nm) \
-static void format_register_##nm(void) __attribute__((constructor)); \
-static void format_register_##nm(void) { format_register(&nm); }
+SET_DECLARE(formats, struct mkimg_format);
+#define FORMAT_DEFINE(nm) DATA_SET(formats, nm)
-struct mkimg_format *format_iterate(struct mkimg_format *);
-void format_register(struct mkimg_format *);
+int format_resize(lba_t);
int format_select(const char *);
struct mkimg_format *format_selected(void);
-
-int format_resize(lba_t);
int format_write(int);
#endif /* _MKIMG_FORMAT_H_ */
Modified: stable/11/usr.bin/mkimg/gpt.c
==============================================================================
--- stable/11/usr.bin/mkimg/gpt.c Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/gpt.c Wed Feb 7 16:45:38 2018 (r328976)
@@ -27,32 +27,38 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/diskmbr.h>
+#include <sys/endian.h>
#include <sys/errno.h>
+#include <sys/gpt.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <uuid.h>
-#include <sys/diskmbr.h>
-#include <sys/gpt.h>
-
-#include "endian.h"
#include "image.h"
#include "mkimg.h"
#include "scheme.h"
-static mkimg_uuid_t gpt_uuid_efi = GPT_ENT_TYPE_EFI;
-static mkimg_uuid_t gpt_uuid_freebsd = GPT_ENT_TYPE_FREEBSD;
-static mkimg_uuid_t gpt_uuid_freebsd_boot = GPT_ENT_TYPE_FREEBSD_BOOT;
-static mkimg_uuid_t gpt_uuid_freebsd_nandfs = GPT_ENT_TYPE_FREEBSD_NANDFS;
-static mkimg_uuid_t gpt_uuid_freebsd_swap = GPT_ENT_TYPE_FREEBSD_SWAP;
-static mkimg_uuid_t gpt_uuid_freebsd_ufs = GPT_ENT_TYPE_FREEBSD_UFS;
-static mkimg_uuid_t gpt_uuid_freebsd_vinum = GPT_ENT_TYPE_FREEBSD_VINUM;
-static mkimg_uuid_t gpt_uuid_freebsd_zfs = GPT_ENT_TYPE_FREEBSD_ZFS;
-static mkimg_uuid_t gpt_uuid_mbr = GPT_ENT_TYPE_MBR;
-static mkimg_uuid_t gpt_uuid_ms_basic_data = GPT_ENT_TYPE_MS_BASIC_DATA;
+#ifndef GPT_ENT_TYPE_FREEBSD_NANDFS
+#define GPT_ENT_TYPE_FREEBSD_NANDFS \
+ {0x74ba7dd9,0xa689,0x11e1,0xbd,0x04,{0x00,0xe0,0x81,0x28,0x6a,0xcf}}
+#endif
+static uuid_t gpt_uuid_efi = GPT_ENT_TYPE_EFI;
+static uuid_t gpt_uuid_freebsd = GPT_ENT_TYPE_FREEBSD;
+static uuid_t gpt_uuid_freebsd_boot = GPT_ENT_TYPE_FREEBSD_BOOT;
+static uuid_t gpt_uuid_freebsd_nandfs = GPT_ENT_TYPE_FREEBSD_NANDFS;
+static uuid_t gpt_uuid_freebsd_swap = GPT_ENT_TYPE_FREEBSD_SWAP;
+static uuid_t gpt_uuid_freebsd_ufs = GPT_ENT_TYPE_FREEBSD_UFS;
+static uuid_t gpt_uuid_freebsd_vinum = GPT_ENT_TYPE_FREEBSD_VINUM;
+static uuid_t gpt_uuid_freebsd_zfs = GPT_ENT_TYPE_FREEBSD_ZFS;
+static uuid_t gpt_uuid_mbr = GPT_ENT_TYPE_MBR;
+static uuid_t gpt_uuid_ms_basic_data = GPT_ENT_TYPE_MS_BASIC_DATA;
+
static struct mkimg_alias gpt_aliases[] = {
{ ALIAS_EFI, ALIAS_PTR2TYPE(&gpt_uuid_efi) },
{ ALIAS_FREEBSD, ALIAS_PTR2TYPE(&gpt_uuid_freebsd) },
@@ -125,6 +131,21 @@ crc32(const void *buf, size_t sz)
return (crc ^ ~0U);
}
+static void
+gpt_uuid_enc(void *buf, const uuid_t *uuid)
+{
+ uint8_t *p = buf;
+ int i;
+
+ le32enc(p, uuid->time_low);
+ le16enc(p + 4, uuid->time_mid);
+ le16enc(p + 6, uuid->time_hi_and_version);
+ p[8] = uuid->clock_seq_hi_and_reserved;
+ p[9] = uuid->clock_seq_low;
+ for (i = 0; i < _UUID_NODE_LEN; i++)
+ p[10 + i] = uuid->node[i];
+}
+
static u_int
gpt_tblsz(void)
{
@@ -152,7 +173,7 @@ gpt_write_pmbr(lba_t blks, void *bootcode)
uint32_t secs;
int error;
- secs = (blks > UINT32_MAX) ? UINT32_MAX : (uint32_t)blks - 1;
+ secs = (blks > UINT32_MAX) ? UINT32_MAX : (uint32_t)blks;
pmbr = malloc(secsz);
if (pmbr == NULL)
@@ -178,7 +199,7 @@ gpt_write_pmbr(lba_t blks, void *bootcode)
static struct gpt_ent *
gpt_mktbl(u_int tblsz)
{
- mkimg_uuid_t uuid;
+ uuid_t uuid;
struct gpt_ent *tbl, *ent;
struct part *part;
int c, idx;
@@ -187,11 +208,11 @@ gpt_mktbl(u_int tblsz)
if (tbl == NULL)
return (NULL);
- TAILQ_FOREACH(part, &partlist, link) {
+ STAILQ_FOREACH(part, &partlist, link) {
ent = tbl + part->index;
- mkimg_uuid_enc(&ent->ent_type, ALIAS_TYPE2PTR(part->type));
+ gpt_uuid_enc(&ent->ent_type, ALIAS_TYPE2PTR(part->type));
mkimg_uuid(&uuid);
- mkimg_uuid_enc(&ent->ent_uuid, &uuid);
+ gpt_uuid_enc(&ent->ent_uuid, &uuid);
le64enc(&ent->ent_lba_start, part->block);
le64enc(&ent->ent_lba_end, part->block + part->size - 1);
if (part->label != NULL) {
@@ -222,7 +243,7 @@ gpt_write_hdr(struct gpt_hdr *hdr, uint64_t self, uint
static int
gpt_write(lba_t imgsz, void *bootcode)
{
- mkimg_uuid_t uuid;
+ uuid_t uuid;
struct gpt_ent *tbl;
struct gpt_hdr *hdr;
uint32_t crc;
@@ -259,7 +280,7 @@ gpt_write(lba_t imgsz, void *bootcode)
le64enc(&hdr->hdr_lba_start, 2 + tblsz);
le64enc(&hdr->hdr_lba_end, imgsz - tblsz - 2);
mkimg_uuid(&uuid);
- mkimg_uuid_enc(&hdr->hdr_uuid, &uuid);
+ gpt_uuid_enc(&hdr->hdr_uuid, &uuid);
le32enc(&hdr->hdr_entries, nparts);
le32enc(&hdr->hdr_entsz, sizeof(struct gpt_ent));
crc = crc32(tbl, nparts * sizeof(struct gpt_ent));
Modified: stable/11/usr.bin/mkimg/image.c
==============================================================================
--- stable/11/usr.bin/mkimg/image.c Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/image.c Wed Feb 7 16:45:38 2018 (r328976)
@@ -28,7 +28,9 @@
__FBSDID("$FreeBSD$");
#include <sys/mman.h>
+#include <sys/queue.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <assert.h>
#include <err.h>
#include <errno.h>
@@ -43,22 +45,8 @@ __FBSDID("$FreeBSD$");
#include "image.h"
#include "mkimg.h"
-#ifndef MAP_NOCORE
-#define MAP_NOCORE 0
-#endif
-#ifndef MAP_NOSYNC
-#define MAP_NOSYNC 0
-#endif
-
-#ifndef SEEK_DATA
-#define SEEK_DATA -1
-#endif
-#ifndef SEEK_HOLE
-#define SEEK_HOLE -1
-#endif
-
struct chunk {
- TAILQ_ENTRY(chunk) ch_list;
+ STAILQ_ENTRY(chunk) ch_list;
size_t ch_size; /* Size of chunk in bytes. */
lba_t ch_block; /* Block address in image. */
union {
@@ -76,7 +64,7 @@ struct chunk {
#define CH_TYPE_MEMORY 2 /* Memory-backed chunk */
};
-static TAILQ_HEAD(chunk_head, chunk) image_chunks;
+static STAILQ_HEAD(chunk_head, chunk) image_chunks;
static u_int image_nchunks;
static char image_swap_file[PATH_MAX];
@@ -137,14 +125,14 @@ image_chunk_find(lba_t blk)
struct chunk *ch;
ch = (last != NULL && last->ch_block <= blk)
- ? last : TAILQ_FIRST(&image_chunks);
+ ? last : STAILQ_FIRST(&image_chunks);
while (ch != NULL) {
if (ch->ch_block <= blk &&
(lba_t)(ch->ch_block + (ch->ch_size / secsz)) > blk) {
last = ch;
break;
}
- ch = TAILQ_NEXT(ch, ch_list);
+ ch = STAILQ_NEXT(ch, ch_list);
}
return (ch);
}
@@ -186,7 +174,7 @@ image_chunk_memory(struct chunk *ch, lba_t blk)
ch->ch_size = (blk - ch->ch_block) * secsz;
new->ch_block = blk;
new->ch_size -= ch->ch_size;
- TAILQ_INSERT_AFTER(&image_chunks, ch, new, ch_list);
+ STAILQ_INSERT_AFTER(&image_chunks, ch, new, ch_list);
image_nchunks++;
ch = new;
}
@@ -201,7 +189,7 @@ image_chunk_memory(struct chunk *ch, lba_t blk)
ch->ch_size = secsz;
new->ch_block++;
new->ch_size -= secsz;
- TAILQ_INSERT_AFTER(&image_chunks, ch, new, ch_list);
+ STAILQ_INSERT_AFTER(&image_chunks, ch, new, ch_list);
image_nchunks++;
}
@@ -217,7 +205,7 @@ image_chunk_skipto(lba_t to)
lba_t from;
size_t sz;
- ch = TAILQ_LAST(&image_chunks, chunk_head);
+ ch = STAILQ_LAST(&image_chunks, chunk, ch_list);
from = (ch != NULL) ? ch->ch_block + (ch->ch_size / secsz) : 0LL;
assert(from <= to);
@@ -242,7 +230,7 @@ image_chunk_skipto(lba_t to)
ch->ch_block = from;
ch->ch_size = sz;
ch->ch_type = CH_TYPE_ZEROES;
- TAILQ_INSERT_TAIL(&image_chunks, ch, ch_list);
+ STAILQ_INSERT_TAIL(&image_chunks, ch, ch_list);
image_nchunks++;
return (0);
}
@@ -252,7 +240,7 @@ image_chunk_append(lba_t blk, size_t sz, off_t ofs, in
{
struct chunk *ch;
- ch = TAILQ_LAST(&image_chunks, chunk_head);
+ ch = STAILQ_LAST(&image_chunks, chunk, ch_list);
if (ch != NULL && ch->ch_type == CH_TYPE_FILE) {
if (fd == ch->ch_u.file.fd &&
blk == (lba_t)(ch->ch_block + (ch->ch_size / secsz)) &&
@@ -273,7 +261,7 @@ image_chunk_append(lba_t blk, size_t sz, off_t ofs, in
ch->ch_type = CH_TYPE_FILE;
ch->ch_u.file.ofs = ofs;
ch->ch_u.file.fd = fd;
- TAILQ_INSERT_TAIL(&image_chunks, ch, ch_list);
+ STAILQ_INSERT_TAIL(&image_chunks, ch, ch_list);
image_nchunks++;
return (0);
}
@@ -468,7 +456,8 @@ image_copyin_mapped(lba_t blk, int fd, uint64_t *sizep
* I don't know what this means or whether it
* can happen at all...
*/
- assert(0);
+ error = EDOOFUS;
+ break;
}
}
if (error)
@@ -594,13 +583,10 @@ image_copyout_region(int fd, lba_t blk, lba_t size)
size *= secsz;
- error = 0;
- while (!error && size > 0) {
+ while (size > 0) {
ch = image_chunk_find(blk);
- if (ch == NULL) {
- error = EINVAL;
- break;
- }
+ if (ch == NULL)
+ return (EINVAL);
ofs = (blk - ch->ch_block) * secsz;
sz = ch->ch_size - ofs;
sz = ((lba_t)sz < size) ? sz : (size_t)size;
@@ -616,12 +602,12 @@ image_copyout_region(int fd, lba_t blk, lba_t size)
error = image_copyout_memory(fd, sz, ch->ch_u.mem.ptr);
break;
default:
- assert(0);
+ return (EDOOFUS);
}
size -= sz;
blk += sz / secsz;
}
- return (error);
+ return (0);
}
int
@@ -696,7 +682,7 @@ image_cleanup(void)
{
struct chunk *ch;
- while ((ch = TAILQ_FIRST(&image_chunks)) != NULL) {
+ while ((ch = STAILQ_FIRST(&image_chunks)) != NULL) {
switch (ch->ch_type) {
case CH_TYPE_FILE:
/* We may be closing the same file multiple times. */
@@ -709,7 +695,7 @@ image_cleanup(void)
default:
break;
}
- TAILQ_REMOVE(&image_chunks, ch, ch_list);
+ STAILQ_REMOVE_HEAD(&image_chunks, ch_list);
free(ch);
}
if (image_swap_fd != -1)
@@ -722,7 +708,7 @@ image_init(void)
{
const char *tmpdir;
- TAILQ_INIT(&image_chunks);
+ STAILQ_INIT(&image_chunks);
image_nchunks = 0;
image_swap_size = 0;
Modified: stable/11/usr.bin/mkimg/mbr.c
==============================================================================
--- stable/11/usr.bin/mkimg/mbr.c Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/mbr.c Wed Feb 7 16:45:38 2018 (r328976)
@@ -27,23 +27,35 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/diskmbr.h>
+#include <sys/endian.h>
#include <sys/errno.h>
-#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <sys/diskmbr.h>
-
-#include "endian.h"
#include "image.h"
#include "mkimg.h"
#include "scheme.h"
+#ifndef DOSPTYP_FAT16B
+#define DOSPTYP_FAT16B 0x06
+#endif
+#ifndef DOSPTYP_FAT32
+#define DOSPTYP_FAT32 0x0b
+#endif
+#ifndef DOSPTYP_PPCBOOT
+#define DOSPTYP_PPCBOOT 0x41
+#endif
+#ifndef DOSPTYP_EFI
+#define DOSPTYP_EFI 0xef
+#endif
+
static struct mkimg_alias mbr_aliases[] = {
{ ALIAS_EBR, ALIAS_INT2TYPE(DOSPTYP_EXT) },
{ ALIAS_EFI, ALIAS_INT2TYPE(DOSPTYP_EFI) },
- { ALIAS_FAT16B, ALIAS_INT2TYPE(DOSPTYP_FAT16) },
+ { ALIAS_FAT16B, ALIAS_INT2TYPE(DOSPTYP_FAT16B) },
{ ALIAS_FAT32, ALIAS_INT2TYPE(DOSPTYP_FAT32) },
{ ALIAS_FREEBSD, ALIAS_INT2TYPE(DOSPTYP_386BSD) },
{ ALIAS_NTFS, ALIAS_INT2TYPE(DOSPTYP_NTFS) },
@@ -89,15 +101,10 @@ mbr_write(lba_t imgsz __unused, void *bootcode)
memset(mbr, 0, secsz);
le16enc(mbr + DOSMAGICOFFSET, DOSMAGIC);
dpbase = (void *)(mbr + DOSPARTOFF);
- TAILQ_FOREACH(part, &partlist, link) {
+ STAILQ_FOREACH(part, &partlist, link) {
size = round_track(part->size);
dp = dpbase + part->index;
- if (active_partition != 0)
- dp->dp_flag =
- (part->index + 1 == active_partition) ? 0x80 : 0;
- else
- dp->dp_flag =
- (part->index == 0 && bootcode != NULL) ? 0x80 : 0;
+ dp->dp_flag = (part->index == 0 && bootcode != NULL) ? 0x80 : 0;
mbr_chs(&dp->dp_scyl, &dp->dp_shd, &dp->dp_ssect,
part->block);
dp->dp_typ = ALIAS_TYPE2INT(part->type);
Modified: stable/11/usr.bin/mkimg/mkimg.1
==============================================================================
--- stable/11/usr.bin/mkimg/mkimg.1 Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/mkimg.1 Wed Feb 7 16:45:38 2018 (r328976)
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 26, 2017
+.Dd August 7, 2015
.Dt MKIMG 1
.Os
.Sh NAME
@@ -37,12 +37,9 @@
.Op Fl S Ar secsz
.Op Fl T Ar tracksz
.Op Fl b Ar bootcode
-.Op Fl c Ar min_capacity
-.Op Fl C Ar max_capacity
-.Op Fl -capacity Ar capacity
+.Op Fl c Ar capacity
.Op Fl f Ar format
.Op Fl o Ar outfile
-.Op Fl a Ar active
.Op Fl v
.Op Fl y
.Op Fl s Ar scheme Op Fl p Ar partition ...
@@ -122,23 +119,11 @@ An empty partition table can be written to the disk wh
partitioning scheme with the
.Fl s
option, but without specifying any partitions.
-When the size required for all the partitions is larger than the
+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 C
-option specifies a maximum capacity for the disk image.
-If the combined sizes of the given partitions exceed the size given with
-.Fl C ,
-image creation fails.
-.Pp
-The
-.Fl -capacity
-option is a shorthand to specify the minimum and maximum capacity at the
-same time.
-.Pp
-The
.Fl v
option increases the level of output that the
.Nm
@@ -153,26 +138,6 @@ utility will generate predictable values for Universal
(UUIDs) and time stamps so that consecutive runs of the
.Nm
utility will create images that are identical.
-.Pp
-The
-.Ar active
-option marks a partition as active, if the partitioning
-scheme supports it.
-Currently, only the
-.Ar mbr
-scheme supports this concept.
-By default,
-.Nm
-will only mark the first partition as active when boot code is
-specified.
-Use the
-.Ar active
-option to override the active partition.
-The number specified corresponds to the number after the 's' in the
-partition's
-.Xr geom 8
-name.
-No partitions are marked active when the value is 0.
.Pp
A set of long options exist to query about the
.Nm
Modified: stable/11/usr.bin/mkimg/mkimg.c
==============================================================================
--- stable/11/usr.bin/mkimg/mkimg.c Wed Feb 7 16:28:26 2018 (r328975)
+++ stable/11/usr.bin/mkimg/mkimg.c Wed Feb 7 16:45:38 2018 (r328976)
@@ -27,15 +27,17 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
+#include <sys/linker_set.h>
+#include <sys/queue.h>
#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/uuid.h>
#include <errno.h>
#include <err.h>
#include <fcntl.h>
#include <getopt.h>
#include <libutil.h>
#include <limits.h>
-#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -47,23 +49,20 @@ __FBSDID("$FreeBSD$");
#include "mkimg.h"
#include "scheme.h"
-#define LONGOPT_FORMATS 0x01000001
-#define LONGOPT_SCHEMES 0x01000002
-#define LONGOPT_VERSION 0x01000003
-#define LONGOPT_CAPACITY 0x01000004
+#define LONGOPT_FORMATS 0x01000001
+#define LONGOPT_SCHEMES 0x01000002
+#define LONGOPT_VERSION 0x01000003
static struct option longopts[] = {
{ "formats", no_argument, NULL, LONGOPT_FORMATS },
{ "schemes", no_argument, NULL, LONGOPT_SCHEMES },
{ "version", no_argument, NULL, LONGOPT_VERSION },
- { "capacity", required_argument, NULL, LONGOPT_CAPACITY },
{ NULL, 0, NULL, 0 }
};
-static uint64_t min_capacity = 0;
-static uint64_t max_capacity = 0;
+static uint64_t capacity;
-struct partlisthead partlist = TAILQ_HEAD_INITIALIZER(partlist);
+struct partlisthead partlist = STAILQ_HEAD_INITIALIZER(partlist);
u_int nparts = 0;
u_int unit_testing;
@@ -74,25 +73,24 @@ u_int nheads = 1;
u_int nsecs = 1;
u_int secsz = 512;
u_int blksz = 0;
-uint32_t active_partition = 0;
static void
print_formats(int usage)
{
- struct mkimg_format *f;
+ struct mkimg_format *f, **f_iter;
const char *sep;
if (usage) {
fprintf(stderr, " formats:\n");
- f = NULL;
- while ((f = format_iterate(f)) != NULL) {
+ SET_FOREACH(f_iter, formats) {
+ f = *f_iter;
fprintf(stderr, "\t%s\t- %s\n", f->name,
f->description);
}
} else {
sep = "";
- f = NULL;
- while ((f = format_iterate(f)) != NULL) {
+ SET_FOREACH(f_iter, formats) {
+ f = *f_iter;
printf("%s%s", sep, f->name);
sep = " ";
}
@@ -103,20 +101,20 @@ print_formats(int usage)
static void
print_schemes(int usage)
{
- struct mkimg_scheme *s;
+ struct mkimg_scheme *s, **s_iter;
const char *sep;
if (usage) {
fprintf(stderr, " schemes:\n");
- s = NULL;
- while ((s = scheme_iterate(s)) != NULL) {
+ SET_FOREACH(s_iter, schemes) {
+ s = *s_iter;
fprintf(stderr, "\t%s\t- %s\n", s->name,
s->description);
}
} else {
sep = "";
- s = NULL;
- while ((s = scheme_iterate(s)) != NULL) {
+ SET_FOREACH(s_iter, schemes) {
+ s = *s_iter;
printf("%s%s", sep, s->name);
sep = " ";
}
@@ -150,10 +148,8 @@ usage(const char *why)
fprintf(stderr, "\t--schemes\t- list partition schemes\n");
fprintf(stderr, "\t--version\t- show version information\n");
fputc('\n', stderr);
- fprintf(stderr, "\t-a <num>\t- mark num'th partion as active\n");
fprintf(stderr, "\t-b <file>\t- file containing boot code\n");
- fprintf(stderr, "\t-c <num>\t- minimum capacity (in bytes) of the disk\n");
- fprintf(stderr, "\t-C <num>\t- maximum capacity (in bytes) of the disk\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");
@@ -306,7 +302,7 @@ parse_part(const char *spec)
}
part->index = nparts;
- TAILQ_INSERT_TAIL(&partlist, part, link);
+ STAILQ_INSERT_TAIL(&partlist, part, link);
nparts++;
return (0);
@@ -380,20 +376,31 @@ mkimg_chs(lba_t lba, u_int maxcyl, u_int *cylp, u_int
*secp = sec;
}
+void
+mkimg_uuid(struct uuid *uuid)
+{
+ static uint8_t gen[sizeof(struct uuid)];
+ u_int i;
+
+ if (!unit_testing) {
+ uuidgen(uuid, 1);
+ return;
+ }
+
+ for (i = 0; i < sizeof(gen); i++)
+ gen[i]++;
+ memcpy(uuid, gen, sizeof(uuid_t));
+}
+
static int
capacity_resize(lba_t end)
{
- lba_t min_capsz, max_capsz;
+ lba_t capsz;
- min_capsz = (min_capacity + secsz - 1) / secsz;
- max_capsz = (max_capacity + secsz - 1) / secsz;
-
- if (max_capsz != 0 && end > max_capsz)
- return (ENOSPC);
- if (end >= min_capsz)
+ capsz = (capacity + secsz - 1) / secsz;
+ if (end >= capsz)
return (0);
-
- return (image_set_size(min_capsz));
+ return (image_set_size(capsz));
}
static void
@@ -406,14 +413,14 @@ mkimg(void)
int error, fd;
/* First check partition information */
- TAILQ_FOREACH(part, &partlist, link) {
+ STAILQ_FOREACH(part, &partlist, link) {
error = scheme_check_part(part);
if (error)
errc(EX_DATAERR, error, "partition %d", part->index+1);
}
block = scheme_metadata(SCHEME_META_IMG_START, 0);
- TAILQ_FOREACH(part, &partlist, link) {
+ STAILQ_FOREACH(part, &partlist, link) {
block = scheme_metadata(SCHEME_META_PART_BEFORE, block);
if (verbose)
fprintf(stderr, "partition %d: starting block %llu "
@@ -480,14 +487,9 @@ main(int argc, char *argv[])
bcfd = -1;
outfd = 1; /* Write to stdout by default */
- while ((c = getopt_long(argc, argv, "a:b:c:C: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 'a': /* ACTIVE PARTITION, if supported */
- error = parse_uint32(&active_partition, 1, 100, optarg);
- if (error)
- errc(EX_DATAERR, error, "Partition ordinal");
- break;
case 'b': /* BOOT CODE */
if (bcfd != -1)
usage("multiple bootcode given");
@@ -495,16 +497,11 @@ main(int argc, char *argv[])
if (bcfd == -1)
err(EX_UNAVAILABLE, "%s", optarg);
break;
- case 'c': /* MINIMUM CAPACITY */
- error = parse_uint64(&min_capacity, 1, INT64_MAX, optarg);
+ case 'c': /* CAPACITY */
+ error = parse_uint64(&capacity, 1, OFF_MAX, optarg);
if (error)
- errc(EX_DATAERR, error, "minimum capacity in bytes");
+ errc(EX_DATAERR, error, "capacity in bytes");
break;
- case 'C': /* MAXIMUM CAPACITY */
- error = parse_uint64(&max_capacity, 1, INT64_MAX, optarg);
- if (error)
- errc(EX_DATAERR, error, "maximum capacity in bytes");
- break;
case 'f': /* OUTPUT FORMAT */
if (format_selected() != NULL)
usage("multiple formats given");
@@ -574,12 +571,6 @@ main(int argc, char *argv[])
print_version();
exit(EX_OK);
/*NOTREACHED*/
- case LONGOPT_CAPACITY:
- error = parse_uint64(&min_capacity, 1, INT64_MAX, optarg);
- if (error)
- errc(EX_DATAERR, error, "capacity in bytes");
- max_capacity = min_capacity;
- break;
default:
usage("unknown option");
}
@@ -589,10 +580,8 @@ main(int argc, char *argv[])
usage("trailing arguments");
if (scheme_selected() == NULL && nparts > 0)
usage("no scheme");
- if (nparts == 0 && min_capacity == 0)
+ if (nparts == 0 && capacity == 0)
usage("no partitions");
- if (max_capacity != 0 && min_capacity > max_capacity)
- usage("minimum capacity cannot be larger than the maximum one");
if (secsz > blksz) {
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-stable-11
mailing list