xref: /csrg-svn/sys/stand/disklabel.c (revision 63370)
163273Smckusick /*-
2*63370Sbostic  * Copyright (c) 1993
3*63370Sbostic  *	The Regents of the University of California.  All rights reserved.
463273Smckusick  *
563273Smckusick  * %sccs.include.redist.c%
663273Smckusick  *
7*63370Sbostic  *	@(#)disklabel.c	8.1 (Berkeley) 06/11/93
863273Smckusick  */
963273Smckusick 
1063273Smckusick #include <sys/param.h>
1163273Smckusick #include <sys/disklabel.h>
1263273Smckusick 
1363273Smckusick char *
getdisklabel(buf,lp)1463273Smckusick getdisklabel(buf, lp)
1563273Smckusick 	const char *buf;
1663273Smckusick 	struct disklabel *lp;
1763273Smckusick {
1863273Smckusick 	register struct buf *bp;
1963273Smckusick 	struct disklabel *dlp, *elp;
2063273Smckusick 	char *msg = (char *)0;
2163273Smckusick 
2263273Smckusick 	elp = (struct disklabel *)(buf + DEV_BSIZE - sizeof(*dlp));
2363273Smckusick 	for (dlp = (struct disklabel *)buf; dlp <= elp;
2463273Smckusick 	    dlp = (struct disklabel *)((char *)dlp + sizeof(long))) {
2563273Smckusick 		if (dlp->d_magic != DISKMAGIC || dlp->d_magic2 != DISKMAGIC) {
2663273Smckusick 			if (msg == (char *)0)
2763273Smckusick 				msg = "no disk label";
2863273Smckusick 		} else if (dlp->d_npartitions > MAXPARTITIONS ||
2963273Smckusick 			   dkcksum(dlp) != 0)
3063273Smckusick 			msg = "disk label corrupted";
3163273Smckusick 		else {
3263273Smckusick 			*lp = *dlp;
3363273Smckusick 			msg = (char *)0;
3463273Smckusick 			break;
3563273Smckusick 		}
3663273Smckusick 	}
3763273Smckusick 	return (msg);
3863273Smckusick }
3963273Smckusick 
4063273Smckusick /*
4163273Smckusick  * Compute checksum for disk label.
4263273Smckusick  */
dkcksum(lp)4363273Smckusick dkcksum(lp)
4463273Smckusick 	register struct disklabel *lp;
4563273Smckusick {
4663273Smckusick 	register u_short *start, *end;
4763273Smckusick 	register u_short sum = 0;
4863273Smckusick 
4963273Smckusick 	start = (u_short *)lp;
5063273Smckusick 	end = (u_short *)&lp->d_partitions[lp->d_npartitions];
5163273Smckusick 	while (start < end)
5263273Smckusick 		sum ^= *start++;
5363273Smckusick 	return (sum);
5463273Smckusick }
55