1 /* $NetBSD: bsdlabel.c,v 1.3 2009/03/18 17:06:43 cegger Exp $ */
4 * Copyright (c) 1995 Waldi Ravens.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Waldi Ravens.
18 * 4. The name of the author may not be used to endorse or promote products
19 * derived from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #include <sys/types.h>
42 static int dkcksum
PROTO((struct disklabel
*));
45 bsd_getlabel(disk_t
*dd
, struct disklabel
*dlp
, u_int offset
)
51 nsec
= (BBMINSIZE
+ (dd
->bsize
- 1)) / dd
->bsize
;
52 bblk
= disk_read(dd
, offset
, nsec
);
56 end
= (u_int
*)&bblk
[BBMINSIZE
- sizeof(struct disklabel
)];
58 for (p
= (u_int
*)bblk
; p
< end
; ++p
) {
59 struct disklabel
*dl
= (struct disklabel
*)&p
[1];
60 if ( ( (p
[0] == NBDAMAGIC
&& offset
== 0)
61 || (p
[0] == AHDIMAGIC
&& offset
!= 0)
62 || (u_char
*)dl
- bblk
== 7168
64 && dl
->d_npartitions
<= MAXPARTITIONS
65 && dl
->d_magic2
== DISKMAGIC
66 && dl
->d_magic
== DISKMAGIC
69 memcpy(dlp
, dl
, sizeof(*dlp
));
82 dkcksum(struct disklabel
*dl
)
84 u_short
*start
, *end
, sum
= 0;
86 start
= (u_short
*)dl
;
87 end
= (u_short
*)&dl
->d_partitions
[dl
->d_npartitions
];