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)1463273Smckusickgetdisklabel(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)4363273Smckusickdkcksum(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