summaryrefslogtreecommitdiffstats
path: root/lib/libdisk/disk.c
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1998-09-30 21:40:51 +0000
committerjkh <jkh@FreeBSD.org>1998-09-30 21:40:51 +0000
commite2bde560d54e66f5d48e1c30fe503b90598389a6 (patch)
tree7f29e85c2ae84aa75810ff23268eb0fa8e6b377c /lib/libdisk/disk.c
parent0e9aa6252248eafcd5f8e457f96039dd49733388 (diff)
downloadFreeBSD-src-e2bde560d54e66f5d48e1c30fe503b90598389a6.zip
FreeBSD-src-e2bde560d54e66f5d48e1c30fe503b90598389a6.tar.gz
Eliminate unaligned access on Alpha and also neaten up this code a little.
Submitted by: dfr
Diffstat (limited to 'lib/libdisk/disk.c')
-rw-r--r--lib/libdisk/disk.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/lib/libdisk/disk.c b/lib/libdisk/disk.c
index c6ffeeb..f95f1c1 100644
--- a/lib/libdisk/disk.c
+++ b/lib/libdisk/disk.c
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id: disk.c,v 1.35 1998/05/19 11:15:44 obrien Exp $
+ * $Id: disk.c,v 1.36 1998/09/15 10:23:17 gibbs Exp $
*
*/
@@ -43,6 +43,23 @@ Open_Disk(const char *name)
return Int_Open_Disk(name,0);
}
+static u_int32_t
+Read_Int32(u_int32_t *p)
+{
+ u_int8_t *bp = (u_int8_t *)p;
+ return bp[0] | (bp[1] << 8) | (bp[2] << 16) | (bp[3] << 24);
+}
+
+static void
+Write_Int32(u_int32_t *p, u_int32_t v)
+{
+ u_int8_t *bp = (u_int8_t *)p;
+ bp[0] = (v >> 0) & 0xff;
+ bp[1] = (v >> 8) & 0xff;
+ bp[2] = (v >> 16) & 0xff;
+ bp[3] = (v >> 24) & 0xff;
+}
+
struct disk *
Int_Open_Disk(const char *name, u_long size)
{
@@ -94,10 +111,13 @@ Int_Open_Disk(const char *name, u_long size)
p = read_block(fd,0);
dp = (struct dos_partition*)(p+DOSPARTOFF);
- for(i=0;i<NDOSPART;i++) {
- if (dp->dp_start >= size) continue;
- if (dp->dp_start+dp->dp_size >= size) continue;
- if (!dp->dp_size) continue;
+ for (i=0; i < NDOSPART; i++) {
+ if (Read_Int32(&dp->dp_start) >= size)
+ continue;
+ if (Read_Int32(&dp->dp_start) + Read_Int32(&dp->dp_size) >= size)
+ continue;
+ if (!Read_Int32(&dp->dp_size))
+ continue;
if (dp->dp_typ == DOSPTYP_ONTRACK) {
d->flags |= DISK_ON_TRACK;
OpenPOWER on IntegriCloud