1 #if HAVE_NBTOOL_CONFIG_H
2 #include "nbtool_config.h"
15 #include "installboot.h"
18 #define DFL_SECSIZE 512
21 #define MFS_FIRST_SUBP_OFFSET 32
30 minixfs3_read_mbr(const char* device
, char* buf
)
36 fd
= open(device
, O_RDONLY
);
38 fprintf(stderr
, "Can't open %s: %s\n", device
, strerror(errno
));
42 if (lseek(fd
, MBR_PART_OFFSET
, SEEK_SET
) != MBR_PART_OFFSET
) {
43 fprintf(stderr
, "Can't seek in %s to %d: %s\n",
44 device
, MBR_PART_OFFSET
, strerror(errno
));
49 bytes
= DFL_SECSIZE
- MBR_PART_OFFSET
;
51 if ((n
= read(fd
, buf
, bytes
)) != bytes
) {
52 fprintf(stderr
, "Can't read %d bytes from %s, %d read instead"
54 bytes
, device
, n
, strerror(errno
));
59 if ((uint8_t)buf
[bytes
-2] != 0x55 || (uint8_t)buf
[bytes
-1] != 0xAA) {
60 fprintf(stderr
, "No MBR on %s, signature is %x\n",
61 device
, *(uint16_t*)(&buf
[bytes
-2]));
71 minixfs3_get_dev_type(const char *device
, ib_params
*params
)
76 * Unless the -f flag is given, we expect to be provided with a primary
77 * partition. That is, a device name that ends with "pN", N being 0-3.
78 * If the -f flag is given, we assume that anything else is a whole
79 * disk. If we were given a subpartition, it will fail the subsequent
80 * MBR signature test, so we need not check this explicitly.
84 if (len
> 2 && device
[len
-2] == 'p' &&
85 (unsigned) (device
[len
-1] - '0') <= 3) {
91 if (type
!= TYPE_PART
&& !(params
->flags
& IB_FORCE
)) {
92 fprintf(stderr
, "Wrong device %s, must be /.../cxdyp[0-3]\n",
101 minixfs3_is_minix_partition(ib_params
*params
)
103 char buf
[DFL_SECSIZE
]; /* part table + signature */
105 if (minixfs3_get_dev_type(params
->filesystem
, params
) == TYPE_BAD
)
108 /* MINIX 3 partition with current scheme *must* have subpartitions,
109 * thus MBR has signature. minixfs3_read_mbr checks the signature.
111 if (minixfs3_read_mbr(params
->filesystem
, buf
))
116 /* bootxx from NetBSD is ~8Kb, and old MINIX installations have just
117 * 1Kb of space for their bootblock. Check if there is enough space
118 * to install bootxx_minixfs3. New installation should have 16Kb before
119 * the first subpartition.
122 minixfs3_has_bootblock_space(ib_params
*params
)
125 char buf
[DFL_SECSIZE
]; /* part table + signature */
126 char parent_name
[NAME_MAX
];
127 struct mbr_partition
*part
;
128 uint32_t first_subpartition
= (uint32_t) ~0;
129 uint32_t parent_partition
;
130 int i
, len
, type
= 0;
132 device
= params
->filesystem
;
134 if ((type
= minixfs3_get_dev_type(device
, params
)) == TYPE_BAD
)
137 if (minixfs3_read_mbr(device
, buf
))
140 part
= (struct mbr_partition
*) buf
;
142 for (i
= 0; i
< 4; i
++) {
143 if (part
[i
].mbrp_size
&&
144 part
[i
].mbrp_start
< first_subpartition
)
145 first_subpartition
= part
[i
].mbrp_start
;
148 if (type
== TYPE_PART
) {
149 /* The target is a partition. Look up its starting offset. */
150 len
= strlen(device
);
151 strncpy(parent_name
, device
, len
- 2);
152 parent_name
[len
- 2] = '\0';
154 if (minixfs3_read_mbr(parent_name
, buf
))
157 parent_partition
= 0;
158 for (i
= 0; i
< 4; i
++) {
159 struct mbr_partition
*p
= &part
[i
];
160 if (p
->mbrp_size
&& p
->mbrp_start
<= first_subpartition
161 && (p
->mbrp_start
+ p
->mbrp_size
) >
162 first_subpartition
) {
163 parent_partition
= p
->mbrp_start
;
168 /* The target is a whole disk. The starting offset is 0. */
169 parent_partition
= 0;
172 if ((first_subpartition
- parent_partition
) < MFS_FIRST_SUBP_OFFSET
)