Index: user/marcel/mkimg/Makefile =================================================================== --- user/marcel/mkimg/Makefile (revision 263408) +++ user/marcel/mkimg/Makefile (revision 263409) @@ -1,14 +1,24 @@ # $FreeBSD$ PROG= mkimg SRCS= mkimg.c scheme.c MAN= mkimg.8 +# List of schemes to support +SRCS+= \ + apm.c \ + bsd.c \ + ebr.c \ + gpt.c \ + mbr.c \ + pc98.c \ + vtoc8.c + BINDIR?=/usr/sbin DPADD= ${LIBUTIL} LDADD= -lutil WARNS?= 6 .include Index: user/marcel/mkimg/apm.c =================================================================== --- user/marcel/mkimg/apm.c (nonexistent) +++ user/marcel/mkimg/apm.c (revision 263409) @@ -0,0 +1,67 @@ +/*- + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include "mkimg.h" +#include "scheme.h" + +static struct mkimg_alias apm_aliases[] = { + { NULL, 0 } +}; + +static off_t +apm_get_leader(u_int parts) +{ + + return (parts + 1); +} + +static off_t +apm_get_trailer(u_int parts __unused) +{ + + return (0); +} + +static struct mkimg_scheme apm_scheme = { + .name = "apm", + .description = "Apple Partition Map", + .nparts = 4096, + .padding = 0, + .aliases = apm_aliases, + .get_leader = apm_get_leader, + .get_trailer = apm_get_trailer +}; + +SCHEME_DEFINE(apm_scheme); Property changes on: user/marcel/mkimg/apm.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: user/marcel/mkimg/bsd.c =================================================================== --- user/marcel/mkimg/bsd.c (nonexistent) +++ user/marcel/mkimg/bsd.c (revision 263409) @@ -0,0 +1,67 @@ +/*- + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include "mkimg.h" +#include "scheme.h" + +static struct mkimg_alias bsd_aliases[] = { + { NULL, 0 } +}; + +static off_t +bsd_get_leader(u_int parts __unused) +{ + + return (16); +} + +static off_t +bsd_get_trailer(u_int parts __unused) +{ + + return (0); +} + +static struct mkimg_scheme bsd_scheme = { + .name = "bsd", + .description = "GUID Partition Table", + .nparts = 20, + .padding = 0, + .aliases = bsd_aliases, + .get_leader = bsd_get_leader, + .get_trailer = bsd_get_trailer +}; + +SCHEME_DEFINE(bsd_scheme); Property changes on: user/marcel/mkimg/bsd.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: user/marcel/mkimg/ebr.c =================================================================== --- user/marcel/mkimg/ebr.c (nonexistent) +++ user/marcel/mkimg/ebr.c (revision 263409) @@ -0,0 +1,71 @@ +/*- + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include "mkimg.h" +#include "scheme.h" + +static struct mkimg_alias ebr_aliases[] = { + { NULL, 0 } +}; + +static off_t +ebr_get_leader(u_int parts __unused) +{ + + return (1); +} + +static off_t +ebr_get_trailer(u_int parts __unused) +{ + + /* + * Compensate for having reserved a sector for the EBR after + * the last partition. + */ + return (-1); +} + +static struct mkimg_scheme ebr_scheme = { + .name = "ebr", + .description = "Extended Boot Record", + .nparts = 4096, + .padding = 1, /* See ebr_get_trailer() above */ + .aliases = ebr_aliases, + .get_leader = ebr_get_leader, + .get_trailer = ebr_get_trailer +}; + +SCHEME_DEFINE(ebr_scheme); Property changes on: user/marcel/mkimg/ebr.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: user/marcel/mkimg/gpt.c =================================================================== --- user/marcel/mkimg/gpt.c (nonexistent) +++ user/marcel/mkimg/gpt.c (revision 263409) @@ -0,0 +1,71 @@ +/*- + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include "mkimg.h" +#include "scheme.h" + +static uuid_t gpt_uuid_efi = GPT_ENT_TYPE_EFI; + +static struct mkimg_alias gpt_aliases[] = { + { "efi", ALIAS_PTR(&gpt_uuid_efi) }, + { NULL, 0 } +}; + +static off_t +gpt_get_leader(u_int parts) +{ + + return (2 + (parts + 3) / 4); +} + +static off_t +gpt_get_trailer(u_int parts) +{ + + return (1 + (parts + 3) / 4); +} + +static struct mkimg_scheme gpt_scheme = { + .name = "gpt", + .description = "GUID Partition Table", + .nparts = 4096, + .padding = 0, + .aliases = gpt_aliases, + .get_leader = gpt_get_leader, + .get_trailer = gpt_get_trailer +}; + +SCHEME_DEFINE(gpt_scheme); Property changes on: user/marcel/mkimg/gpt.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: user/marcel/mkimg/mbr.c =================================================================== --- user/marcel/mkimg/mbr.c (nonexistent) +++ user/marcel/mkimg/mbr.c (revision 263409) @@ -0,0 +1,68 @@ +/*- + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include "mkimg.h" +#include "scheme.h" + +static struct mkimg_alias mbr_aliases[] = { + { NULL, 0 } +}; + +static off_t +mbr_get_leader(u_int parts __unused) +{ + + return (1); +} + +static off_t +mbr_get_trailer(u_int parts __unused) +{ + + return (0); +} + +static struct mkimg_scheme mbr_scheme = { + .name = "mbr", + .description = "Master Boot Record", + .nparts = NDOSPART, + .padding = 0, + .aliases = mbr_aliases, + .get_leader = mbr_get_leader, + .get_trailer = mbr_get_trailer +}; + +SCHEME_DEFINE(mbr_scheme); Property changes on: user/marcel/mkimg/mbr.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: user/marcel/mkimg/mkimg.c =================================================================== --- user/marcel/mkimg/mkimg.c (revision 263408) +++ user/marcel/mkimg/mkimg.c (revision 263409) @@ -1,328 +1,328 @@ /*- - * Copyright (c) 2013 Juniper Networks, Inc. + * Copyright (c) 2013,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. */ #include __FBSDID("$FreeBSD$"); +#include #include #include #include #include #include #include #include #include #include #include #include #include #include "mkimg.h" #include "scheme.h" #define BUFFER_SIZE (1024*1024) struct partlisthead partlist = STAILQ_HEAD_INITIALIZER(partlist); u_int nparts = 0; static int bcfd = 0; static int outfd = 0; static int tmpfd = -1; static char tmpfname[] = "/tmp/mkimg-XXXXXX"; static void cleanup(void) { if (tmpfd != -1) close(tmpfd); unlink(tmpfname); } static void usage(const char *why) { + struct mkimg_scheme *s, **iter; + warnx("error: %s", why); fprintf(stderr, "\nusage: %s \n", getprogname()); fprintf(stderr, " options:\n"); fprintf(stderr, "\t-b \t- file containing boot code\n"); fprintf(stderr, "\t-h \t- number of heads to simulate\n"); fprintf(stderr, "\t-o \t- file to write image into\n"); fprintf(stderr, "\t-p \n"); fprintf(stderr, "\t-s \n"); fprintf(stderr, "\t-t \t- number of tracks to simulate\n"); fprintf(stderr, "\t-z\t\t- write a sparse file\n"); fprintf(stderr, " schemes:\n"); - fprintf(stderr, "\tapm\t- Apple Partition Map\n"); - fprintf(stderr, "\tbsd\t- BSD disk label\n"); - fprintf(stderr, "\tebr\t- Extended Boot Record\n"); - fprintf(stderr, "\tgpt\t- GUID Partition Table\n"); - fprintf(stderr, "\tmbr\t- Master Boot Record\n"); - fprintf(stderr, "\tpc98\t- PC-9800 disk partitions\n"); - fprintf(stderr, "\tvtoc8\t- SMI VTOC8 disk labels\n"); + SET_FOREACH(iter, schemes) { + s = *iter; + fprintf(stderr, "\t%s\t- %s\n", s->name, s->description); + } fprintf(stderr, " partition specification:\n"); fprintf(stderr, "\t::\t- empty partition of given size\n"); fprintf(stderr, "\t:=\t- partition content and size\n" "\t\t\t determined by the named file\n"); fprintf(stderr, "\t:!\t- partition content and size\n" "\t\t\t taken from the output of the command to run\n"); fprintf(stderr, "\t where:\n"); fprintf(stderr, "\t\ttype\t- scheme neutral partition type\n"); exit(EX_USAGE); } /* * A partition specification has the following format: * ':' * where: * type the partition type alias * kind the interpretation of the contents specification * ':' contents holds the size of an empty partition * '=' contents holds the name of a file to read * '!' contents holds a command to run; the output of * which is the contents of the partition. * contents the specification of a partition's contents */ static int parse_part(const char *spec) { struct part *part; char *sep; size_t len; int error; part = calloc(1, sizeof(struct part)); if (part == NULL) return (ENOMEM); sep = strchr(spec, ':'); if (sep == NULL) { error = EINVAL; goto errout; } len = sep - spec + 1; if (len < 2) { error = EINVAL; goto errout; } part->type = malloc(len); if (part->type == NULL) { error = ENOMEM; goto errout; } strlcpy(part->type, spec, len); spec = sep + 1; switch (*spec) { case ':': part->kind = PART_KIND_SIZE; break; case '=': part->kind = PART_KIND_FILE; break; case '!': part->kind = PART_KIND_PIPE; break; default: error = EINVAL; goto errout; } spec++; part->contents = strdup(spec); if (part->contents == NULL) { error = ENOMEM; goto errout; } part->index = nparts; STAILQ_INSERT_TAIL(&partlist, part, link); nparts++; return (0); errout: if (part->type != NULL) free(part->type); free(part); return (error); } static int fdcopy(int src, int dst, uint64_t *count) { void *buffer; ssize_t rdsz, wrsz; if (count != 0) *count = 0; buffer = malloc(BUFFER_SIZE); if (buffer == NULL) return (errno); while (1) { rdsz = read(src, buffer, BUFFER_SIZE); if (rdsz <= 0) { free(buffer); return ((rdsz < 0) ? errno : 0); } if (count != NULL) *count += rdsz; wrsz = write(dst, buffer, rdsz); if (wrsz < 0) break; } free(buffer); return (errno); } static void mkimg(void) { FILE *fp; struct part *part; off_t offset; uint64_t size; int error, fd; if (nparts > scheme_max_parts()) errc(EX_DATAERR, ENOSPC, "only %d partitions are supported", scheme_max_parts()); offset = scheme_first_offset(nparts); STAILQ_FOREACH(part, &partlist, link) { part->offset = offset; lseek(tmpfd, offset, SEEK_SET); /* XXX check error */ error = 0; switch (part->kind) { case PART_KIND_SIZE: if (expand_number(part->contents, &size) == -1) error = errno; break; case PART_KIND_FILE: fd = open(part->contents, O_RDONLY, 0); if (fd != -1) { error = fdcopy(fd, tmpfd, &size); close(fd); } else error = errno; break; case PART_KIND_PIPE: fp = popen(part->contents, "r"); if (fp != NULL) { error = fdcopy(fileno(fp), tmpfd, &size); pclose(fp); } else error = errno; break; } part->size = size; scheme_check_part(part); offset = scheme_next_offset(offset, size); } scheme_write(tmpfd, offset); } int main(int argc, char *argv[]) { int c, error; while ((c = getopt(argc, argv, "b:h:o:p:s:t:z")) != -1) { switch (c) { case 'b': /* BOOT CODE */ if (bcfd != 0) usage("multiple bootcode given"); bcfd = open(optarg, O_RDONLY, 0); if (bcfd == -1) err(EX_UNAVAILABLE, "%s", optarg); break; case 'h': /* GEOMETRY: HEADS */ break; case 'o': /* OUTPUT FILE */ if (outfd != 0) usage("multiple output files given"); outfd = open(optarg, O_WRONLY | O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH); if (outfd == -1) err(EX_CANTCREAT, "%s", optarg); break; case 'p': /* PARTITION */ error = parse_part(optarg); if (error) errc(EX_DATAERR, error, "partition"); break; case 's': /* SCHEME */ - if (scheme_selected() != SCHEME_UNDEF) + if (scheme_selected() != NULL) usage("multiple schemes given"); error = scheme_select(optarg); if (error) errc(EX_DATAERR, error, "scheme"); break; case 't': /* GEOMETRY: TRACK SIZE */ break; case 'z': /* SPARSE OUTPUT */ break; default: usage("unknown option"); } } if (argc > optind) usage("trailing arguments"); - if (scheme_selected() == SCHEME_UNDEF) + if (scheme_selected() == NULL) usage("no scheme"); if (nparts == 0) usage("no partitions"); if (outfd == 0) { if (atexit(cleanup) == -1) err(EX_OSERR, "cannot register cleanup function"); outfd = 1; tmpfd = mkstemp(tmpfname); if (tmpfd == -1) err(EX_OSERR, "cannot create temporary file"); } else tmpfd = outfd; mkimg(); if (tmpfd != outfd) { if (lseek(tmpfd, 0, SEEK_SET) == 0) error = fdcopy(tmpfd, outfd, NULL); else error = errno; /* XXX check error */ } return (0); } Index: user/marcel/mkimg/pc98.c =================================================================== --- user/marcel/mkimg/pc98.c (nonexistent) +++ user/marcel/mkimg/pc98.c (revision 263409) @@ -0,0 +1,68 @@ +/*- + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include "mkimg.h" +#include "scheme.h" + +static struct mkimg_alias pc98_aliases[] = { + { NULL, 0 } +}; + +static off_t +pc98_get_leader(u_int parts __unused) +{ + + return (2); +} + +static off_t +pc98_get_trailer(u_int parts __unused) +{ + + return (0); +} + +static struct mkimg_scheme pc98_scheme = { + .name = "pc98", + .description = "PC-9800 disk partitions", + .nparts = PC98_NPARTS, + .padding = 0, + .aliases = pc98_aliases, + .get_leader = pc98_get_leader, + .get_trailer = pc98_get_trailer +}; + +SCHEME_DEFINE(pc98_scheme); Property changes on: user/marcel/mkimg/pc98.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: user/marcel/mkimg/scheme.c =================================================================== --- user/marcel/mkimg/scheme.c (revision 263408) +++ user/marcel/mkimg/scheme.c (revision 263409) @@ -1,190 +1,111 @@ /*- - * Copyright (c) 2013 Juniper Networks, Inc. + * Copyright (c) 2013,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. */ #include __FBSDID("$FreeBSD$"); #include -#include -#include +#include #include -#include #include #include #include #include #include #include "mkimg.h" #include "scheme.h" -static struct scheme { - const char *lexeme; - u_int token; -} schemes[] = { - { .lexeme = "apm", .token = SCHEME_APM }, - { .lexeme = "bsd", .token = SCHEME_BSD }, - { .lexeme = "ebr", .token = SCHEME_EBR }, - { .lexeme = "gpt", .token = SCHEME_GPT }, - { .lexeme = "mbr", .token = SCHEME_MBR }, - { .lexeme = "pc98", .token = SCHEME_PC98 }, - { .lexeme = "vtoc8", .token = SCHEME_VTOC8 }, - { .lexeme = NULL, .token = SCHEME_UNDEF } -}; - -static u_int scheme = SCHEME_UNDEF; +static struct mkimg_scheme *scheme; static u_int secsz = 512; int scheme_select(const char *spec) { - struct scheme *s; + struct mkimg_scheme *s, **iter; - s = schemes; - while (s->lexeme != NULL) { - if (strcasecmp(spec, s->lexeme) == 0) { - scheme = s->token; + SET_FOREACH(iter, schemes) { + s = *iter; + if (strcasecmp(spec, s->name) == 0) { + scheme = s; return (0); } - s++; } return (EINVAL); } -u_int +struct mkimg_scheme * scheme_selected(void) { return (scheme); } int -scheme_check_part(struct part *p __unused) +scheme_check_part(struct part *p) { - warnx("part: index=%u, type=`%s', offset=%ju, size=%ju", p->index, - p->type, (uintmax_t)p->offset, (uintmax_t)p->size); + warnx("part(%s): index=%u, type=`%s', offset=%ju, size=%ju", + scheme->name, p->index, p->type, (uintmax_t)p->offset, + (uintmax_t)p->size); return (0); } u_int scheme_max_parts(void) { - u_int parts; - switch (scheme) { - case SCHEME_APM: - parts = 4096; - break; - case SCHEME_BSD: - parts = 20; - break; - case SCHEME_EBR: - parts = 4096; - break; - case SCHEME_GPT: - parts = 4096; - break; - case SCHEME_MBR: - parts = NDOSPART; - break; - case SCHEME_PC98: - parts = PC98_NPARTS; - break; - case SCHEME_VTOC8: - parts = VTOC8_NPARTS; - break; - default: - parts = 0; - break; - } - return (parts); + return (scheme->nparts); } off_t scheme_first_offset(u_int parts) { off_t off; - switch (scheme) { - case SCHEME_APM: - off = parts + 1; - break; - case SCHEME_BSD: - off = 16; - break; - case SCHEME_EBR: - off = 1; - break; - case SCHEME_GPT: - off = 2 + (parts + 3) / 4; - break; - case SCHEME_MBR: - off = 1; - break; - case SCHEME_PC98: - off = 2; - break; - case SCHEME_VTOC8: - off = 1; - break; - default: - off = 0; - break; - } + off = scheme->get_leader(parts); off *= secsz; return (off); } off_t scheme_next_offset(off_t off, uint64_t sz) { sz = (sz + secsz - 1) & ~(secsz - 1); - if (scheme == SCHEME_EBR) - sz += secsz; + sz += scheme->padding * secsz; return (off + sz); } void scheme_write(int fd, off_t off) { - off_t lim; + off_t trailer; - switch (scheme) { - case SCHEME_GPT: - lim = off + secsz * (1 + (nparts + 3) / 4); - break; - case SCHEME_EBR: - off -= secsz; - /* FALLTHROUGH */ - default: - lim = off; - break; - } - ftruncate(fd, lim); + trailer = scheme->get_trailer(nparts) * secsz; + ftruncate(fd, off + trailer); } Index: user/marcel/mkimg/scheme.h =================================================================== --- user/marcel/mkimg/scheme.h (revision 263408) +++ user/marcel/mkimg/scheme.h (revision 263409) @@ -1,50 +1,61 @@ /*- - * Copyright (c) 2013 Juniper Networks, Inc. + * Copyright (c) 2013,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_SCHEME_H_ #define _MKIMG_SCHEME_H_ -#define SCHEME_UNDEF 0 -#define SCHEME_APM 1 -#define SCHEME_BSD 2 -#define SCHEME_EBR 3 -#define SCHEME_GPT 4 -#define SCHEME_MBR 5 -#define SCHEME_PC98 6 -#define SCHEME_VTOC8 7 +struct mkimg_alias { + const char *name; + uintptr_t tp; +#define ALIAS_PTR(p) (uintptr_t)(p) +#define ALIAS_INT(i) (uintptr_t)(i) +}; +struct mkimg_scheme { + const char *name; + const char *description; + int nparts; + int padding; + struct mkimg_alias *aliases; + off_t (*get_leader)(u_int); + off_t (*get_trailer)(u_int); +}; + +SET_DECLARE(schemes, struct mkimg_scheme); +#define SCHEME_DEFINE(nm) DATA_SET(schemes, nm) + int scheme_select(const char *); -u_int scheme_selected(void); +struct mkimg_scheme *scheme_selected(void); 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); void scheme_write(int, off_t); #endif /* _MKIMG_SCHEME_H_ */ Index: user/marcel/mkimg/vtoc8.c =================================================================== --- user/marcel/mkimg/vtoc8.c (nonexistent) +++ user/marcel/mkimg/vtoc8.c (revision 263409) @@ -0,0 +1,68 @@ +/*- + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include "mkimg.h" +#include "scheme.h" + +static struct mkimg_alias vtoc8_aliases[] = { + { NULL, 0 } +}; + +static off_t +vtoc8_get_leader(u_int parts __unused) +{ + + return (1); +} + +static off_t +vtoc8_get_trailer(u_int parts __unused) +{ + + return (0); +} + +static struct mkimg_scheme vtoc8_scheme = { + .name = "vtoc8", + .description = "SMI VTOC8 disk labels", + .nparts = VTOC8_NPARTS, + .padding = 0, + .aliases = vtoc8_aliases, + .get_leader = vtoc8_get_leader, + .get_trailer = vtoc8_get_trailer +}; + +SCHEME_DEFINE(vtoc8_scheme); Property changes on: user/marcel/mkimg/vtoc8.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property