diff --git a/Makefile b/Makefile index a91c5154d01a..622b3919b008 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,16 @@ 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} diff --git a/apm.c b/apm.c new file mode 100644 index 000000000000..d470f81e66c1 --- /dev/null +++ b/apm.c @@ -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); diff --git a/bsd.c b/bsd.c new file mode 100644 index 000000000000..044f7a3f851f --- /dev/null +++ b/bsd.c @@ -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); diff --git a/ebr.c b/ebr.c new file mode 100644 index 000000000000..4c4224361f09 --- /dev/null +++ b/ebr.c @@ -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); diff --git a/gpt.c b/gpt.c new file mode 100644 index 000000000000..9b7b5b65f002 --- /dev/null +++ b/gpt.c @@ -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); diff --git a/mbr.c b/mbr.c new file mode 100644 index 000000000000..19061611d883 --- /dev/null +++ b/mbr.c @@ -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); diff --git a/mkimg.c b/mkimg.c index 24e6008c4eaf..4aeee535513d 100644 --- a/mkimg.c +++ b/mkimg.c @@ -1,5 +1,5 @@ /*- - * 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 @@ -27,6 +27,7 @@ #include __FBSDID("$FreeBSD$"); +#include #include #include #include @@ -66,6 +67,8 @@ cleanup(void) static void usage(const char *why) { + struct mkimg_scheme *s, **iter; + warnx("error: %s", why); fprintf(stderr, "\nusage: %s \n", getprogname()); @@ -79,13 +82,10 @@ usage(const char *why) 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"); @@ -283,7 +283,7 @@ main(int argc, char *argv[]) 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) @@ -299,7 +299,7 @@ main(int argc, char *argv[]) } if (argc > optind) usage("trailing arguments"); - if (scheme_selected() == SCHEME_UNDEF) + if (scheme_selected() == NULL) usage("no scheme"); if (nparts == 0) usage("no partitions"); diff --git a/pc98.c b/pc98.c new file mode 100644 index 000000000000..53c348f043ff --- /dev/null +++ b/pc98.c @@ -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); diff --git a/scheme.c b/scheme.c index 4ecc6dd0a4b1..4ed7287da6db 100644 --- a/scheme.c +++ b/scheme.c @@ -1,5 +1,5 @@ /*- - * 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 @@ -28,10 +28,8 @@ __FBSDID("$FreeBSD$"); #include -#include -#include +#include #include -#include #include #include #include @@ -41,40 +39,25 @@ __FBSDID("$FreeBSD$"); #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) { @@ -82,11 +65,12 @@ scheme_selected(void) } 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); } @@ -94,35 +78,8 @@ scheme_check_part(struct part *p __unused) 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 @@ -130,32 +87,7 @@ 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); } @@ -165,26 +97,15 @@ 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); } diff --git a/scheme.h b/scheme.h index b5536860588b..75fbdd1a129d 100644 --- a/scheme.h +++ b/scheme.h @@ -1,5 +1,5 @@ /*- - * 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 @@ -29,17 +29,28 @@ #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); diff --git a/vtoc8.c b/vtoc8.c new file mode 100644 index 000000000000..ba4608ce4f4f --- /dev/null +++ b/vtoc8.c @@ -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);