Add mkimg.h. It contains the 'part' structure definition and the linked
list (STAILQ) so that it can be shared and re-used in all source files. Replace the now unneeded scheme_add_part() with scheme_check_part() for posterity. Also (should have been a separate commit), remove the enforcement of creating a GPT table with at least 128 entries. While this is generally advised as the default or minimum, it's not actually a hard requirement. We now recreate a table that's precisely enough (rounded of course). WHile
This commit is contained in:
parent
72e40274dc
commit
cf8b12efb7
26
mkimg.c
26
mkimg.c
@ -40,26 +40,13 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "mkimg.h"
|
||||
#include "scheme.h"
|
||||
|
||||
#define BUFFER_SIZE (1024*1024)
|
||||
|
||||
struct part {
|
||||
STAILQ_ENTRY(part) link;
|
||||
char *type; /* Partition type. */
|
||||
char *contents; /* Contents/size specification. */
|
||||
u_int kind; /* Content kind. */
|
||||
#define PART_UNDEF 0
|
||||
#define PART_KIND_FILE 1
|
||||
#define PART_KIND_PIPE 2
|
||||
#define PART_KIND_SIZE 3
|
||||
u_int index; /* Partition index (0-based). */
|
||||
off_t offset; /* Byte-offset of partition in image. */
|
||||
off_t size; /* Size in bytes of partition. */
|
||||
};
|
||||
|
||||
static STAILQ_HEAD(, part) parts = STAILQ_HEAD_INITIALIZER(parts);
|
||||
static u_int nparts = 0;
|
||||
struct partlisthead partlist = STAILQ_HEAD_INITIALIZER(partlist);
|
||||
u_int nparts = 0;
|
||||
|
||||
static int bcfd = 0;
|
||||
static int outfd = 0;
|
||||
@ -155,7 +142,7 @@ parse_part(const char *spec)
|
||||
}
|
||||
|
||||
part->index = nparts;
|
||||
STAILQ_INSERT_TAIL(&parts, part, link);
|
||||
STAILQ_INSERT_TAIL(&partlist, part, link);
|
||||
nparts++;
|
||||
return (0);
|
||||
|
||||
@ -208,7 +195,7 @@ mkimg(void)
|
||||
scheme_max_parts());
|
||||
|
||||
offset = scheme_first_offset(nparts);
|
||||
STAILQ_FOREACH(part, &parts, link) {
|
||||
STAILQ_FOREACH(part, &partlist, link) {
|
||||
part->offset = offset;
|
||||
lseek(tmpfd, offset, SEEK_SET);
|
||||
/* XXX check error */
|
||||
@ -237,8 +224,7 @@ mkimg(void)
|
||||
break;
|
||||
}
|
||||
part->size = size;
|
||||
scheme_add_part(part->index, part->type, part->offset,
|
||||
part->size);
|
||||
scheme_check_part(part);
|
||||
offset = scheme_next_offset(offset, size);
|
||||
}
|
||||
|
||||
|
49
mkimg.h
Normal file
49
mkimg.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*-
|
||||
* Copyright (c) 2014 Juniper Networks, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MKIMG_MKIMG_H_
|
||||
#define _MKIMG_MKIMG_H_
|
||||
|
||||
struct part {
|
||||
STAILQ_ENTRY(part) link;
|
||||
char *type; /* Partition type. */
|
||||
char *contents; /* Contents/size specification. */
|
||||
u_int kind; /* Content kind. */
|
||||
#define PART_UNDEF 0
|
||||
#define PART_KIND_FILE 1
|
||||
#define PART_KIND_PIPE 2
|
||||
#define PART_KIND_SIZE 3
|
||||
u_int index; /* Partition index (0-based). */
|
||||
off_t offset; /* Byte-offset of partition in image. */
|
||||
off_t size; /* Size in bytes of partition. */
|
||||
};
|
||||
|
||||
extern STAILQ_HEAD(partlisthead, part) partlist;
|
||||
extern u_int nparts;
|
||||
|
||||
#endif /* _MKIMG_MKIMG_H_ */
|
35
scheme.c
35
scheme.c
@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/types.h>
|
||||
#include <sys/diskmbr.h>
|
||||
#include <sys/diskpc98.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/vtoc.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
@ -37,10 +38,9 @@ __FBSDID("$FreeBSD$");
|
||||
#include <strings.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "mkimg.h"
|
||||
#include "scheme.h"
|
||||
|
||||
#define MAX(a, b) ((a < b) ? b : a)
|
||||
|
||||
static struct scheme {
|
||||
const char *lexeme;
|
||||
u_int token;
|
||||
@ -57,7 +57,6 @@ static struct scheme {
|
||||
|
||||
static u_int scheme = SCHEME_UNDEF;
|
||||
static u_int secsz = 512;
|
||||
static u_int nparts = 0;
|
||||
|
||||
int
|
||||
scheme_select(const char *spec)
|
||||
@ -83,27 +82,12 @@ scheme_selected(void)
|
||||
}
|
||||
|
||||
int
|
||||
scheme_add_part(u_int idx, const char *type, off_t offset, off_t size)
|
||||
scheme_check_part(struct part *p __unused)
|
||||
{
|
||||
|
||||
warnx("part: index=%u, type=`%s', offset=%ju, size=%ju", idx,
|
||||
type, (uintmax_t)offset, (uintmax_t)size);
|
||||
switch (scheme) {
|
||||
case SCHEME_APM:
|
||||
break;
|
||||
case SCHEME_BSD:
|
||||
break;
|
||||
case SCHEME_EBR:
|
||||
break;
|
||||
case SCHEME_GPT:
|
||||
break;
|
||||
case SCHEME_MBR:
|
||||
break;
|
||||
case SCHEME_PC98:
|
||||
break;
|
||||
case SCHEME_VTOC8:
|
||||
break;
|
||||
}
|
||||
warnx("part: index=%u, type=`%s', offset=%ju, size=%ju", p->index,
|
||||
p->type, (uintmax_t)p->offset, (uintmax_t)p->size);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -146,7 +130,6 @@ scheme_first_offset(u_int parts)
|
||||
{
|
||||
off_t off;
|
||||
|
||||
nparts = parts; /* Save nparts for later. */
|
||||
switch (scheme) {
|
||||
case SCHEME_APM:
|
||||
off = parts + 1;
|
||||
@ -158,13 +141,13 @@ scheme_first_offset(u_int parts)
|
||||
off = 1;
|
||||
break;
|
||||
case SCHEME_GPT:
|
||||
off = 2 + (MAX(128, parts) + 3) / 4;
|
||||
off = 2 + (parts + 3) / 4;
|
||||
break;
|
||||
case SCHEME_MBR:
|
||||
off = 1;
|
||||
break;
|
||||
case SCHEME_PC98:
|
||||
off = 16;
|
||||
off = 2;
|
||||
break;
|
||||
case SCHEME_VTOC8:
|
||||
off = 1;
|
||||
@ -194,7 +177,7 @@ scheme_write(int fd, off_t off)
|
||||
|
||||
switch (scheme) {
|
||||
case SCHEME_GPT:
|
||||
lim = off + secsz * (1 + (MAX(128, nparts) + 3) / 4);
|
||||
lim = off + secsz * (1 + (nparts + 3) / 4);
|
||||
break;
|
||||
case SCHEME_EBR:
|
||||
off -= secsz;
|
||||
|
2
scheme.h
2
scheme.h
@ -41,7 +41,7 @@
|
||||
int scheme_select(const char *);
|
||||
u_int scheme_selected(void);
|
||||
|
||||
int scheme_add_part(u_int, const char *, off_t, off_t);
|
||||
int scheme_check_part(struct part *);
|
||||
u_int scheme_max_parts(void);
|
||||
off_t scheme_first_offset(u_int);
|
||||
off_t scheme_next_offset(off_t, uint64_t);
|
||||
|
Loading…
Reference in New Issue
Block a user