Sanitize and explain a little bit... Implement the first rules...
This commit is contained in:
parent
66c00a8f24
commit
f7bf327ed4
@ -1,6 +1,6 @@
|
||||
.PATH: /usr/src/sbin/disklabel
|
||||
OBJS= tst01.o blocks.o disklabel.o dkcksum.o chunk.o disk.o change.o \
|
||||
create_chunk.o
|
||||
create_chunk.o rules.o
|
||||
CFLAGS+= -Wall
|
||||
|
||||
test: tst01
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include <string.h>
|
||||
#include <err.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
struct disk *
|
||||
|
@ -15,11 +15,11 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <err.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
CHAR_N;
|
||||
|
||||
#define new_chunk() malloc(sizeof(struct chunk))
|
||||
|
||||
/* Is c2 completely inside c1 ? */
|
||||
@ -206,6 +206,10 @@ Add_Chunk(struct disk *d, u_long offset, u_long size, char *name, chunk_e type,
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
|
||||
if(!c1 && type == part)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,freebsd);
|
||||
if(!c1 && type == reserved)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,extended);
|
||||
if(!c1 && type == reserved)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
|
||||
if(!c1)
|
||||
return __LINE__;
|
||||
for(c2=c1->part;c2;c2=c2->next) {
|
||||
@ -252,26 +256,25 @@ Bios_Limit_Chunk(struct chunk *c1, u_long limit)
|
||||
}
|
||||
|
||||
int
|
||||
Delete_Chunk(struct disk *d, u_long offset, u_long end, chunk_e type)
|
||||
Delete_Chunk(struct disk *d, struct chunk *c)
|
||||
{
|
||||
struct chunk *c1=0,*c2,*c3;
|
||||
chunk_e type = c->type;
|
||||
|
||||
if(type == whole)
|
||||
return 1;
|
||||
if(!c1 && (type == freebsd || type == fat || type == foo))
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,extended);
|
||||
c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,extended);
|
||||
if(!c1 && (type == freebsd || type == fat || type == foo))
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
|
||||
c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,whole);
|
||||
if(!c1 && type == extended)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
|
||||
c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,whole);
|
||||
if(!c1 && type == part)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,freebsd);
|
||||
c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,freebsd);
|
||||
if(!c1)
|
||||
return 1;
|
||||
for(c2=c1->part;c2;c2=c2->next) {
|
||||
if (c2->offset == offset &&
|
||||
c2->end == end &&
|
||||
c2->type == type) {
|
||||
if (c2 == c) {
|
||||
c2->type = unused;
|
||||
c2->subtype = 0;
|
||||
c2->flags = 0;
|
||||
@ -329,7 +332,7 @@ Collapse_Chunk(struct disk *d, struct chunk *c1)
|
||||
return 0;
|
||||
|
||||
if(c3->type == unused && c3->size == c1->size) {
|
||||
Delete_Chunk(d,c1->offset, c1->end, c1->type);
|
||||
Delete_Chunk(d,c1);
|
||||
return 1;
|
||||
}
|
||||
if(c3->type == unused) {
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <err.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/diskslice.h>
|
||||
#include <sys/queue.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
#define DOSPTYP_EXTENDED 5
|
||||
@ -66,6 +65,7 @@ Int_Open_Disk(char *name, u_long size)
|
||||
size = ds.dss_slices[WHOLE_DISK_SLICE].ds_size;
|
||||
|
||||
Add_Chunk(d, 0, size, name,whole,0,0);
|
||||
Add_Chunk(d, 0, 1, "-",reserved,0,0);
|
||||
|
||||
for(i=2;i<ds.dss_nslices;i++) {
|
||||
char sname[20];
|
||||
@ -94,6 +94,9 @@ Int_Open_Disk(char *name, u_long size)
|
||||
flags |= CHUNK_ALIGN;
|
||||
Add_Chunk(d,ds.dss_slices[i].ds_offset,
|
||||
ds.dss_slices[i].ds_size, sname,ce,subtype,flags);
|
||||
if (ce == extended)
|
||||
Add_Chunk(d,ds.dss_slices[i].ds_offset,
|
||||
1, "-",reserved, subtype, flags);
|
||||
if (ds.dss_slices[i].ds_type == 0xa5) {
|
||||
struct disklabel *dl;
|
||||
int j;
|
||||
|
@ -1,13 +1,25 @@
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
|
||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
typedef enum {whole, foo, fat, freebsd, extended, part, unused, reserved} chunk_e;
|
||||
|
||||
#define CHAR_N static char *chunk_n[] = { \
|
||||
"whole","foo","fat","freebsd","extended","part","unused","reserved"};
|
||||
|
||||
struct disk {
|
||||
char *name;
|
||||
u_long flags;
|
||||
#define DISK_ON_TRACK 1
|
||||
#define DISK_REAL_GEOM 2
|
||||
# define DISK_ON_TRACK 1
|
||||
# define DISK_REAL_GEOM 2
|
||||
u_long real_cyl;
|
||||
u_long real_hd;
|
||||
u_long real_sect;
|
||||
@ -26,36 +38,79 @@ struct chunk {
|
||||
char *name;
|
||||
chunk_e type;
|
||||
int subtype;
|
||||
#define SUBTYPE_BSD_FS 1
|
||||
#define SUBTYPE_BSD_SWAP 2
|
||||
#define SUBTYPE_BSD_UNUSED 3
|
||||
# define SUBTYPE_BSD_FS 1
|
||||
# define SUBTYPE_BSD_SWAP 2
|
||||
# define SUBTYPE_BSD_UNUSED 3
|
||||
u_long flags;
|
||||
#define CHUNK_PAST_1024 1
|
||||
/* this chunk cannot be booted from */
|
||||
#define CHUNK_BSD_COMPAT 2
|
||||
/* this chunk is in the BSD-compatibility, and has a short name
|
||||
* too, ie wd0s4f -> wd0f
|
||||
*/
|
||||
#define CHUNK_BAD144 4
|
||||
/* this chunk has bad144 mapping */
|
||||
#define CHUNK_ALIGN 8
|
||||
# define CHUNK_PAST_1024 1
|
||||
/* this chunk cannot be booted from */
|
||||
# define CHUNK_BSD_COMPAT 2
|
||||
/* this chunk is in the BSD-compatibility, and has a
|
||||
* short name too, ie wd0s4f -> wd0f
|
||||
*/
|
||||
# define CHUNK_BAD144 4
|
||||
/* this chunk has bad144 mapping */
|
||||
# define CHUNK_ALIGN 8
|
||||
};
|
||||
|
||||
struct disk *Open_Disk(char *devname);
|
||||
void Free_Disk(struct disk *disk);
|
||||
void Debug_Disk(struct disk *disk);
|
||||
struct disk *Clone_Disk(struct disk *disk);
|
||||
struct disk *
|
||||
Open_Disk(char *devname);
|
||||
/* Will open the named disk, and return populated tree.
|
||||
*/
|
||||
|
||||
struct disk *Set_Phys_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
|
||||
void Set_Bios_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
|
||||
struct disk *
|
||||
Clone_Disk(struct disk *disk);
|
||||
/* Clone a copy of a tree. Useful for "Undo" functionality
|
||||
*/
|
||||
|
||||
int Delete_Chunk(struct disk *disk, u_long offset, u_long end, chunk_e type);
|
||||
void Collapse_Disk(struct disk *disk);
|
||||
int Collapse_Chunk(struct disk *disk, struct chunk *chunk);
|
||||
void
|
||||
Free_Disk(struct disk *disk);
|
||||
/* Free a tree made with Open_Disk() or Clone_Disk()
|
||||
*/
|
||||
|
||||
int Create_Chunk(struct disk *disk, u_long offset, u_long size, chunk_e type, int subtype, u_long flags);
|
||||
void
|
||||
Debug_Disk(struct disk *disk);
|
||||
/* Print the content of the tree to stdout
|
||||
*/
|
||||
|
||||
/* Implementation details */
|
||||
struct disk *
|
||||
Set_Phys_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
|
||||
/* Use a different physical geometry. Makes sense for ST506 disks only.
|
||||
* The tree returned is read from the disk, using this geometry.
|
||||
*/
|
||||
|
||||
void
|
||||
Set_Bios_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
|
||||
/* Set the geometry the bios uses.
|
||||
*/
|
||||
|
||||
int
|
||||
Delete_Chunk(struct disk *disk, struct chunk *);
|
||||
/* Free a chunk of disk_space
|
||||
*/
|
||||
|
||||
void
|
||||
Collapse_Disk(struct disk *disk);
|
||||
/* Experimental, do not use.
|
||||
*/
|
||||
int
|
||||
Collapse_Chunk(struct disk *disk, struct chunk *chunk);
|
||||
/* Experimental, do not use.
|
||||
*/
|
||||
|
||||
int
|
||||
Create_Chunk(struct disk *disk, u_long offset, u_long size, chunk_e type, int subtype, u_long flags);
|
||||
/* Create a chunk with the specified paramters
|
||||
*/
|
||||
|
||||
char *
|
||||
CheckRules(struct disk *);
|
||||
/* Return char* to warnings about broken design rules in this disklayout
|
||||
*/
|
||||
|
||||
/*
|
||||
* Implementation details >>> DO NOT USE <<<
|
||||
*/
|
||||
|
||||
struct disk *Int_Open_Disk(char *devname, u_long maxsize);
|
||||
|
||||
|
95
lib/libdisk/rules.c
Normal file
95
lib/libdisk/rules.c
Normal file
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
|
||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/diskslice.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <err.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
/*
|
||||
* Rule#0:
|
||||
* Chunks of type 'whole' can have max NDOSPART children.
|
||||
*/
|
||||
void
|
||||
Rule_000(struct disk *d, struct chunk *c, char *msg)
|
||||
{
|
||||
int i;
|
||||
struct chunk *c1;
|
||||
|
||||
if (c->type != whole)
|
||||
return;
|
||||
for (i=0, c1=c->part; c1; c1=c1->next)
|
||||
if (c1->type != unused)
|
||||
i++;
|
||||
if (i <= NDOSPART)
|
||||
return;
|
||||
sprintf(msg+strlen(msg),
|
||||
"%d is too many children of the 'whole' chunk. Max is %d\n",
|
||||
i, NDOSPART);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rule#1:
|
||||
* All children of 'whole' must be track-aligned
|
||||
*/
|
||||
void
|
||||
Rule_001(struct disk *d, struct chunk *c, char *msg)
|
||||
{
|
||||
int i;
|
||||
struct chunk *c1;
|
||||
|
||||
if (c->type != whole)
|
||||
return;
|
||||
for (i=0, c1=c->part; c1; c1=c1->next) {
|
||||
if (c1->type == reserved)
|
||||
continue;
|
||||
if (c1->type == unused)
|
||||
continue;
|
||||
if (!Aligned(d,c1->offset))
|
||||
sprintf(msg+strlen(msg),
|
||||
"chunk '%s' [%ld..%ld] does not start on a track boundary\n",
|
||||
c1->name,c1->offset,c1->end);
|
||||
if (!Aligned(d,c1->end+1))
|
||||
sprintf(msg+strlen(msg),
|
||||
"chunk '%s' [%ld..%ld] does not end on a track boundary\n",
|
||||
c1->name,c1->offset,c1->end);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Check_Chunk(struct disk *d, struct chunk *c, char *msg)
|
||||
{
|
||||
Rule_000(d,c,msg);
|
||||
Rule_001(d,c,msg);
|
||||
if (c->part)
|
||||
Check_Chunk(d,c->part,msg);
|
||||
if (c->next)
|
||||
Check_Chunk(d,c->next,msg);
|
||||
return;
|
||||
}
|
||||
|
||||
char *
|
||||
CheckRules(struct disk *d)
|
||||
{
|
||||
char msg[BUFSIZ];
|
||||
|
||||
*msg = '\0';
|
||||
Check_Chunk(d,d->chunks,msg);
|
||||
if (*msg)
|
||||
return strdup(msg);
|
||||
return 0;
|
||||
}
|
@ -14,37 +14,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/diskslice.h>
|
||||
#include <sys/queue.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
void
|
||||
fprint_diskslices(FILE *fi, struct diskslices *ds)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("@%p: struct diskslices\n",ds);
|
||||
printf("\tdss_first_bsd_slice = %d\n",ds->dss_first_bsd_slice);
|
||||
printf("\tdss_nslices = %d\n",ds->dss_nslices);
|
||||
for(i=0;i<ds->dss_nslices;i++) {
|
||||
printf("\tdss_slices[%d] = struct diskslice",i);
|
||||
if (i == 0)
|
||||
printf(" /* FreeBSD compatibility slice */\n");
|
||||
else if (i == 1)
|
||||
printf(" /* Whole disk slice */\n");
|
||||
else if (i < 6)
|
||||
printf(" /* Primary MBR slice %d */\n",i-1);
|
||||
else
|
||||
printf("\n");
|
||||
printf("\t\tds_offset = %lu\n",ds->dss_slices[i].ds_offset);
|
||||
printf("\t\tds_size = %lu\n",ds->dss_slices[i].ds_size);
|
||||
printf("\t\tds_type = %u\n",ds->dss_slices[i].ds_type);
|
||||
printf("\t\tds_openmask = %u\n",ds->dss_slices[i].ds_openmask);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
@ -55,12 +26,12 @@ main(int argc, char **argv)
|
||||
d = Open_Disk(argv[i]);
|
||||
if (!d) continue;
|
||||
Debug_Disk(d);
|
||||
Delete_Chunk(d,0,4108599,freebsd);
|
||||
Debug_Disk(d);
|
||||
printf("Create=%d\n",Create_Chunk(d,0,32768,fat,0,0));
|
||||
printf("Create=%d\n",Create_Chunk(d,192512,409600,freebsd,0,0));
|
||||
printf("Create=%d\n",Create_Chunk(d,192512,409600,part,0,0));
|
||||
if (d->chunks->size == 1411200)
|
||||
Set_Bios_Geom(d,1024,15,63);
|
||||
else
|
||||
Set_Bios_Geom(d,2003,64,32);
|
||||
Debug_Disk(d);
|
||||
printf("<%s>\n",CheckRules(d));
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
.PATH: /usr/src/sbin/disklabel
|
||||
OBJS= tst01.o blocks.o disklabel.o dkcksum.o chunk.o disk.o change.o \
|
||||
create_chunk.o
|
||||
create_chunk.o rules.o
|
||||
CFLAGS+= -Wall
|
||||
|
||||
test: tst01
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include <string.h>
|
||||
#include <err.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
struct disk *
|
||||
|
@ -15,11 +15,11 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <err.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
CHAR_N;
|
||||
|
||||
#define new_chunk() malloc(sizeof(struct chunk))
|
||||
|
||||
/* Is c2 completely inside c1 ? */
|
||||
@ -206,6 +206,10 @@ Add_Chunk(struct disk *d, u_long offset, u_long size, char *name, chunk_e type,
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
|
||||
if(!c1 && type == part)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,freebsd);
|
||||
if(!c1 && type == reserved)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,extended);
|
||||
if(!c1 && type == reserved)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
|
||||
if(!c1)
|
||||
return __LINE__;
|
||||
for(c2=c1->part;c2;c2=c2->next) {
|
||||
@ -252,26 +256,25 @@ Bios_Limit_Chunk(struct chunk *c1, u_long limit)
|
||||
}
|
||||
|
||||
int
|
||||
Delete_Chunk(struct disk *d, u_long offset, u_long end, chunk_e type)
|
||||
Delete_Chunk(struct disk *d, struct chunk *c)
|
||||
{
|
||||
struct chunk *c1=0,*c2,*c3;
|
||||
chunk_e type = c->type;
|
||||
|
||||
if(type == whole)
|
||||
return 1;
|
||||
if(!c1 && (type == freebsd || type == fat || type == foo))
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,extended);
|
||||
c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,extended);
|
||||
if(!c1 && (type == freebsd || type == fat || type == foo))
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
|
||||
c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,whole);
|
||||
if(!c1 && type == extended)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
|
||||
c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,whole);
|
||||
if(!c1 && type == part)
|
||||
c1 = Find_Mother_Chunk(d->chunks,offset,end,freebsd);
|
||||
c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,freebsd);
|
||||
if(!c1)
|
||||
return 1;
|
||||
for(c2=c1->part;c2;c2=c2->next) {
|
||||
if (c2->offset == offset &&
|
||||
c2->end == end &&
|
||||
c2->type == type) {
|
||||
if (c2 == c) {
|
||||
c2->type = unused;
|
||||
c2->subtype = 0;
|
||||
c2->flags = 0;
|
||||
@ -329,7 +332,7 @@ Collapse_Chunk(struct disk *d, struct chunk *c1)
|
||||
return 0;
|
||||
|
||||
if(c3->type == unused && c3->size == c1->size) {
|
||||
Delete_Chunk(d,c1->offset, c1->end, c1->type);
|
||||
Delete_Chunk(d,c1);
|
||||
return 1;
|
||||
}
|
||||
if(c3->type == unused) {
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <err.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/diskslice.h>
|
||||
#include <sys/queue.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
#define DOSPTYP_EXTENDED 5
|
||||
@ -66,6 +65,7 @@ Int_Open_Disk(char *name, u_long size)
|
||||
size = ds.dss_slices[WHOLE_DISK_SLICE].ds_size;
|
||||
|
||||
Add_Chunk(d, 0, size, name,whole,0,0);
|
||||
Add_Chunk(d, 0, 1, "-",reserved,0,0);
|
||||
|
||||
for(i=2;i<ds.dss_nslices;i++) {
|
||||
char sname[20];
|
||||
@ -94,6 +94,9 @@ Int_Open_Disk(char *name, u_long size)
|
||||
flags |= CHUNK_ALIGN;
|
||||
Add_Chunk(d,ds.dss_slices[i].ds_offset,
|
||||
ds.dss_slices[i].ds_size, sname,ce,subtype,flags);
|
||||
if (ce == extended)
|
||||
Add_Chunk(d,ds.dss_slices[i].ds_offset,
|
||||
1, "-",reserved, subtype, flags);
|
||||
if (ds.dss_slices[i].ds_type == 0xa5) {
|
||||
struct disklabel *dl;
|
||||
int j;
|
||||
|
@ -1,13 +1,25 @@
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
|
||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
typedef enum {whole, foo, fat, freebsd, extended, part, unused, reserved} chunk_e;
|
||||
|
||||
#define CHAR_N static char *chunk_n[] = { \
|
||||
"whole","foo","fat","freebsd","extended","part","unused","reserved"};
|
||||
|
||||
struct disk {
|
||||
char *name;
|
||||
u_long flags;
|
||||
#define DISK_ON_TRACK 1
|
||||
#define DISK_REAL_GEOM 2
|
||||
# define DISK_ON_TRACK 1
|
||||
# define DISK_REAL_GEOM 2
|
||||
u_long real_cyl;
|
||||
u_long real_hd;
|
||||
u_long real_sect;
|
||||
@ -26,36 +38,79 @@ struct chunk {
|
||||
char *name;
|
||||
chunk_e type;
|
||||
int subtype;
|
||||
#define SUBTYPE_BSD_FS 1
|
||||
#define SUBTYPE_BSD_SWAP 2
|
||||
#define SUBTYPE_BSD_UNUSED 3
|
||||
# define SUBTYPE_BSD_FS 1
|
||||
# define SUBTYPE_BSD_SWAP 2
|
||||
# define SUBTYPE_BSD_UNUSED 3
|
||||
u_long flags;
|
||||
#define CHUNK_PAST_1024 1
|
||||
/* this chunk cannot be booted from */
|
||||
#define CHUNK_BSD_COMPAT 2
|
||||
/* this chunk is in the BSD-compatibility, and has a short name
|
||||
* too, ie wd0s4f -> wd0f
|
||||
*/
|
||||
#define CHUNK_BAD144 4
|
||||
/* this chunk has bad144 mapping */
|
||||
#define CHUNK_ALIGN 8
|
||||
# define CHUNK_PAST_1024 1
|
||||
/* this chunk cannot be booted from */
|
||||
# define CHUNK_BSD_COMPAT 2
|
||||
/* this chunk is in the BSD-compatibility, and has a
|
||||
* short name too, ie wd0s4f -> wd0f
|
||||
*/
|
||||
# define CHUNK_BAD144 4
|
||||
/* this chunk has bad144 mapping */
|
||||
# define CHUNK_ALIGN 8
|
||||
};
|
||||
|
||||
struct disk *Open_Disk(char *devname);
|
||||
void Free_Disk(struct disk *disk);
|
||||
void Debug_Disk(struct disk *disk);
|
||||
struct disk *Clone_Disk(struct disk *disk);
|
||||
struct disk *
|
||||
Open_Disk(char *devname);
|
||||
/* Will open the named disk, and return populated tree.
|
||||
*/
|
||||
|
||||
struct disk *Set_Phys_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
|
||||
void Set_Bios_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
|
||||
struct disk *
|
||||
Clone_Disk(struct disk *disk);
|
||||
/* Clone a copy of a tree. Useful for "Undo" functionality
|
||||
*/
|
||||
|
||||
int Delete_Chunk(struct disk *disk, u_long offset, u_long end, chunk_e type);
|
||||
void Collapse_Disk(struct disk *disk);
|
||||
int Collapse_Chunk(struct disk *disk, struct chunk *chunk);
|
||||
void
|
||||
Free_Disk(struct disk *disk);
|
||||
/* Free a tree made with Open_Disk() or Clone_Disk()
|
||||
*/
|
||||
|
||||
int Create_Chunk(struct disk *disk, u_long offset, u_long size, chunk_e type, int subtype, u_long flags);
|
||||
void
|
||||
Debug_Disk(struct disk *disk);
|
||||
/* Print the content of the tree to stdout
|
||||
*/
|
||||
|
||||
/* Implementation details */
|
||||
struct disk *
|
||||
Set_Phys_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
|
||||
/* Use a different physical geometry. Makes sense for ST506 disks only.
|
||||
* The tree returned is read from the disk, using this geometry.
|
||||
*/
|
||||
|
||||
void
|
||||
Set_Bios_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
|
||||
/* Set the geometry the bios uses.
|
||||
*/
|
||||
|
||||
int
|
||||
Delete_Chunk(struct disk *disk, struct chunk *);
|
||||
/* Free a chunk of disk_space
|
||||
*/
|
||||
|
||||
void
|
||||
Collapse_Disk(struct disk *disk);
|
||||
/* Experimental, do not use.
|
||||
*/
|
||||
int
|
||||
Collapse_Chunk(struct disk *disk, struct chunk *chunk);
|
||||
/* Experimental, do not use.
|
||||
*/
|
||||
|
||||
int
|
||||
Create_Chunk(struct disk *disk, u_long offset, u_long size, chunk_e type, int subtype, u_long flags);
|
||||
/* Create a chunk with the specified paramters
|
||||
*/
|
||||
|
||||
char *
|
||||
CheckRules(struct disk *);
|
||||
/* Return char* to warnings about broken design rules in this disklayout
|
||||
*/
|
||||
|
||||
/*
|
||||
* Implementation details >>> DO NOT USE <<<
|
||||
*/
|
||||
|
||||
struct disk *Int_Open_Disk(char *devname, u_long maxsize);
|
||||
|
||||
|
95
release/libdisk/rules.c
Normal file
95
release/libdisk/rules.c
Normal file
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
|
||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/diskslice.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <err.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
/*
|
||||
* Rule#0:
|
||||
* Chunks of type 'whole' can have max NDOSPART children.
|
||||
*/
|
||||
void
|
||||
Rule_000(struct disk *d, struct chunk *c, char *msg)
|
||||
{
|
||||
int i;
|
||||
struct chunk *c1;
|
||||
|
||||
if (c->type != whole)
|
||||
return;
|
||||
for (i=0, c1=c->part; c1; c1=c1->next)
|
||||
if (c1->type != unused)
|
||||
i++;
|
||||
if (i <= NDOSPART)
|
||||
return;
|
||||
sprintf(msg+strlen(msg),
|
||||
"%d is too many children of the 'whole' chunk. Max is %d\n",
|
||||
i, NDOSPART);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rule#1:
|
||||
* All children of 'whole' must be track-aligned
|
||||
*/
|
||||
void
|
||||
Rule_001(struct disk *d, struct chunk *c, char *msg)
|
||||
{
|
||||
int i;
|
||||
struct chunk *c1;
|
||||
|
||||
if (c->type != whole)
|
||||
return;
|
||||
for (i=0, c1=c->part; c1; c1=c1->next) {
|
||||
if (c1->type == reserved)
|
||||
continue;
|
||||
if (c1->type == unused)
|
||||
continue;
|
||||
if (!Aligned(d,c1->offset))
|
||||
sprintf(msg+strlen(msg),
|
||||
"chunk '%s' [%ld..%ld] does not start on a track boundary\n",
|
||||
c1->name,c1->offset,c1->end);
|
||||
if (!Aligned(d,c1->end+1))
|
||||
sprintf(msg+strlen(msg),
|
||||
"chunk '%s' [%ld..%ld] does not end on a track boundary\n",
|
||||
c1->name,c1->offset,c1->end);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Check_Chunk(struct disk *d, struct chunk *c, char *msg)
|
||||
{
|
||||
Rule_000(d,c,msg);
|
||||
Rule_001(d,c,msg);
|
||||
if (c->part)
|
||||
Check_Chunk(d,c->part,msg);
|
||||
if (c->next)
|
||||
Check_Chunk(d,c->next,msg);
|
||||
return;
|
||||
}
|
||||
|
||||
char *
|
||||
CheckRules(struct disk *d)
|
||||
{
|
||||
char msg[BUFSIZ];
|
||||
|
||||
*msg = '\0';
|
||||
Check_Chunk(d,d->chunks,msg);
|
||||
if (*msg)
|
||||
return strdup(msg);
|
||||
return 0;
|
||||
}
|
@ -14,37 +14,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/diskslice.h>
|
||||
#include <sys/queue.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
void
|
||||
fprint_diskslices(FILE *fi, struct diskslices *ds)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("@%p: struct diskslices\n",ds);
|
||||
printf("\tdss_first_bsd_slice = %d\n",ds->dss_first_bsd_slice);
|
||||
printf("\tdss_nslices = %d\n",ds->dss_nslices);
|
||||
for(i=0;i<ds->dss_nslices;i++) {
|
||||
printf("\tdss_slices[%d] = struct diskslice",i);
|
||||
if (i == 0)
|
||||
printf(" /* FreeBSD compatibility slice */\n");
|
||||
else if (i == 1)
|
||||
printf(" /* Whole disk slice */\n");
|
||||
else if (i < 6)
|
||||
printf(" /* Primary MBR slice %d */\n",i-1);
|
||||
else
|
||||
printf("\n");
|
||||
printf("\t\tds_offset = %lu\n",ds->dss_slices[i].ds_offset);
|
||||
printf("\t\tds_size = %lu\n",ds->dss_slices[i].ds_size);
|
||||
printf("\t\tds_type = %u\n",ds->dss_slices[i].ds_type);
|
||||
printf("\t\tds_openmask = %u\n",ds->dss_slices[i].ds_openmask);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
@ -55,12 +26,12 @@ main(int argc, char **argv)
|
||||
d = Open_Disk(argv[i]);
|
||||
if (!d) continue;
|
||||
Debug_Disk(d);
|
||||
Delete_Chunk(d,0,4108599,freebsd);
|
||||
Debug_Disk(d);
|
||||
printf("Create=%d\n",Create_Chunk(d,0,32768,fat,0,0));
|
||||
printf("Create=%d\n",Create_Chunk(d,192512,409600,freebsd,0,0));
|
||||
printf("Create=%d\n",Create_Chunk(d,192512,409600,part,0,0));
|
||||
if (d->chunks->size == 1411200)
|
||||
Set_Bios_Geom(d,1024,15,63);
|
||||
else
|
||||
Set_Bios_Geom(d,2003,64,32);
|
||||
Debug_Disk(d);
|
||||
printf("<%s>\n",CheckRules(d));
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user