Deleted Added
sdiff udiff text old ( 93776 ) new ( 94287 )
full compact
1/*-
2 * Copyright (c) 2002 Poul-Henning Kamp
3 * Copyright (c) 2002 Networks Associates Technology, Inc.
4 * All rights reserved.
5 *
6 * This software was developed for the FreeBSD Project by Poul-Henning Kamp
7 * and NAI Labs, the Security Research Division of Network Associates, Inc.
8 * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the

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

27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * $FreeBSD: head/sys/geom/geom_bsd.c 93776 2002-04-04 09:54:13Z phk $
36 */
37
38
39#include <sys/param.h>
40#ifndef _KERNEL
41#include <stdio.h>
42#include <string.h>
43#include <stdlib.h>

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

221 while (p < pe) {
222 sum ^= g_dec_le2(p);
223 p += 2;
224 }
225 return (sum);
226}
227
228static int
229g_bsd_i386(struct g_consumer *cp, int secsize, struct disklabel *dl)
230{
231 int error;
232 u_char *buf;
233
234 buf = g_read_data(cp, secsize * 1, secsize, &error);
235 if (buf == NULL || error != 0)
236 return(ENOENT);
237 g_bsd_ledec_disklabel(buf, dl);
238 if (dl->d_magic == DISKMAGIC &&
239 dl->d_magic2 == DISKMAGIC &&
240 g_bsd_lesum(dl, buf) == 0)
241 error = 0;
242 else
243 error = ENOENT;
244 g_free(buf);
245 return(error);
246}
247
248static int
249g_bsd_alpha(struct g_consumer *cp, int secsize, struct disklabel *dl)
250{
251 int error;
252 u_char *buf;
253
254 buf = g_read_data(cp, 0, secsize, &error);
255 if (buf == NULL || error != 0)
256 return(ENOENT);
257 g_bsd_ledec_disklabel(buf + 64, dl);
258 if (dl->d_magic == DISKMAGIC &&
259 dl->d_magic2 == DISKMAGIC &&
260 g_bsd_lesum(dl, buf + 64) == 0)
261 error = 0;
262 else
263 error = ENOENT;
264 g_free(buf);
265 return(error);
266}
267
268static int
269g_bsd_start(struct bio *bp)
270{
271 struct g_geom *gp;
272 struct g_bsd_softc *ms;

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

315 struct g_provider *pp2;
316 int error, i, j, npart;
317 struct g_bsd_softc *ms;
318 struct disklabel *dl;
319 u_int secsize;
320 u_int fwsectors, fwheads;
321 off_t mediasize;
322 struct partition *ppp, *ppr;
323
324 g_trace(G_T_TOPOLOGY, "bsd_taste(%s,%s)", mp->name, pp->name);
325 g_topology_assert();
326 if (flags == G_TF_NORMAL &&
327 !strcmp(pp->geom->class->name, BSD_CLASS_NAME))
328 return (NULL);
329 gp = g_slice_new(mp, 8, pp, &cp, &ms, sizeof *ms, g_bsd_start);
330 if (gp == NULL)
331 return (NULL);
332 g_topology_unlock();
333 gp->dumpconf = g_bsd_dumpconf;
334 npart = 0;
335 while (1) { /* a trick to allow us to use break */
336 j = sizeof i;
337 error = g_io_getattr("MBR::type", cp, &j, &i);
338 if (!error && i != 165 && flags == G_TF_NORMAL)
339 break;
340 j = sizeof secsize;
341 error = g_io_getattr("GEOM::sectorsize", cp, &j, &secsize);
342 if (error) {
343 secsize = 512;
344 printf("g_bsd_taste: error %d Sectors are %d bytes\n",
345 error, secsize);
346 }
347 j = sizeof mediasize;
348 error = g_io_getattr("GEOM::mediasize", cp, &j, &mediasize);
349 if (error) {
350 mediasize = 0;
351 printf("g_error %d Mediasize is %lld bytes\n",
352 error, (long long)mediasize);
353 }
354 error = g_bsd_i386(cp, secsize, &ms->ondisk);
355 if (error)
356 error = g_bsd_alpha(cp, secsize, &ms->ondisk);
357 if (error)
358 break;
359 dl = &ms->ondisk;
360 if (bootverbose)
361 g_hexdump(dl, sizeof(*dl));
362 if (dl->d_secsize < secsize)
363 break;
364 if (dl->d_secsize > secsize)

--- 68 unchanged lines hidden ---