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