xref: /minix3/usr.sbin/installboot/fstypes.c (revision 9f8e6353e54579f3834bed052b7960946fc4bb01)
1*9f8e6353SEvgeniy Ivanov /*	$NetBSD: fstypes.c,v 1.13 2010/01/14 16:27:49 tsutsui Exp $	*/
2*9f8e6353SEvgeniy Ivanov 
3*9f8e6353SEvgeniy Ivanov /*-
4*9f8e6353SEvgeniy Ivanov  * Copyright (c) 2002 The NetBSD Foundation, Inc.
5*9f8e6353SEvgeniy Ivanov  * All rights reserved.
6*9f8e6353SEvgeniy Ivanov  *
7*9f8e6353SEvgeniy Ivanov  * This code is derived from software contributed to The NetBSD Foundation
8*9f8e6353SEvgeniy Ivanov  * by Matt Fredette and Luke Mewburn.
9*9f8e6353SEvgeniy Ivanov  *
10*9f8e6353SEvgeniy Ivanov  * Redistribution and use in source and binary forms, with or without
11*9f8e6353SEvgeniy Ivanov  * modification, are permitted provided that the following conditions
12*9f8e6353SEvgeniy Ivanov  * are met:
13*9f8e6353SEvgeniy Ivanov  * 1. Redistributions of source code must retain the above copyright
14*9f8e6353SEvgeniy Ivanov  *    notice, this list of conditions and the following disclaimer.
15*9f8e6353SEvgeniy Ivanov  * 2. Redistributions in binary form must reproduce the above copyright
16*9f8e6353SEvgeniy Ivanov  *    notice, this list of conditions and the following disclaimer in the
17*9f8e6353SEvgeniy Ivanov  *    documentation and/or other materials provided with the distribution.
18*9f8e6353SEvgeniy Ivanov  *
19*9f8e6353SEvgeniy Ivanov  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*9f8e6353SEvgeniy Ivanov  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*9f8e6353SEvgeniy Ivanov  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*9f8e6353SEvgeniy Ivanov  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*9f8e6353SEvgeniy Ivanov  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*9f8e6353SEvgeniy Ivanov  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*9f8e6353SEvgeniy Ivanov  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*9f8e6353SEvgeniy Ivanov  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*9f8e6353SEvgeniy Ivanov  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*9f8e6353SEvgeniy Ivanov  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*9f8e6353SEvgeniy Ivanov  * POSSIBILITY OF SUCH DAMAGE.
30*9f8e6353SEvgeniy Ivanov  */
31*9f8e6353SEvgeniy Ivanov 
32*9f8e6353SEvgeniy Ivanov #if HAVE_NBTOOL_CONFIG_H
33*9f8e6353SEvgeniy Ivanov #include "nbtool_config.h"
34*9f8e6353SEvgeniy Ivanov #endif
35*9f8e6353SEvgeniy Ivanov 
36*9f8e6353SEvgeniy Ivanov #include <sys/cdefs.h>
37*9f8e6353SEvgeniy Ivanov #if !defined(__lint)
38*9f8e6353SEvgeniy Ivanov __RCSID("$NetBSD: fstypes.c,v 1.13 2010/01/14 16:27:49 tsutsui Exp $");
39*9f8e6353SEvgeniy Ivanov #endif	/* !__lint */
40*9f8e6353SEvgeniy Ivanov 
41*9f8e6353SEvgeniy Ivanov #include <sys/types.h>
42*9f8e6353SEvgeniy Ivanov 
43*9f8e6353SEvgeniy Ivanov #include <assert.h>
44*9f8e6353SEvgeniy Ivanov #include <err.h>
45*9f8e6353SEvgeniy Ivanov #include <stdio.h>
46*9f8e6353SEvgeniy Ivanov 
47*9f8e6353SEvgeniy Ivanov #include "installboot.h"
48*9f8e6353SEvgeniy Ivanov 
49*9f8e6353SEvgeniy Ivanov struct ib_fs fstypes[] = {
50*9f8e6353SEvgeniy Ivanov #ifndef NO_STAGE2
51*9f8e6353SEvgeniy Ivanov 	{ .name = "ffs",  .match = ffs_match,	.findstage2 = ffs_findstage2	},
52*9f8e6353SEvgeniy Ivanov 	{ .name = "raid", .match = raid_match,	.findstage2 = ffs_findstage2	},
53*9f8e6353SEvgeniy Ivanov 	{ .name = "raw",  .match = raw_match,	.findstage2 = raw_findstage2	},
54*9f8e6353SEvgeniy Ivanov #endif
55*9f8e6353SEvgeniy Ivanov 	{ .name = NULL, }
56*9f8e6353SEvgeniy Ivanov };
57*9f8e6353SEvgeniy Ivanov 
58*9f8e6353SEvgeniy Ivanov #ifndef NO_STAGE2
59*9f8e6353SEvgeniy Ivanov int
hardcode_stage2(ib_params * params,uint32_t * maxblk,ib_block * blocks)60*9f8e6353SEvgeniy Ivanov hardcode_stage2(ib_params *params, uint32_t *maxblk, ib_block *blocks)
61*9f8e6353SEvgeniy Ivanov {
62*9f8e6353SEvgeniy Ivanov 	struct stat	s2sb;
63*9f8e6353SEvgeniy Ivanov 	uint32_t	nblk, i;
64*9f8e6353SEvgeniy Ivanov 
65*9f8e6353SEvgeniy Ivanov 	assert(params != NULL);
66*9f8e6353SEvgeniy Ivanov 	assert(params->stage2 != NULL);
67*9f8e6353SEvgeniy Ivanov 	assert(maxblk != NULL);
68*9f8e6353SEvgeniy Ivanov 	assert(blocks != NULL);
69*9f8e6353SEvgeniy Ivanov 	assert((params->flags & IB_STAGE2START) != 0);
70*9f8e6353SEvgeniy Ivanov 	assert(params->fstype != NULL);
71*9f8e6353SEvgeniy Ivanov 	assert(params->fstype->blocksize != 0);
72*9f8e6353SEvgeniy Ivanov 
73*9f8e6353SEvgeniy Ivanov 	if (stat(params->stage2, &s2sb) == -1) {
74*9f8e6353SEvgeniy Ivanov 		warn("Examining `%s'", params->stage2);
75*9f8e6353SEvgeniy Ivanov 		return (0);
76*9f8e6353SEvgeniy Ivanov 	}
77*9f8e6353SEvgeniy Ivanov 	if (!S_ISREG(s2sb.st_mode)) {
78*9f8e6353SEvgeniy Ivanov 		warnx("`%s' must be a regular file", params->stage2);
79*9f8e6353SEvgeniy Ivanov 		return (0);
80*9f8e6353SEvgeniy Ivanov 	}
81*9f8e6353SEvgeniy Ivanov 
82*9f8e6353SEvgeniy Ivanov 	nblk = s2sb.st_size / params->fstype->blocksize;
83*9f8e6353SEvgeniy Ivanov 	if (s2sb.st_size % params->fstype->blocksize != 0)
84*9f8e6353SEvgeniy Ivanov 		nblk++;
85*9f8e6353SEvgeniy Ivanov #if 0
86*9f8e6353SEvgeniy Ivanov 	fprintf(stderr, "for %s got size %lld blksize %u blocks %u\n",
87*9f8e6353SEvgeniy Ivanov 	    params->stage2, s2sb.st_size, params->fstype->blocksize, nblk);
88*9f8e6353SEvgeniy Ivanov #endif
89*9f8e6353SEvgeniy Ivanov 	if (nblk > *maxblk) {
90*9f8e6353SEvgeniy Ivanov                 warnx("Secondary bootstrap `%s' has too many blocks "
91*9f8e6353SEvgeniy Ivanov                     "(calculated %u, maximum %u)",
92*9f8e6353SEvgeniy Ivanov 		    params->stage2, nblk, *maxblk);
93*9f8e6353SEvgeniy Ivanov                 return (0);
94*9f8e6353SEvgeniy Ivanov         }
95*9f8e6353SEvgeniy Ivanov 
96*9f8e6353SEvgeniy Ivanov 	for (i = 0; i < nblk; i++) {
97*9f8e6353SEvgeniy Ivanov 		blocks[i].block = params->s2start +
98*9f8e6353SEvgeniy Ivanov 		    i * (params->fstype->blocksize / params->sectorsize);
99*9f8e6353SEvgeniy Ivanov 		blocks[i].blocksize = params->fstype->blocksize;
100*9f8e6353SEvgeniy Ivanov 	}
101*9f8e6353SEvgeniy Ivanov 	*maxblk = nblk;
102*9f8e6353SEvgeniy Ivanov 
103*9f8e6353SEvgeniy Ivanov 	return (1);
104*9f8e6353SEvgeniy Ivanov }
105*9f8e6353SEvgeniy Ivanov 
106*9f8e6353SEvgeniy Ivanov 
107*9f8e6353SEvgeniy Ivanov int
raw_match(ib_params * params)108*9f8e6353SEvgeniy Ivanov raw_match(ib_params *params)
109*9f8e6353SEvgeniy Ivanov {
110*9f8e6353SEvgeniy Ivanov 
111*9f8e6353SEvgeniy Ivanov 	assert(params != NULL);
112*9f8e6353SEvgeniy Ivanov 	assert(params->fstype != NULL);
113*9f8e6353SEvgeniy Ivanov 
114*9f8e6353SEvgeniy Ivanov 	params->fstype->blocksize = 8192;		// XXX: hardcode
115*9f8e6353SEvgeniy Ivanov 	return (1);		/* can always write to a "raw" file system */
116*9f8e6353SEvgeniy Ivanov }
117*9f8e6353SEvgeniy Ivanov 
118*9f8e6353SEvgeniy Ivanov int
raw_findstage2(ib_params * params,uint32_t * maxblk,ib_block * blocks)119*9f8e6353SEvgeniy Ivanov raw_findstage2(ib_params *params, uint32_t *maxblk, ib_block *blocks)
120*9f8e6353SEvgeniy Ivanov {
121*9f8e6353SEvgeniy Ivanov 
122*9f8e6353SEvgeniy Ivanov 	assert(params != NULL);
123*9f8e6353SEvgeniy Ivanov 	assert(params->stage2 != NULL);
124*9f8e6353SEvgeniy Ivanov 	assert(maxblk != NULL);
125*9f8e6353SEvgeniy Ivanov 	assert(blocks != NULL);
126*9f8e6353SEvgeniy Ivanov 
127*9f8e6353SEvgeniy Ivanov 	if ((params->flags & IB_STAGE2START) == 0) {
128*9f8e6353SEvgeniy Ivanov 		warnx("Need `-B bno' for raw file systems");
129*9f8e6353SEvgeniy Ivanov 		return (0);
130*9f8e6353SEvgeniy Ivanov 	}
131*9f8e6353SEvgeniy Ivanov 	return (hardcode_stage2(params, maxblk, blocks));
132*9f8e6353SEvgeniy Ivanov }
133*9f8e6353SEvgeniy Ivanov #endif
134