summaryrefslogtreecommitdiffstats
path: root/release/libdisk/disk.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1995-04-30 11:04:16 +0000
committerphk <phk@FreeBSD.org>1995-04-30 11:04:16 +0000
commit207cc9aa1b7958de0f80495004bef9a3d7cd67bd (patch)
treee2d59f880d13ec0362f8f6337a1f6cb182b43c1a /release/libdisk/disk.c
parent5eb0a0c02bef0c30ced9bca8f78a0f78c3febe1b (diff)
downloadFreeBSD-src-207cc9aa1b7958de0f80495004bef9a3d7cd67bd.zip
FreeBSD-src-207cc9aa1b7958de0f80495004bef9a3d7cd67bd.tar.gz
get bootblocks right.
Add mbr and bteasy17 to tst01 read partitions from kernel instead of disk. Still problems with writing labels, discussing with Bruce. Extended slices doesn't get written yet.
Diffstat (limited to 'release/libdisk/disk.c')
-rw-r--r--release/libdisk/disk.c107
1 files changed, 62 insertions, 45 deletions
diff --git a/release/libdisk/disk.c b/release/libdisk/disk.c
index c73d819..f421224 100644
--- a/release/libdisk/disk.c
+++ b/release/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.6 1995/04/30 06:09:26 phk Exp $
+ * $Id: disk.c,v 1.7 1995/04/30 07:30:43 phk Exp $
*
*/
@@ -65,6 +65,12 @@ Int_Open_Disk(char *name, u_long size)
return 0;
}
+ for(i=0;i<ds.dss_nslices;i++)
+ if(ds.dss_slices[i].ds_openmask)
+ printf(" open(%d)=0x%2x",
+ i,ds.dss_slices[i].ds_openmask);
+ printf("\n");
+
if (!size)
size = ds.dss_slices[WHOLE_DISK_SLICE].ds_size;
@@ -97,7 +103,7 @@ Int_Open_Disk(char *name, u_long size)
if (Add_Chunk(d, 0, 1, "-",reserved,0,0))
warn("Failed to add MBR chunk");
- for(i=BASE_SLICE;i < 12 && i<ds.dss_nslices;i++) {
+ for(i=BASE_SLICE;i<ds.dss_nslices;i++) {
char sname[20];
chunk_e ce;
u_long flags=0;
@@ -105,12 +111,13 @@ Int_Open_Disk(char *name, u_long size)
if (! ds.dss_slices[i].ds_size)
continue;
sprintf(sname,"%ss%d",name,i-1);
+ subtype = ds.dss_slices[i].ds_type;
switch (ds.dss_slices[i].ds_type) {
case 0xa5:
ce = freebsd;
break;
case 0x1:
- case 0x6:
+ case 0x4:
ce = fat;
break;
case DOSPTYP_EXTENDED:
@@ -118,7 +125,6 @@ Int_Open_Disk(char *name, u_long size)
break;
default:
ce = foo;
- subtype = -ds.dss_slices[i].ds_type;
break;
}
flags |= CHUNK_ALIGN;
@@ -129,45 +135,56 @@ Int_Open_Disk(char *name, u_long size)
if (Add_Chunk(d,ds.dss_slices[i].ds_offset,
1, "-",reserved, subtype, flags))
warn("failed to add MBR chunk for slice %d",i - 1);
- if (ds.dss_slices[i].ds_type == 0xa5) {
- struct disklabel *dl;
+ if (ds.dss_slices[i].ds_type != 0xa5)
+ continue;
+ {
+ struct disklabel dl;
+ char pname[20];
+ int j,k;
- dl = read_disklabel(fd,
- ds.dss_slices[i].ds_offset + LABELSECTOR);
- if(dl) {
- char pname[20];
- int j;
- u_long l;
- if (dl->d_partitions[RAW_PART].p_offset == 0 &&
- dl->d_partitions[RAW_PART].p_size ==
- ds.dss_slices[i].ds_size)
- l = ds.dss_slices[i].ds_offset;
- else
- l = 0;
- for(j=0; j < dl->d_npartitions; j++) {
- sprintf(pname,"%s%c",sname,j+'a');
- if (j == RAW_PART || j == 3)
- continue;
- if (!dl->d_partitions[j].p_size)
- continue;
- if (Add_Chunk(d,
- dl->d_partitions[j].p_offset +
- l,
- dl->d_partitions[j].p_size,
- pname,part,0,0))
- warn(
- "Failed to add chunk for partition %c [%lu,%lu]",
- j + 'a',dl->d_partitions[j].p_offset,dl->d_partitions[j].p_size);
- }
- sprintf(pname,"%sd",sname);
- if (dl->d_partitions[3].p_size)
- Add_Chunk(d,
- dl->d_partitions[3].p_offset +
- l,
- dl->d_partitions[3].p_size,
- pname,part,0,0);
- free(dl);
+ strcpy(pname,"/dev/r");
+ strcat(pname,sname);
+ j = open(pname,O_RDONLY);
+ if (j < 0) {
+ warn("open(%s)",pname);
+ continue;
+ }
+ k = ioctl(j,DIOCGDINFO,&dl);
+ if (k < 0) {
+ warn("ioctl(%s,DIOCGDINFO)",pname);
+ close(j);
+ continue;
+ }
+ close(j);
+
+ for(j=0; j <= dl.d_npartitions; j++) {
+ if (j == RAW_PART)
+ continue;
+ if (j == 3)
+ continue;
+ if (j == dl.d_npartitions) {
+ j = 3;
+ dl.d_npartitions=0;
}
+ if (!dl.d_partitions[j].p_size)
+ continue;
+ if (dl.d_partitions[j].p_size +
+ dl.d_partitions[j].p_offset >
+ ds.dss_slices[i].ds_size)
+ continue;
+ sprintf(pname,"%s%c",sname,j+'a');
+ if (Add_Chunk(d,
+ dl.d_partitions[j].p_offset +
+ ds.dss_slices[i].ds_offset,
+ dl.d_partitions[j].p_size,
+ pname,part,
+ dl.d_partitions[j].p_fstype,
+ 0) && j != 3)
+ warn(
+ "Failed to add chunk for partition %c [%lu,%lu]",
+ j + 'a',dl.d_partitions[j].p_offset,
+ dl.d_partitions[j].p_size);
+ }
}
}
close(fd);
@@ -216,8 +233,8 @@ Clone_Disk(struct disk *d)
memcpy(d2->boot1,d->boot1,512);
}
if(d2->boot2) {
- d2->boot2 = malloc(512*7);
- memcpy(d2->boot2,d->boot2,512*7);
+ d2->boot2 = malloc(512*15);
+ memcpy(d2->boot2,d->boot2,512*15);
}
return d2;
}
@@ -284,7 +301,7 @@ Set_Boot_Blocks(struct disk *d, u_char *b1, u_char *b2)
if(!d->boot1) err(1,"malloc failed");
memcpy(d->boot1,b1,512);
if (d->boot2) free(d->boot2);
- d->boot2 = malloc(7*512);
+ d->boot2 = malloc(15*512);
if(!d->boot2) err(1,"malloc failed");
- memcpy(d->boot2,b2,7*512);
+ memcpy(d->boot2,b2,15*512);
}
OpenPOWER on IntegriCloud