Deleted Added
full compact
mbr.c (263652) mbr.c (263653)
1/*-
2 * Copyright (c) 2014 Juniper Networks, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2014 Juniper Networks, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: user/marcel/mkimg/mbr.c 263652 2014-03-22 23:34:35Z marcel $");
28__FBSDID("$FreeBSD: user/marcel/mkimg/mbr.c 263653 2014-03-23 01:10:05Z marcel $");
29
30#include <sys/types.h>
31#include <sys/diskmbr.h>
32#include <sys/endian.h>
33#include <sys/errno.h>
34#include <stdlib.h>
35#include <string.h>
36#include <unistd.h>
37
38#include "mkimg.h"
39#include "scheme.h"
40
41static struct mkimg_alias mbr_aliases[] = {
42 { ALIAS_FREEBSD, ALIAS_INT2TYPE(DOSPTYP_386BSD) },
43 { ALIAS_NONE, 0 } /* Keep last! */
44};
45
46static u_int
29
30#include <sys/types.h>
31#include <sys/diskmbr.h>
32#include <sys/endian.h>
33#include <sys/errno.h>
34#include <stdlib.h>
35#include <string.h>
36#include <unistd.h>
37
38#include "mkimg.h"
39#include "scheme.h"
40
41static struct mkimg_alias mbr_aliases[] = {
42 { ALIAS_FREEBSD, ALIAS_INT2TYPE(DOSPTYP_386BSD) },
43 { ALIAS_NONE, 0 } /* Keep last! */
44};
45
46static u_int
47mbr_metadata(u_int where, u_int parts __unused, u_int secsz __unused)
47mbr_metadata(u_int where)
48{
49 u_int secs;
50
51 secs = (where == SCHEME_META_IMG_START) ? 1 : 0;
52 return (secs);
53}
54
55static int
48{
49 u_int secs;
50
51 secs = (where == SCHEME_META_IMG_START) ? 1 : 0;
52 return (secs);
53}
54
55static int
56mbr_write(int fd, off_t imgsz __unused, u_int parts __unused, u_int secsz,
57 void *bootcode)
56mbr_write(int fd, lba_t imgsz __unused, void *bootcode)
58{
59 u_char *mbr;
60 struct dos_partition *dpbase, *dp;
61 struct part *part;
57{
58 u_char *mbr;
59 struct dos_partition *dpbase, *dp;
60 struct part *part;
61 int error;
62
63 mbr = malloc(secsz);
64 if (mbr == NULL)
65 return (ENOMEM);
66 if (bootcode != NULL) {
67 memcpy(mbr, bootcode, DOSPARTOFF);
68 memset(mbr + DOSPARTOFF, 0, secsz - DOSPARTOFF);
69 } else
70 memset(mbr, 0, secsz);
71 dpbase = (void *)(mbr + DOSPARTOFF);
72 STAILQ_FOREACH(part, &partlist, link) {
73 dp = dpbase + part->index;
74 dp->dp_flag = (part->index == 0 && bootcode != NULL) ? 0x80 : 0;
75 dp->dp_shd = dp->dp_ssect = dp->dp_scyl = 0xff; /* XXX */
76 dp->dp_typ = ALIAS_TYPE2INT(part->type);
77 dp->dp_ehd = dp->dp_esect = dp->dp_ecyl = 0xff; /* XXX */
62
63 mbr = malloc(secsz);
64 if (mbr == NULL)
65 return (ENOMEM);
66 if (bootcode != NULL) {
67 memcpy(mbr, bootcode, DOSPARTOFF);
68 memset(mbr + DOSPARTOFF, 0, secsz - DOSPARTOFF);
69 } else
70 memset(mbr, 0, secsz);
71 dpbase = (void *)(mbr + DOSPARTOFF);
72 STAILQ_FOREACH(part, &partlist, link) {
73 dp = dpbase + part->index;
74 dp->dp_flag = (part->index == 0 && bootcode != NULL) ? 0x80 : 0;
75 dp->dp_shd = dp->dp_ssect = dp->dp_scyl = 0xff; /* XXX */
76 dp->dp_typ = ALIAS_TYPE2INT(part->type);
77 dp->dp_ehd = dp->dp_esect = dp->dp_ecyl = 0xff; /* XXX */
78 le32enc(&dp[part->index].dp_start, part->offset / secsz);
79 le32enc(&dp[part->index].dp_size, part->size / secsz);
78 le32enc(&dp[part->index].dp_start, part->block);
79 le32enc(&dp[part->index].dp_size, part->size);
80 }
80 }
81 if (lseek(fd, 0, SEEK_SET) != 0 || write(fd, mbr, secsz) != secsz) {
82 free(mbr);
83 return (errno);
81 error = mkimg_seek(fd, 0);
82 if (error == 0) {
83 if (write(fd, mbr, secsz) != secsz)
84 error = errno;
84 }
85 free(mbr);
85 }
86 free(mbr);
86 return (0);
87 return (error);
87}
88
89static struct mkimg_scheme mbr_scheme = {
90 .name = "mbr",
91 .description = "Master Boot Record",
92 .aliases = mbr_aliases,
93 .metadata = mbr_metadata,
94 .write = mbr_write,
95 .bootcode = 512,
96 .nparts = NDOSPART
97};
98
99SCHEME_DEFINE(mbr_scheme);
88}
89
90static struct mkimg_scheme mbr_scheme = {
91 .name = "mbr",
92 .description = "Master Boot Record",
93 .aliases = mbr_aliases,
94 .metadata = mbr_metadata,
95 .write = mbr_write,
96 .bootcode = 512,
97 .nparts = NDOSPART
98};
99
100SCHEME_DEFINE(mbr_scheme);