Recognize slice type #6 as dos

handle OnTrack Disk manager correctly.
This commit is contained in:
Poul-Henning Kamp 1995-05-08 02:08:33 +00:00
parent 0f15ab39ec
commit d81adf1ebe
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=8346
8 changed files with 56 additions and 24 deletions

View File

@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $Id: chunk.c,v 1.9 1995/05/07 01:25:22 jkh Exp $
* $Id: chunk.c,v 1.10 1995/05/07 01:28:16 jkh Exp $
*
*/
@ -173,7 +173,7 @@ Insert_Chunk(struct chunk *c2, u_long offset, u_long size, char *name, chunk_e t
}
int
Add_Chunk(struct disk *d, u_long offset, u_long size, char *name, chunk_e type,
Add_Chunk(struct disk *d, long offset, u_long size, char *name, chunk_e type,
int subtype, u_long flags)
{
struct chunk *c1,*c2,ct;
@ -264,7 +264,7 @@ Print_Chunk(struct chunk *c1,int offset)
for(;i<offset;i++) putchar('-');
putchar('>');
for(;i<10;i++) putchar(' ');
printf("%p %8lu %8lu %8lu %-8s %-8s 0x%02x ",
printf("%p %8ld %8lu %8lu %-8s %-8s 0x%02x ",
c1, c1->offset, c1->size, c1->end, c1->name,
chunk_n[c1->type],c1->subtype);
if (c1->flags & CHUNK_ALIGN) putchar('=');

View File

@ -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.16 1995/05/04 07:00:54 phk Exp $
* $Id: disk.c,v 1.17 1995/05/06 03:28:29 phk Exp $
*
*/
@ -53,6 +53,7 @@ Int_Open_Disk(char *name, u_long size)
struct disk *d;
struct dos_partition *dp;
void *p;
u_long offset = 0;
strcpy(device,"/dev/r");
strcat(device,name);
@ -94,8 +95,10 @@ Int_Open_Disk(char *name, u_long size)
if (dp->dp_start+dp->dp_size >= size) continue;
if (!dp->dp_size) continue;
if (dp->dp_typ == DOSPTYP_ONTRACK)
if (dp->dp_typ == DOSPTYP_ONTRACK) {
d->flags |= DISK_ON_TRACK;
offset = 63;
}
}
free(p);
@ -109,7 +112,7 @@ Int_Open_Disk(char *name, u_long size)
if (dl.d_ntracks && dl.d_nsectors)
d->bios_cyl = size/(dl.d_ntracks*dl.d_nsectors);
if (Add_Chunk(d, 0, size, name,whole,0,0))
if (Add_Chunk(d, -offset, size, name,whole,0,0))
warn("Failed to add 'whole' chunk");
for(i=BASE_SLICE;i<ds.dss_nslices;i++) {
@ -119,6 +122,7 @@ Int_Open_Disk(char *name, u_long size)
int subtype=0;
if (! ds.dss_slices[i].ds_size)
continue;
ds.dss_slices[i].ds_offset -= offset;
sprintf(sname,"%ss%d",name,i-1);
subtype = ds.dss_slices[i].ds_type;
switch (ds.dss_slices[i].ds_type) {
@ -126,6 +130,7 @@ Int_Open_Disk(char *name, u_long size)
ce = freebsd;
break;
case 0x1:
case 0x6:
case 0x4:
ce = fat;
break;

View File

@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $Id: libdisk.h,v 1.12 1995/05/04 07:00:55 phk Exp $
* $Id: libdisk.h,v 1.13 1995/05/06 03:28:30 phk Exp $
*
*/
@ -44,7 +44,7 @@ struct disk {
struct chunk {
struct chunk *next;
struct chunk *part;
u_long offset;
long offset;
u_long size;
u_long end;
char *name;
@ -206,7 +206,7 @@ Prev_Track_Aligned(struct disk *d, u_long offset);
void Debug_Chunk(struct chunk *);
void Free_Chunk(struct chunk *);
struct chunk * Clone_Chunk(struct chunk *);
int Add_Chunk(struct disk *, u_long , u_long , char *, chunk_e, int , u_long);
int Add_Chunk(struct disk *, long , u_long , char *, chunk_e, int , u_long);
void Bios_Limit_Chunk(struct chunk *, u_long);
void * read_block(int, daddr_t );
void write_block(int fd, daddr_t block, void *foo);

View File

@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $Id: write_disk.c,v 1.7 1995/05/04 07:00:57 phk Exp $
* $Id: write_disk.c,v 1.8 1995/05/06 03:28:32 phk Exp $
*
*/
@ -64,7 +64,6 @@ Write_FreeBSD(int fd, struct disk *new, struct disk *old, struct chunk *c1)
dl->d_partitions[j].p_size = c2->size;
dl->d_partitions[j].p_offset = c2->offset;
dl->d_partitions[j].p_fstype = c2->subtype;
}
dl->d_bbsize = BBSIZE;
@ -84,6 +83,10 @@ Write_FreeBSD(int fd, struct disk *new, struct disk *old, struct chunk *c1)
dl->d_partitions[RAW_PART].p_size = c1->size;
dl->d_partitions[RAW_PART].p_offset = c1->offset;
if(new->flags & DISK_ON_TRACK)
for(i=0;i<MAXPARTITIONS;i++)
if (dl->d_partitions[i].p_size)
dl->d_partitions[i].p_offset += 63;
dl->d_magic = DISKMAGIC;
dl->d_magic2 = DISKMAGIC;
dl->d_checksum = dkcksum(dl);
@ -189,9 +192,17 @@ Write_Disk(struct disk *d1)
else
dp[j].dp_flag = 0;
}
for(i=0;i<NDOSPART;i++)
j = 0;
for(i=0;i<NDOSPART;i++) {
if (!s[i])
memset(dp+i,0,sizeof *dp);
if (dp[i].dp_flag)
j++;
}
if (!j)
for(i=0;i<NDOSPART;i++)
if (dp[j].dp_typ == 0xa5)
dp[i].dp_flag = 0x80;
mbr = read_block(fd,0);
if (d1->bootmgr)

View File

@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $Id: chunk.c,v 1.9 1995/05/07 01:25:22 jkh Exp $
* $Id: chunk.c,v 1.10 1995/05/07 01:28:16 jkh Exp $
*
*/
@ -173,7 +173,7 @@ Insert_Chunk(struct chunk *c2, u_long offset, u_long size, char *name, chunk_e t
}
int
Add_Chunk(struct disk *d, u_long offset, u_long size, char *name, chunk_e type,
Add_Chunk(struct disk *d, long offset, u_long size, char *name, chunk_e type,
int subtype, u_long flags)
{
struct chunk *c1,*c2,ct;
@ -264,7 +264,7 @@ Print_Chunk(struct chunk *c1,int offset)
for(;i<offset;i++) putchar('-');
putchar('>');
for(;i<10;i++) putchar(' ');
printf("%p %8lu %8lu %8lu %-8s %-8s 0x%02x ",
printf("%p %8ld %8lu %8lu %-8s %-8s 0x%02x ",
c1, c1->offset, c1->size, c1->end, c1->name,
chunk_n[c1->type],c1->subtype);
if (c1->flags & CHUNK_ALIGN) putchar('=');

View File

@ -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.16 1995/05/04 07:00:54 phk Exp $
* $Id: disk.c,v 1.17 1995/05/06 03:28:29 phk Exp $
*
*/
@ -53,6 +53,7 @@ Int_Open_Disk(char *name, u_long size)
struct disk *d;
struct dos_partition *dp;
void *p;
u_long offset = 0;
strcpy(device,"/dev/r");
strcat(device,name);
@ -94,8 +95,10 @@ Int_Open_Disk(char *name, u_long size)
if (dp->dp_start+dp->dp_size >= size) continue;
if (!dp->dp_size) continue;
if (dp->dp_typ == DOSPTYP_ONTRACK)
if (dp->dp_typ == DOSPTYP_ONTRACK) {
d->flags |= DISK_ON_TRACK;
offset = 63;
}
}
free(p);
@ -109,7 +112,7 @@ Int_Open_Disk(char *name, u_long size)
if (dl.d_ntracks && dl.d_nsectors)
d->bios_cyl = size/(dl.d_ntracks*dl.d_nsectors);
if (Add_Chunk(d, 0, size, name,whole,0,0))
if (Add_Chunk(d, -offset, size, name,whole,0,0))
warn("Failed to add 'whole' chunk");
for(i=BASE_SLICE;i<ds.dss_nslices;i++) {
@ -119,6 +122,7 @@ Int_Open_Disk(char *name, u_long size)
int subtype=0;
if (! ds.dss_slices[i].ds_size)
continue;
ds.dss_slices[i].ds_offset -= offset;
sprintf(sname,"%ss%d",name,i-1);
subtype = ds.dss_slices[i].ds_type;
switch (ds.dss_slices[i].ds_type) {
@ -126,6 +130,7 @@ Int_Open_Disk(char *name, u_long size)
ce = freebsd;
break;
case 0x1:
case 0x6:
case 0x4:
ce = fat;
break;

View File

@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $Id: libdisk.h,v 1.12 1995/05/04 07:00:55 phk Exp $
* $Id: libdisk.h,v 1.13 1995/05/06 03:28:30 phk Exp $
*
*/
@ -44,7 +44,7 @@ struct disk {
struct chunk {
struct chunk *next;
struct chunk *part;
u_long offset;
long offset;
u_long size;
u_long end;
char *name;
@ -206,7 +206,7 @@ Prev_Track_Aligned(struct disk *d, u_long offset);
void Debug_Chunk(struct chunk *);
void Free_Chunk(struct chunk *);
struct chunk * Clone_Chunk(struct chunk *);
int Add_Chunk(struct disk *, u_long , u_long , char *, chunk_e, int , u_long);
int Add_Chunk(struct disk *, long , u_long , char *, chunk_e, int , u_long);
void Bios_Limit_Chunk(struct chunk *, u_long);
void * read_block(int, daddr_t );
void write_block(int fd, daddr_t block, void *foo);

View File

@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $Id: write_disk.c,v 1.7 1995/05/04 07:00:57 phk Exp $
* $Id: write_disk.c,v 1.8 1995/05/06 03:28:32 phk Exp $
*
*/
@ -64,7 +64,6 @@ Write_FreeBSD(int fd, struct disk *new, struct disk *old, struct chunk *c1)
dl->d_partitions[j].p_size = c2->size;
dl->d_partitions[j].p_offset = c2->offset;
dl->d_partitions[j].p_fstype = c2->subtype;
}
dl->d_bbsize = BBSIZE;
@ -84,6 +83,10 @@ Write_FreeBSD(int fd, struct disk *new, struct disk *old, struct chunk *c1)
dl->d_partitions[RAW_PART].p_size = c1->size;
dl->d_partitions[RAW_PART].p_offset = c1->offset;
if(new->flags & DISK_ON_TRACK)
for(i=0;i<MAXPARTITIONS;i++)
if (dl->d_partitions[i].p_size)
dl->d_partitions[i].p_offset += 63;
dl->d_magic = DISKMAGIC;
dl->d_magic2 = DISKMAGIC;
dl->d_checksum = dkcksum(dl);
@ -189,9 +192,17 @@ Write_Disk(struct disk *d1)
else
dp[j].dp_flag = 0;
}
for(i=0;i<NDOSPART;i++)
j = 0;
for(i=0;i<NDOSPART;i++) {
if (!s[i])
memset(dp+i,0,sizeof *dp);
if (dp[i].dp_flag)
j++;
}
if (!j)
for(i=0;i<NDOSPART;i++)
if (dp[j].dp_typ == 0xa5)
dp[i].dp_flag = 0x80;
mbr = read_block(fd,0);
if (d1->bootmgr)