summaryrefslogtreecommitdiff
path: root/lib/libdisk
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libdisk')
-rw-r--r--lib/libdisk/Makefile23
-rw-r--r--lib/libdisk/blocks.c41
-rw-r--r--lib/libdisk/change.c62
-rw-r--r--lib/libdisk/chunk.c433
-rw-r--r--lib/libdisk/create_chunk.c359
-rw-r--r--lib/libdisk/disk.c327
-rw-r--r--lib/libdisk/disklabel.c33
-rw-r--r--lib/libdisk/libdisk.h324
-rw-r--r--lib/libdisk/rules.c316
-rw-r--r--lib/libdisk/tst01.c313
-rw-r--r--lib/libdisk/write_disk.c233
11 files changed, 0 insertions, 2464 deletions
diff --git a/lib/libdisk/Makefile b/lib/libdisk/Makefile
deleted file mode 100644
index 3d58dfa11c001..0000000000000
--- a/lib/libdisk/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-LIB= disk
-SRCS= blocks.c disklabel.c dkcksum.c chunk.c disk.c change.c \
- create_chunk.c rules.c write_disk.c data.c
-
-CFLAGS+= -Wall -g
-CLEANFILES+= tmp.c tst01 tst01.o data.c
-VPATH= ${.CURDIR}/../../sbin/disklabel
-NOPROFILE= yes
-NOSHARED= yes
-
-.include <bsd.lib.mk>
-
-BOOTS=/usr/mdec
-
-data.c: libdisk.h ${BOOTS}/boot1 ${BOOTS}/boot2
- file2c 'const unsigned char boot1[] = {' '};' \
- < ${BOOTS}/boot1 > tmp.c
- file2c 'const unsigned char boot2[] = {' '};' \
- < ${BOOTS}/boot2 >> tmp.c
- mv tmp.c data.c
-
-tst01: tst01.o libdisk.a
- cc ${CFLAGS} -static tst01.o -o tst01 libdisk.a
diff --git a/lib/libdisk/blocks.c b/lib/libdisk/blocks.c
deleted file mode 100644
index 85a9c44cf707d..0000000000000
--- a/lib/libdisk/blocks.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: blocks.c,v 1.2 1995/04/29 01:55:17 phk Exp $
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <err.h>
-#include "libdisk.h"
-
-void *
-read_block(int fd, daddr_t block)
-{
- void *foo;
-
- foo = malloc(512);
- if (!foo)
- err(1,"malloc");
- if (-1 == lseek(fd,block * 512,SEEK_SET))
- err(1,"lseek");
- if (512 != read(fd,foo, 512))
- err(1,"read");
- return foo;
-}
-
-void
-write_block(int fd, daddr_t block, void *foo)
-{
- if (-1 == lseek(fd,block * 512,SEEK_SET))
- err(1,"lseek");
- if (512 != write(fd,foo, 512))
- err(1,"write");
-}
diff --git a/lib/libdisk/change.c b/lib/libdisk/change.c
deleted file mode 100644
index 1ecd220569831..0000000000000
--- a/lib/libdisk/change.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: change.c,v 1.9 1995/06/11 19:29:31 rgrimes Exp $
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <err.h>
-#include <sys/types.h>
-#include "libdisk.h"
-
-#if 0
-struct disk *
-Set_Phys_Geom(struct disk *disk, u_long cyl, u_long hd, u_long sect)
-{
- struct disk *d = Int_Open_Disk(disk->name,cyl*hd*sect);
- d->real_cyl = cyl;
- d->real_hd = hd;
- d->real_sect = sect;
- d->bios_cyl = disk->bios_cyl;
- d->bios_hd = disk->bios_hd;
- d->bios_sect = disk->bios_sect;
- d->flags = disk->flags;
- Free_Disk(disk);
- return d;
-}
-#endif
-
-void
-Set_Bios_Geom(struct disk *disk, u_long cyl, u_long hd, u_long sect)
-{
- disk->bios_cyl = cyl;
- disk->bios_hd = hd;
- disk->bios_sect = sect;
- Bios_Limit_Chunk(disk->chunks,1024*hd*sect);
-}
-
-void
-All_FreeBSD(struct disk *d, int force_all)
-{
- struct chunk *c;
-
- again:
- for (c=d->chunks->part;c;c=c->next)
- if (c->type != unused) {
- Delete_Chunk(d,c);
- goto again;
- }
- c=d->chunks;
- Create_Chunk(d,c->offset,c->size,freebsd,0xa5,
- force_all? CHUNK_FORCE_ALL: 0);
-}
diff --git a/lib/libdisk/chunk.c b/lib/libdisk/chunk.c
deleted file mode 100644
index 906911aa8023d..0000000000000
--- a/lib/libdisk/chunk.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: chunk.c,v 1.14.2.2 1995/06/05 02:24:25 jkh Exp $
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/types.h>
-#include <err.h>
-#include "libdisk.h"
-
-#define new_chunk() memset(malloc(sizeof(struct chunk)), 0, sizeof(struct chunk))
-
-/* Is c2 completely inside c1 ? */
-
-static int
-Chunk_Inside(struct chunk *c1, struct chunk *c2)
-{
- /* if c1 ends before c2 do */
- if (c1->end < c2->end)
- return 0;
- /* if c1 starts after c2 do */
- if (c1->offset > c2->offset)
- return 0;
- return 1;
-}
-
-struct chunk *
-Find_Mother_Chunk(struct chunk *chunks, u_long offset, u_long end, chunk_e type)
-{
- struct chunk *c1,*c2,ct;
- ct.offset = offset;
- ct.end = end;
- switch (type) {
- case whole:
- if (Chunk_Inside(chunks,&ct))
- return chunks;
- case extended:
- for(c1=chunks->part;c1;c1=c1->next) {
- if (c1->type != type)
- continue;
- if (Chunk_Inside(c1,&ct))
- return c1;
- }
- return 0;
- case freebsd:
- for(c1=chunks->part;c1;c1=c1->next) {
- if (c1->type == type)
- if (Chunk_Inside(c1,&ct))
- return c1;
- if (c1->type != extended)
- continue;
- for(c2=c1->part;c2;c2=c2->next)
- if (c2->type == type
- && Chunk_Inside(c2,&ct))
- return c2;
- }
- return 0;
- default:
- warn("Unsupported mother (0x%x) in Find_Mother_Chunk");
- return 0;
- }
-}
-
-void
-Free_Chunk(struct chunk *c1)
-{
- if(!c1) return;
- if(c1->private && c1->private_free)
- (*c1->private_free)(c1->private);
- if(c1->part)
- Free_Chunk(c1->part);
- if(c1->next)
- Free_Chunk(c1->next);
- free(c1->name);
- free(c1);
-}
-
-struct chunk *
-Clone_Chunk(struct chunk *c1)
-{
- struct chunk *c2;
- if(!c1)
- return 0;
- c2 = new_chunk();
- if (!c2) err(1,"malloc failed");
- *c2 = *c1;
- if (c1->private && c1->private_clone)
- c2->private = c2->private_clone(c2->private);
- c2->name = strdup(c2->name);
- c2->next = Clone_Chunk(c2->next);
- c2->part = Clone_Chunk(c2->part);
- return c2;
-}
-
-int
-Insert_Chunk(struct chunk *c2, u_long offset, u_long size, char *name, chunk_e type, int subtype, u_long flags)
-{
- struct chunk *ct,*cs;
-
- /* We will only insert into empty spaces */
- if (c2->type != unused)
- return __LINE__;
-
- ct = new_chunk();
- if (!ct) err(1,"malloc failed");
- memset(ct,0,sizeof *ct);
- ct->disk = c2->disk;
- ct->offset = offset;
- ct->size = size;
- ct->end = offset + size - 1;
- ct->type = type;
- ct->name = strdup(name);
- ct->subtype = subtype;
- ct->flags = flags;
-
- if (!Chunk_Inside(c2,ct)) {
- Free_Chunk(ct);
- return __LINE__;
- }
-
- if(type==freebsd || type==extended) {
- cs = new_chunk();
- if (!cs) err(1,"malloc failed");
- memset(cs,0,sizeof *cs);
- cs->disk = c2->disk;
- cs->offset = offset;
- cs->size = size;
- cs->end = offset + size - 1;
- cs->type = unused;
- cs->name = strdup("-");
- ct->part = cs;
- }
-
- /* Make a new chunk for any trailing unused space */
- if (c2->end > ct->end) {
- cs = new_chunk();
- if (!cs) err(1,"malloc failed");
- *cs = *c2;
- cs->disk = c2->disk;
- cs->offset = ct->end + 1;
- cs->size = c2->end - ct->end;
- if(c2->name)
- cs->name = strdup(c2->name);
- c2->next = cs;
- c2->size -= c2->end - ct->end;
- c2->end = ct->end;
- }
- /* If no leading unused space just occupy the old chunk */
- if (c2->offset == ct->offset) {
- c2->name = ct->name;
- c2->type = ct->type;
- c2->part = ct->part;
- c2->subtype = ct->subtype;
- c2->flags = ct->flags;
- ct->name = 0;
- ct->part = 0;
- Free_Chunk(ct);
- return 0;
- }
- /* else insert new chunk and adjust old one */
- c2->end = ct->offset - 1;
- c2->size -= ct->size;
- ct->next = c2->next;
- c2->next = ct;
- return 0;
-}
-
-int
-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;
- u_long end = offset + size - 1;
- ct.offset = offset;
- ct.end = end;
- ct.size = size;
-
- if (type == whole) {
- d->chunks = c1 = new_chunk();
- if (!c1) err(1,"malloc failed");
- memset(c1,0,sizeof *c1);
- c2 = c1->part = new_chunk();
- if (!c2) err(1,"malloc failed");
- memset(c2,0,sizeof *c2);
- c2->disk = c1->disk = d;
- c2->offset = c1->offset = offset;
- c2->size = c1->size = size;
- c2->end = c1->end = end;
- c1->name = strdup(name);
- c2->name = strdup("-");
- c1->type = type;
- c2->type = unused;
- c1->flags = flags;
- c1->subtype = subtype;
- return 0;
- }
- if (type == freebsd)
- subtype = 0xa5;
- c1 = 0;
- if(!c1 && (type == freebsd || type == fat || type == unknown))
- c1 = Find_Mother_Chunk(d->chunks,offset,end,extended);
- if(!c1 && (type == freebsd || type == fat || type == unknown))
- c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
- if(!c1 && type == extended)
- c1 = Find_Mother_Chunk(d->chunks,offset,end,whole);
- if(!c1 && type == part)
- c1 = Find_Mother_Chunk(d->chunks,offset,end,freebsd);
- if(!c1)
- return __LINE__;
- for(c2=c1->part;c2;c2=c2->next) {
- if (c2->type != unused)
- continue;
- if(Chunk_Inside(c2,&ct)) {
- if (type != freebsd)
- goto doit;
- if (!(flags & CHUNK_ALIGN))
- goto doit;
- if (offset == d->chunks->offset
- && end == d->chunks->end)
- goto doit;
-
- /* Round down to prev cylinder */
- offset = Prev_Cyl_Aligned(d,offset);
- /* Stay inside the parent */
- if (offset < c2->offset)
- offset = c2->offset;
- /* Round up to next cylinder */
- offset = Next_Cyl_Aligned(d,offset);
- /* Keep one track clear in front of parent */
- if (offset == c1->offset)
- offset = Next_Track_Aligned(d,offset+1);
-
- /* Work on the (end+1) */
- size += offset;
- /* Round up to cylinder */
- size = Next_Cyl_Aligned(d,size);
- /* Stay inside parent */
- if ((size-1) > c2->end)
- size = c2->end+1;
- /* Round down to cylinder */
- size = Prev_Cyl_Aligned(d,size);
-
- /* Convert back to size */
- size -= offset;
-
- doit:
- return Insert_Chunk(c2,offset,size,name,
- type,subtype,flags);
- }
- }
- return __LINE__;
-}
-
-char *
-ShowChunkFlags(struct chunk *c)
-{
- static char ret[10];
-
- int i=0;
- if (c->flags & CHUNK_BSD_COMPAT) ret[i++] = 'C';
- if (c->flags & CHUNK_ACTIVE) ret[i++] = 'A';
- if (c->flags & CHUNK_ALIGN) ret[i++] = '=';
- if (c->flags & CHUNK_PAST_1024) ret[i++] = '>';
- if (c->flags & CHUNK_IS_ROOT) ret[i++] = 'R';
- if (c->flags & CHUNK_BAD144) ret[i++] = 'B';
- ret[i++] = '\0';
- return ret;
-}
-
-void
-Print_Chunk(struct chunk *c1,int offset)
-{
- int i;
- if(!c1) return;
- for(i=0;i<offset-2;i++) putchar(' ');
- for(;i<offset;i++) putchar('-');
- putchar('>');
- for(;i<10;i++) putchar(' ');
- printf("%p %8ld %8lu %8lu %-8s %-8s 0x%02x %s",
- c1, c1->offset, c1->size, c1->end, c1->name,
- chunk_n[c1->type],c1->subtype,
- ShowChunkFlags(c1));
- putchar('\n');
- Print_Chunk(c1->part,offset + 2);
- Print_Chunk(c1->next,offset);
-}
-
-void
-Debug_Chunk(struct chunk *c1)
-{
- Print_Chunk(c1,2);
-}
-
-void
-Bios_Limit_Chunk(struct chunk *c1, u_long limit)
-{
- if (c1->part)
- Bios_Limit_Chunk(c1->part,limit);
- if (c1->next)
- Bios_Limit_Chunk(c1->next,limit);
- if (c1->end >= limit) {
- c1->flags |= CHUNK_PAST_1024;
- } else {
- c1->flags &= ~CHUNK_PAST_1024;
- }
-}
-
-int
-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 == unknown))
- c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,extended);
- if(!c1 && (type == freebsd || type == fat || type == unknown))
- c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,whole);
- if(!c1 && type == extended)
- c1 = Find_Mother_Chunk(d->chunks,c->offset,c->end,whole);
- if(!c1 && type == part)
- 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 == c) {
- c2->type = unused;
- c2->subtype = 0;
- c2->flags = 0;
- free(c2->name);
- c2->name = strdup("-");
- Free_Chunk(c2->part);
- c2->part =0;
- goto scan;
- }
- }
- return 1;
- scan:
- for(c2=c1->part;c2;c2=c2->next) {
- if (c2->type != unused)
- continue;
- if (!c2->next)
- continue;
- if (c2->next->type != unused)
- continue;
- c3 = c2->next;
- c2->size += c3->size;
- c2->end = c3->end;
- c2->next = c3->next;
- c3->next = 0;
- Free_Chunk(c3);
- goto scan;
- }
- Fixup_Names(d);
- return 0;
-}
-
-#if 0
-int
-Collapse_Chunk(struct disk *d, struct chunk *c1)
-{
- struct chunk *c2, *c3;
-
- if(c1->next && Collapse_Chunk(d,c1->next))
- return 1;
-
- if(c1->type == unused && c1->next && c1->next->type == unused) {
- c3 = c1->next;
- c1->size += c3->size;
- c1->end = c3->end;
- c1->next = c3->next;
- c3->next = 0;
- Free_Chunk(c3);
- return 1;
- }
- c3 = c1->part;
- if(!c3)
- return 0;
- if (Collapse_Chunk(d,c1->part))
- return 1;
-
- if (c1->type == whole)
- return 0;
-
- if(c3->type == unused && c3->size == c1->size) {
- Delete_Chunk(d,c1);
- return 1;
- }
- if(c3->type == unused) {
- c2 = new_chunk();
- if (!c2) err(1,"malloc failed");
- *c2 = *c1;
- c1->next = c2;
- c1->disk = d;
- c1->name = strdup("-");
- c1->part = 0;
- c1->type = unused;
- c1->flags = 0;
- c1->subtype = 0;
- c1->size = c3->size;
- c1->end = c3->end;
- c2->offset += c1->size;
- c2->size -= c1->size;
- c2->part = c3->next;
- c3->next = 0;
- Free_Chunk(c3);
- return 1;
- }
- for(c2=c3;c2->next;c2 = c2->next)
- c3 = c2;
- if (c2 && c2->type == unused) {
- c3->next = 0;
- c2->next = c1->next;
- c1->next = c2;
- c1->size -= c2->size;
- c1->end -= c2->size;
- return 1;
- }
-
- return 0;
-}
-#endif
diff --git a/lib/libdisk/create_chunk.c b/lib/libdisk/create_chunk.c
deleted file mode 100644
index 5981ac15e54cb..0000000000000
--- a/lib/libdisk/create_chunk.c
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: create_chunk.c,v 1.21.2.5 1995/11/17 23:04:04 jkh Exp $
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#include <sys/disklabel.h>
-#include <sys/diskslice.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <err.h>
-#include "libdisk.h"
-
-/* Clone these two from sysinstall because we need our own copies
- * due to link order problems with `crunch'. Feh!
- */
-static int
-isDebug()
-{
- static int debug = 0; /* Allow debugger to tweak it */
-
- return debug;
-}
-
-/* Write something to the debugging port */
-static void
-msgDebug(char *fmt, ...)
-{
- va_list args;
- char *dbg;
- static int DebugFD = -1;
-
- if (DebugFD == -1)
- DebugFD = open("/dev/ttyv1", O_RDWR);
- dbg = (char *)alloca(FILENAME_MAX);
- strcpy(dbg, "DEBUG: ");
- va_start(args, fmt);
- vsnprintf((char *)(dbg + strlen(dbg)), FILENAME_MAX, fmt, args);
- va_end(args);
- write(DebugFD, dbg, strlen(dbg));
-}
-
-void
-Fixup_FreeBSD_Names(struct disk *d, struct chunk *c)
-{
- struct chunk *c1, *c3;
- int j;
-
- if (!strcmp(c->name, "X")) return;
-
- /* reset all names to "X" */
- for (c1 = c->part; c1 ; c1 = c1->next) {
- c1->oname = c1->name;
- c1->name = malloc(12);
- if(!c1->name) err(1,"Malloc failed");
- strcpy(c1->name,"X");
- }
-
- /* Allocate the first swap-partition we find */
- for (c1 = c->part; c1 ; c1 = c1->next) {
- if (c1->type == unused) continue;
- if (c1->subtype != FS_SWAP) continue;
- sprintf(c1->name,"%s%c",c->name,SWAP_PART+'a');
- break;
- }
-
- /* Allocate the first root-partition we find */
- for (c1 = c->part; c1 ; c1 = c1->next) {
- if (c1->type == unused) continue;
- if (!(c1->flags & CHUNK_IS_ROOT)) continue;
- sprintf(c1->name,"%s%c",c->name,0+'a');
- break;
- }
-
- /* Try to give them the same as they had before */
- for (c1 = c->part; c1 ; c1 = c1->next) {
- if (strcmp(c1->name,"X")) continue;
- for(c3 = c->part; c3 ; c3 = c3->next)
- if (c1 != c3 && !strcmp(c3->name, c1->oname)) {
- goto newname;
- }
- strcpy(c1->name,c1->oname);
- newname:
- }
-
-
- /* Allocate the rest sequentially */
- for (c1 = c->part; c1 ; c1 = c1->next) {
- const char order[] = "efghabd";
- if (c1->type == unused) continue;
- if (strcmp("X",c1->name)) continue;
-
- for(j=0;j<strlen(order);j++) {
- sprintf(c1->name,"%s%c",c->name,order[j]);
- for(c3 = c->part; c3 ; c3 = c3->next)
- if (c1 != c3 && !strcmp(c3->name, c1->name))
- goto match;
- break;
- match:
- strcpy(c1->name,"X");
- continue;
- }
- }
- for (c1 = c->part; c1 ; c1 = c1->next) {
- free(c1->oname);
- c1->oname = 0;
- }
-}
-
-void
-Fixup_Extended_Names(struct disk *d, struct chunk *c)
-{
- struct chunk *c1;
- int j=5;
-
- for (c1 = c->part; c1 ; c1 = c1->next) {
- if (c1->type == unused) continue;
- free(c1->name);
- c1->name = malloc(12);
- if(!c1->name) err(1,"malloc failed");
- sprintf(c1->name,"%ss%d",d->chunks->name,j++);
- if (c1->type == freebsd)
- Fixup_FreeBSD_Names(d,c1);
- }
-}
-
-void
-Fixup_Names(struct disk *d)
-{
- struct chunk *c1, *c2, *c3;
- int i,j;
-
- c1 = d->chunks;
- for(i=1,c2 = c1->part; c2 ; c2 = c2->next) {
- c2->flags &= ~CHUNK_BSD_COMPAT;
- if (c2->type == unused)
- continue;
- if (strcmp(c2->name,"X"))
- continue;
- c2->oname = malloc(12);
- if(!c2->oname) err(1,"malloc failed");
- for(j=1;j<=NDOSPART;j++) {
- sprintf(c2->oname,"%ss%d",c1->name,j);
- for(c3 = c1->part; c3 ; c3 = c3->next)
- if (c3 != c2 && !strcmp(c3->name, c2->oname))
- goto match;
- free(c2->name);
- c2->name = c2->oname;
- c2->oname = 0;
- break;
- match:
- continue;
- }
- if (c2->oname)
- free(c2->oname);
- }
- for(c2 = c1->part; c2 ; c2 = c2->next) {
- if (c2->type == freebsd) {
- c2->flags |= CHUNK_BSD_COMPAT;
- break;
- }
- }
- for(c2 = c1->part; c2 ; c2 = c2->next) {
- if (c2->type == freebsd)
- Fixup_FreeBSD_Names(d,c2);
- if (c2->type == extended)
- Fixup_Extended_Names(d,c2);
- }
-}
-
-int
-Create_Chunk(struct disk *d, u_long offset, u_long size, chunk_e type, int subtype, u_long flags)
-{
- int i;
- u_long l;
-
- if(!(flags & CHUNK_FORCE_ALL))
- {
- /* Never use the first track */
- if (!offset) {
- offset += d->bios_sect;
- size -= d->bios_sect;
- }
-
- /* Always end on cylinder boundary */
- l = (offset+size) % (d->bios_sect * d->bios_hd);
- size -= l;
- }
-
- i = Add_Chunk(d,offset,size,"X",type,subtype,flags);
- Fixup_Names(d);
- return i;
-}
-
-struct chunk *
-Create_Chunk_DWIM(struct disk *d, struct chunk *parent , u_long size, chunk_e type, int subtype, u_long flags)
-{
- int i;
- struct chunk *c1;
- u_long offset,edge;
-
- if (!parent)
- parent = d->chunks;
- for (c1=parent->part; c1 ; c1 = c1->next) {
- if (c1->type != unused) continue;
- if (c1->size < size) continue;
- offset = c1->offset;
- goto found;
- }
- warn("Not enough unused space");
- return 0;
- found:
- if (parent->flags & CHUNK_BAD144) {
- edge = c1->end - d->bios_sect - 127;
- if (offset > edge)
- return 0;
- if (offset + size > edge)
- size = edge - offset + 1;
- }
- i = Add_Chunk(d,offset,size,"X",type,subtype,flags);
- if (i) {
- warn("Didn't cut it");
- return 0;
- }
- Fixup_Names(d);
- for (c1=parent->part; c1 ; c1 = c1->next)
- if (c1->offset == offset)
- return c1;
- err(1,"Serious internal trouble");
-}
-
-int
-MakeDev(struct chunk *c1, char *path)
-{
- char *p = c1->name;
- u_long cmaj, bmaj, min, unit, part, slice;
- char buf[BUFSIZ], buf2[BUFSIZ];
-
- *buf2 = '\0';
- if (isDebug())
- msgDebug("MakeDev: Called with %s on path %s\n", p, path);
- if (!strcmp(p, "X"))
- return 0;
-
- if (!strncmp(p, "wd", 2))
- bmaj = 0, cmaj = 3;
- else if (!strncmp(p, "sd", 2))
- bmaj = 4, cmaj = 13;
- else {
- return 0;
- }
- p += 2;
- if (!isdigit(*p)) {
- msgDebug("MakeDev: Invalid disk unit passed: %s\n", p);
- return 0;
- }
- unit = *p - '0';
- p++;
- if (!*p) {
- slice = 1;
- part = 2;
- goto done;
- }
- else if (isdigit(*p)) {
- unit *= 10;
- unit += (*p - '0');
- p++;
- }
- if (*p != 's') {
- msgDebug("MakeDev: `%s' is not a valid slice delimiter\n", p);
- return 0;
- }
- p++;
- if (!isdigit(*p)) {
- msgDebug("MakeDev: `%s' is an invalid slice number\n", p);
- return 0;
- }
- slice = *p - '0';
- p++;
- if (isdigit(*p)) {
- slice *= 10;
- slice += (*p - '0');
- p++;
- }
- slice = slice + 1;
- if (!*p) {
- part = 2;
- if(c1->type == freebsd)
- sprintf(buf2, "%sc", c1->name);
- goto done;
- }
- if (*p < 'a' || *p > 'h') {
- msgDebug("MakeDev: `%s' is not a valid partition name.\n", p);
- return 0;
- }
- part = *p - 'a';
- done:
- if (isDebug())
- msgDebug("MakeDev: Unit %d, Slice %d, Part %d\n", unit, slice, part);
- if (unit > 32)
- return 0;
- if (slice > 32)
- return 0;
- min = unit * 8 + 65536 * slice + part;
- sprintf(buf, "%s/r%s", path, c1->name);
- unlink(buf);
- if (mknod(buf, S_IFCHR|0640, makedev(cmaj,min)) == -1) {
- msgDebug("mknod of %s returned failure status!\n", buf);
- return 0;
- }
- if (*buf2) {
- sprintf(buf, "%s/r%s", path, buf2);
- unlink(buf);
- if (mknod(buf, S_IFCHR|0640, makedev(cmaj,min)) == -1) {
- msgDebug("mknod of %s returned failure status!\n", buf);
- return 0;
- }
- }
- sprintf(buf, "%s/%s", path, c1->name);
- unlink(buf);
- if (mknod(buf, S_IFBLK|0640, makedev(bmaj,min)) == -1) {
- msgDebug("mknod of %s returned failure status!\n", buf);
- return 0;
- }
- return 1;
-}
-
-int
-MakeDevChunk(struct chunk *c1, char *path)
-{
- int i;
-
- i = MakeDev(c1, path);
- if (c1->next)
- MakeDevChunk(c1->next, path);
- if (c1->part)
- MakeDevChunk(c1->part, path);
- return i;
-}
-
-int
-MakeDevDisk(struct disk *d, char *path)
-{
- return MakeDevChunk(d->chunks, path);
-}
diff --git a/lib/libdisk/disk.c b/lib/libdisk/disk.c
deleted file mode 100644
index cfac7b528b2ce..0000000000000
--- a/lib/libdisk/disk.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: disk.c,v 1.19.2.2 1995/06/05 02:24:27 jkh Exp $
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <err.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/disklabel.h>
-#include <sys/diskslice.h>
-#include "libdisk.h"
-
-#define DOSPTYP_EXTENDED 5
-#define DOSPTYP_ONTRACK 84
-
-char *chunk_n[] = {
- "whole",
- "unknown",
- "fat",
- "freebsd",
- "extended",
- "part",
- "unused",
- NULL
-};
-
-struct disk *
-Open_Disk(char *name)
-{
- return Int_Open_Disk(name,0);
-}
-
-struct disk *
-Int_Open_Disk(char *name, u_long size)
-{
- int i,fd;
- struct diskslices ds;
- struct disklabel dl;
- char device[64];
- struct disk *d;
- struct dos_partition *dp;
- void *p;
- u_long offset = 0;
-
- strcpy(device,"/dev/r");
- strcat(device,name);
-
- d = (struct disk *)malloc(sizeof *d);
- if(!d) err(1,"malloc failed");
- memset(d,0,sizeof *d);
-
- fd = open(device,O_RDONLY);
- if (fd < 0) {
- warn("open(%s) failed",device);
- return 0;
- }
-
- memset(&dl,0,sizeof dl);
- ioctl(fd,DIOCGDINFO,&dl);
- i = ioctl(fd,DIOCGSLICEINFO,&ds);
- if (i < 0) {
- warn("DIOCGSLICEINFO(%s) failed",device);
- close(fd);
- return 0;
- }
-
-#ifdef DEBUG
- 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");
-#endif
-
- if (!size)
- size = ds.dss_slices[WHOLE_DISK_SLICE].ds_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;
-
- if (dp->dp_typ == DOSPTYP_ONTRACK) {
- d->flags |= DISK_ON_TRACK;
- offset = 63;
- }
-
- }
- free(p);
-
- d->bios_sect = dl.d_nsectors;
- d->bios_hd = dl.d_ntracks;
-
- d->name = strdup(name);
-
-
- if (dl.d_ntracks && dl.d_nsectors)
- d->bios_cyl = size/(dl.d_ntracks*dl.d_nsectors);
-
- 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++) {
- char sname[20];
- chunk_e ce;
- u_long flags=0;
- 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) {
- case 0xa5:
- ce = freebsd;
- break;
- case 0x1:
- case 0x6:
- case 0x4:
- ce = fat;
- break;
- case DOSPTYP_EXTENDED:
- ce = extended;
- break;
- default:
- ce = unknown;
- break;
- }
- if (Add_Chunk(d,ds.dss_slices[i].ds_offset,
- ds.dss_slices[i].ds_size, sname,ce,subtype,flags))
- warn("failed to add chunk for slice %d",i - 1);
-
- if (ds.dss_slices[i].ds_type != 0xa5)
- continue;
- {
- struct disklabel dl;
- char pname[20];
- int j,k;
-
- 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);
- Fixup_Names(d);
- Bios_Limit_Chunk(d->chunks,1024*d->bios_hd*d->bios_sect);
- return d;
-}
-
-void
-Debug_Disk(struct disk *d)
-{
- printf("Debug_Disk(%s)",d->name);
- printf(" flags=%lx",d->flags);
-#if 0
- printf(" real_geom=%lu/%lu/%lu",d->real_cyl,d->real_hd,d->real_sect);
-#endif
- printf(" bios_geom=%lu/%lu/%lu\n",d->bios_cyl,d->bios_hd,d->bios_sect);
- printf(" boot1=%p, boot2=%p, bootmgr=%p\n",
- d->boot1,d->boot2,d->bootmgr);
- Debug_Chunk(d->chunks);
-}
-
-void
-Free_Disk(struct disk *d)
-{
- if(d->chunks) Free_Chunk(d->chunks);
- if(d->name) free(d->name);
- if(d->bootmgr) free(d->bootmgr);
- if(d->boot1) free(d->boot1);
- if(d->boot2) free(d->boot2);
- free(d);
-}
-
-struct disk *
-Clone_Disk(struct disk *d)
-{
- struct disk *d2;
-
- d2 = (struct disk*) malloc(sizeof *d2);
- if(!d2) err(1,"malloc failed");
- *d2 = *d;
- d2->name = strdup(d2->name);
- d2->chunks = Clone_Chunk(d2->chunks);
- if(d2->bootmgr) {
- d2->bootmgr = malloc(DOSPARTOFF);
- memcpy(d2->bootmgr,d->bootmgr,DOSPARTOFF);
- }
- if(d2->boot1) {
- d2->boot1 = malloc(512);
- memcpy(d2->boot1,d->boot1,512);
- }
- if(d2->boot2) {
- d2->boot2 = malloc(512*15);
- memcpy(d2->boot2,d->boot2,512*15);
- }
- return d2;
-}
-
-#if 0
-void
-Collapse_Disk(struct disk *d)
-{
-
- while(Collapse_Chunk(d,d->chunks))
- ;
-}
-#endif
-
-static char * device_list[] = {"wd","sd",0};
-
-char **
-Disk_Names()
-{
- int i,j,k;
- char disk[25];
- char diskname[25];
- struct stat st;
- struct diskslices ds;
- int fd;
- static char **disks;
-
- disks = malloc(sizeof *disks * (1 + MAX_NO_DISKS));
- memset(disks,0,sizeof *disks * (1 + MAX_NO_DISKS));
- k = 0;
- for (j = 0; device_list[j]; j++) {
- for (i = 0; i < 10; i++) {
- sprintf(diskname, "%s%d", device_list[j], i);
- sprintf(disk, "/dev/r%s", diskname);
- if (stat(disk, &st) || !(st.st_mode & S_IFCHR))
- continue;
- if ((fd = open(disk, O_RDWR)) == -1)
- continue;
- if (ioctl(fd, DIOCGSLICEINFO, &ds) == -1) {
- close(fd);
- continue;
- }
- disks[k++] = strdup(diskname);
- if(k == MAX_NO_DISKS)
- return disks;
- }
- }
- return disks;
-}
-
-void
-Set_Boot_Mgr(struct disk *d, u_char *b)
-{
- if (d->bootmgr)
- free(d->bootmgr);
- if (!b) {
- d->bootmgr = 0;
- } else {
- d->bootmgr = malloc(DOSPARTOFF);
- if(!d->bootmgr) err(1,"malloc failed");
- memcpy(d->bootmgr,b,DOSPARTOFF);
- }
-}
-
-void
-Set_Boot_Blocks(struct disk *d, u_char *b1, u_char *b2)
-{
- if (d->boot1) free(d->boot1);
- d->boot1 = malloc(512);
- if(!d->boot1) err(1,"malloc failed");
- memcpy(d->boot1,b1,512);
- if (d->boot2) free(d->boot2);
- d->boot2 = malloc(15*512);
- if(!d->boot2) err(1,"malloc failed");
- memcpy(d->boot2,b2,15*512);
-}
diff --git a/lib/libdisk/disklabel.c b/lib/libdisk/disklabel.c
deleted file mode 100644
index 9714e6c28f2e4..0000000000000
--- a/lib/libdisk/disklabel.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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 <err.h>
-#include <sys/disklabel.h>
-#include "libdisk.h"
-
-struct disklabel *
-read_disklabel(int fd, daddr_t block)
-{
- struct disklabel *dp;
-
- dp = (struct disklabel *) read_block(fd,block);
- if (dp->d_magic != DISKMAGIC)
- return 0;
- if (dp->d_magic2 != DISKMAGIC)
- return 0;
- if (dkcksum(dp) != 0)
- return 0;
- return dp;
-}
diff --git a/lib/libdisk/libdisk.h b/lib/libdisk/libdisk.h
deleted file mode 100644
index 48326347180ac..0000000000000
--- a/lib/libdisk/libdisk.h
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: libdisk.h,v 1.19.2.1 1995/09/20 10:43:03 jkh Exp $
- *
- */
-
-#define MAX_NO_DISKS 20
- /* Max # of disks Disk_Names() will return */
-
-typedef enum {
- whole,
- unknown,
- fat,
- freebsd,
- extended,
- part,
- unused,
- } chunk_e;
-
-extern char *chunk_n[];
-
-struct disk {
- char *name;
- u_long flags;
-# define DISK_ON_TRACK 1
-#if 0
- u_long real_cyl;
- u_long real_hd;
- u_long real_sect;
-#endif
- u_long bios_cyl;
- u_long bios_hd;
- u_long bios_sect;
- u_char *bootmgr;
- u_char *boot1;
- u_char *boot2;
- struct chunk *chunks;
-};
-
-struct chunk {
- struct chunk *next;
- struct chunk *part;
- struct disk *disk;
- long offset;
- u_long size;
- u_long end;
- char *name;
- char *oname;
- /* Used during Fixup_Names() to avoid renaming more than
- * absolutely needed.
- */
- chunk_e type;
- int subtype;
- u_long flags;
-# define CHUNK_PAST_1024 1
- /* this chunk cannot be booted from because it
- * extends past cylinder 1024
- */
-# 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
- /* This chunk should be aligned */
-# define CHUNK_IS_ROOT 16
- /* This 'part' is a rootfs, allocate 'a' */
-# define CHUNK_ACTIVE 32
- /* This is the active slice in the MBR */
-# define CHUNK_FORCE_ALL 64
- /* Force a dedicated disk for FreeBSD, bypassing
- * all BIOS geometry considerations
- */
-
- void (*private_free)(void*);
- void *(*private_clone)(void*);
- void *private;
- /* For data private to the application, and the management
- * thereof. If the functions are not provided, no storage
- * management is done, Cloning will just copy the pointer
- * and freeing will just forget it.
- */
-};
-
-struct disk *
-Open_Disk(char *devname);
- /* Will open the named disk, and return populated tree.
- */
-
-struct disk *
-Clone_Disk(struct disk *disk);
- /* Clone a copy of a tree. Useful for "Undo" functionality
- */
-
-void
-Free_Disk(struct disk *disk);
- /* Free a tree made with Open_Disk() or Clone_Disk()
- */
-
-void
-Debug_Disk(struct disk *disk);
- /* Print the content of the tree to stdout
- */
-
-#if 0
-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.
- */
-#endif
-
-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
- */
-
-void
-All_FreeBSD(struct disk *d, int force_all);
- /* Make one FreeBSD chunk covering the entire disk;
- * if force_all is set, bypass all BIOS geometry
- * considerations.
- */
-
-char *
-CheckRules(struct disk *);
- /* Return char* to warnings about broken design rules in this disklayout
- */
-
-char **
-Disk_Names();
- /* Return char** with all disk's names (wd0, wd1 ...). You must free
- * each pointer, as well as the array by hand
- */
-
-void
-Set_Boot_Mgr(struct disk *d, u_char *bootmgr);
- /* Use this boot-manager on this disk. Gets written when Write_Disk()
- * is called
- */
-
-void
-Set_Boot_Blocks(struct disk *d, u_char *boot1, u_char *boot2);
- /* Use these boot-blocks on this disk. Gets written when Write_Disk()
- * is called
- */
-
-int
-Write_Disk(struct disk *d);
- /* Write all the MBRs, disklabels, bootblocks and boot managers
- */
-
-int
-Cyl_Aligned(struct disk *d, u_long offset);
- /* Check if offset is aligned on a cylinder according to the
- * bios geometry
- */
-
-u_long
-Next_Cyl_Aligned(struct disk *d, u_long offset);
- /* Round offset up to next cylinder according to the bios-geometry
- */
-
-u_long
-Prev_Cyl_Aligned(struct disk *d, u_long offset);
- /* Round offset down to previous cylinder according to the bios-
- * geometry
- */
-
-int
-Track_Aligned(struct disk *d, u_long offset);
- /* Check if offset is aligned on a track according to the
- * bios geometry
- */
-
-u_long
-Next_Track_Aligned(struct disk *d, u_long offset);
- /* Round offset up to next track according to the bios-geometry
- */
-
-u_long
-Prev_Track_Aligned(struct disk *d, u_long offset);
- /* Check if offset is aligned on a track according to the
- * bios geometry
- */
-
-struct chunk *
-Create_Chunk_DWIM(struct disk *d, struct chunk *parent , u_long size, chunk_e type, int subtype, u_long flags);
- /* This one creates a partition inside the given parent of the given
- * size, and returns a pointer to it. The first unused chunk big
- * enough is used.
- */
-
-int
-MakeDev(struct chunk *c, char *path);
-
-int
-MakeDevDisk(struct disk *d,char *path);
- /* Make device nodes for all chunks on this disk */
-
-char *
-ShowChunkFlags(struct chunk *c);
- /* Return string to show flags. */
-
-char *
-ChunkCanBeRoot(struct chunk *c);
- /* Return NULL if chunk can be /, explanation otherwise */
-
-/*
- * Implementation details >>> DO NOT USE <<<
- */
-
-void Debug_Chunk(struct chunk *);
-void Free_Chunk(struct chunk *);
-struct chunk * Clone_Chunk(struct chunk *);
-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);
-struct disklabel * read_disklabel(int, daddr_t);
-u_short dkcksum(struct disklabel *);
-struct chunk * Find_Mother_Chunk(struct chunk *, u_long , u_long , chunk_e);
-struct disk * Int_Open_Disk(char *name, u_long size);
-void Fixup_Names(struct disk *);
-
-#define dprintf printf
-
-/* TODO
- *
- * Need a error string mechanism from the functions instead of warn()
- *
- * Make sure only FreeBSD start at offset==0
- *
- * Collapse must align.
- *
- * Make Write_Disk(struct disk*)
- *
- * Consider booting from OnTrack'ed disks.
- *
- * Get Bios-geom, ST506 & OnTrack from driver (or otherwise)
- *
- * Make Create_DWIM().
- *
- * Make Is_Unchanged(struct disk *d1, struct chunk *c1)
- *
- * don't rename slices unless we have to
- *
- *Sample output from tst01:
- *
- * Debug_Disk(wd0) flags=0 real_geom=0/0/0 bios_geom=0/0/0
- * >> 0x3d040 0 1411200 1411199 wd0 0 whole 0 0
- * >>>> 0x3d080 0 960120 960119 wd0s1 3 freebsd 0 8
- * >>>>>> 0x3d100 0 40960 40959 wd0s1a 5 part 0 0
- * >>>>>> 0x3d180 40960 131072 172031 wd0s1b 5 part 0 0
- * >>>>>> 0x3d1c0 172032 409600 581631 wd0s1e 5 part 0 0
- * >>>>>> 0x3d200 581632 378488 960119 wd0s1f 5 part 0 0
- * >>>> 0x3d140 960120 5670 965789 wd0s2 4 extended 0 8
- * >>>>>> 0x3d2c0 960120 63 960182 - 6 unused 0 0
- * >>>>>> 0x3d0c0 960183 5607 965789 wd0s5 2 fat 0 8
- * >>>> 0x3d280 965790 1890 967679 wd0s3 1 foo -2 8
- * >>>> 0x3d300 967680 443520 1411199 wd0s4 3 freebsd 0 8
- * >>>>>> 0x3d340 967680 443520 1411199 wd0s4a 5 part 0 0
- *
- * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
- * level chunkptr start size end name type subtype flags
- *
- * Underlying data structure:
- *
- * Legend:
- * <struct chunk> --> part
- * |
- * v next
- *
- * <wd0> --> <wd0s1> --> <wd0s1a>
- * | |
- * | v
- * | <wd0s1b>
- * | |
- * | v
- * | <wd0s1e>
- * | |
- * | v
- * | <wd0s1f>
- * |
- * v
- * <wd0s2> --> <unused>
- * | |
- * | v
- * | <wd0s5>
- * |
- * v
- * <wd0s3>
- * |
- * v
- * <wd0s4> --> <wd0s4a>
- *
- *
- */
diff --git a/lib/libdisk/rules.c b/lib/libdisk/rules.c
deleted file mode 100644
index 1ea9ca85b162e..0000000000000
--- a/lib/libdisk/rules.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: rules.c,v 1.10.2.1 1995/06/03 08:40:33 jkh Exp $
- *
- */
-
-#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"
-
-int
-Track_Aligned(struct disk *d, u_long offset)
-{
- if (!d->bios_sect)
- return 1;
- if (offset % d->bios_sect)
- return 0;
- return 1;
-}
-
-u_long
-Prev_Track_Aligned(struct disk *d, u_long offset)
-{
- if (!d->bios_sect)
- return offset;
- return (offset / d->bios_sect) * d->bios_sect;
-}
-
-u_long
-Next_Track_Aligned(struct disk *d, u_long offset)
-{
- if (!d->bios_sect)
- return offset;
- return Prev_Track_Aligned(d,offset + d->bios_sect-1);
-}
-
-int
-Cyl_Aligned(struct disk *d, u_long offset)
-{
- if (!d->bios_sect || !d->bios_hd)
- return 1;
- if (offset % (d->bios_sect * d->bios_hd))
- return 0;
- return 1;
-}
-
-u_long
-Prev_Cyl_Aligned(struct disk *d, u_long offset)
-{
- if (!d->bios_sect || !d->bios_hd)
- return offset;
- return (offset / (d->bios_sect*d->bios_hd)) * d->bios_sect * d->bios_hd;
-}
-
-u_long
-Next_Cyl_Aligned(struct disk *d, u_long offset)
-{
- if (!d->bios_sect || !d->bios_hd)
- return offset;
- return Prev_Cyl_Aligned(d,offset + (d->bios_sect * d->bios_hd)-1);
-}
-
-/*
- * Rule#0:
- * Chunks of type 'whole' can have max NDOSPART children.
- * Only one of them can have the "active" flag
- */
-void
-Rule_000(struct disk *d, struct chunk *c, char *msg)
-{
- int i=0,j=0;
- struct chunk *c1;
-
- if (c->type != whole)
- return;
- for (c1=c->part; c1; c1=c1->next) {
- if (c1->type != unused) continue;
- if (c1->flags & CHUNK_ACTIVE)
- j++;
- i++;
- }
- if (i > NDOSPART)
- sprintf(msg+strlen(msg),
- "%d is too many children of the 'whole' chunk. Max is %d\n",
- i, NDOSPART);
- if (j > 1)
- sprintf(msg+strlen(msg),
- "Too many active children of 'whole'");
-}
-
-/*
- * Rule#1:
- * All children of 'whole' and 'extended' must be track-aligned.
- * Exception: the end can be unaligned if it matches the end of 'whole'
- */
-void
-Rule_001(struct disk *d, struct chunk *c, char *msg)
-{
- int i;
- struct chunk *c1;
-
- if (c->type != whole && c->type != extended)
- return;
- for (i=0, c1=c->part; c1; c1=c1->next) {
- if (c1->type == unused) continue;
- c1->flags |= CHUNK_ALIGN;
- if (!Track_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 ((c->type == whole || c->end == c1->end)
- || Cyl_Aligned(d,c1->end+1))
- ;
- else
- sprintf(msg+strlen(msg),
- "chunk '%s' [%ld..%ld] does not end on a cylinder boundary\n",
- c1->name,c1->offset,c1->end);
- }
-}
-
-/*
- * Rule#2:
- * Max one 'fat' as child of 'whole'
- */
-void
-Rule_002(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 != fat)
- continue;
- i++;
- }
- if (i > 1) {
- sprintf(msg+strlen(msg),
- "Max one 'fat' allowed as child of 'whole'\n");
- }
-}
-
-/*
- * Rule#3:
- * Max one extended as child of 'whole'
- */
-void
-Rule_003(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 != extended)
- continue;
- i++;
- }
- if (i > 1) {
- sprintf(msg+strlen(msg),
- "Max one 'extended' allowed as child of 'whole'\n");
- }
-}
-
-/*
- * Rule#4:
- * Max seven 'part' as children of 'freebsd'
- * Max one CHUNK_IS_ROOT child per 'freebsd'
- * If Bad144, space for table must exist.
- * If Bad144 & root, bad144 table must be inside 1024
- */
-void
-Rule_004(struct disk *d, struct chunk *c, char *msg)
-{
- int i=0,k=0;
- struct chunk *c1;
- u_long l;
-
- if (c->type != freebsd)
- return;
-
- if (c->flags & CHUNK_BAD144) {
- l = c->end - 127 - d->bios_sect + 1;
- for (c1=c->part; c1; c1=c1->next) {
- if (c1->end < l || c1->type == unused)
- continue;
- sprintf(msg+strlen(msg),
- "Blocks %lu to %lu are needed for bad144 information, but isn't unused.\n",
- l, c->end);
- break;
- }
- if (c->flags & CHUNK_PAST_1024) {
- for (c1=c->part; c1; c1=c1->next) {
- if (c1->flags & CHUNK_IS_ROOT) {
- sprintf(msg+strlen(msg),
- "You have assigned root to a slice which uses bad144, and\n extends past the first 1023 cylinders, and thus cannot be booted from.\n");
- break;
- }
- }
- }
- }
-
- for (c1=c->part; c1; c1=c1->next) {
- if (c1->type != part)
- continue;
- if (c1->flags & CHUNK_IS_ROOT) {
- k++;
- if (c1->flags & CHUNK_PAST_1024)
- sprintf(msg+strlen(msg),
- "Root filesystem extends past cylinder 1024, and cannot be booted from\n");
- }
- i++;
- }
- if (i > 7) {
- sprintf(msg+strlen(msg),
- "Max seven partitions per freebsd slice\n");
- }
- if (k > 1) {
- sprintf(msg+strlen(msg),
- "Max one root partition child per freebsd slice\n");
- }
-}
-
-void
-Check_Chunk(struct disk *d, struct chunk *c, char *msg)
-{
- Rule_000(d,c,msg);
- Rule_001(d,c,msg);
- Rule_002(d,c,msg);
- Rule_003(d,c,msg);
- Rule_004(d,c,msg);
- if (c->part)
- Check_Chunk(d,c->part,msg);
- if (c->next)
- Check_Chunk(d,c->next,msg);
-
- if (c->end >= 1024*d->bios_hd*d->bios_sect)
- c->flags |= CHUNK_PAST_1024;
- else
- c->flags &= ~CHUNK_PAST_1024;
-}
-
-char *
-CheckRules(struct disk *d)
-{
- char msg[BUFSIZ];
-
- *msg = '\0';
- Check_Chunk(d,d->chunks,msg);
- if (*msg)
- return strdup(msg);
- return 0;
-}
-
-char *
-ChunkCanBeRoot(struct chunk *c)
-{
- struct chunk *c1;
- struct disk *d = c->disk;
- char msg[BUFSIZ];
-
- *msg = '\0';
- if (c->flags & CHUNK_PAST_1024) {
- strcat(msg,
-"The root partition must end before cylinder 1024 seen from\n");
- strcat(msg,
-"the BIOS' point of view, or it cannot be booted from.\n");
- return strdup(msg);
- }
- for (c1=d->chunks->part;;) {
- for (; c1; c1=c1->next)
- if (c1->offset <= c->offset && c1->end >= c->end)
- break;
- if (!c1) {
- strcat(msg,
-"Internal trouble, cannot find this chunk in the chunk-tree\n");
- return strdup(msg);
- }
- if (c1->type == freebsd)
- break;
- c1 = c1->part;
- }
-
- if (c1->type != freebsd) {
- strcat(msg,
-"The root partition must be in a FreeBSD slice, otherwise\n");
- strcat(msg,
-"the kernel cannot be booted from it\n");
- return strdup(msg);
- }
-
- if ((c1->flags & CHUNK_BAD144) && (c1->flags & CHUNK_PAST_1024)) {
- strcat(msg,
-"This partition is unsuitable for root, because the FreeBSD slice\n");
- strcat(msg,
-"it is inside has bad144 enabled, but the badblock data lives past\n");
- strcat(msg,
-"the 1024th cylinder, and the bootblocks cannot get to it there.\n");
- return strdup(msg);
- }
- return NULL;
-}
diff --git a/lib/libdisk/tst01.c b/lib/libdisk/tst01.c
deleted file mode 100644
index 93286c7c10655..0000000000000
--- a/lib/libdisk/tst01.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: tst01.c,v 1.15 1995/06/11 19:29:37 rgrimes Exp $
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <err.h>
-#ifdef READLINE
-#include <readline/readline.h>
-#include <readline/history.h>
-#endif
-#include <sys/types.h>
-#include "libdisk.h"
-
-u_char mbr[] = {
-250,51,192,142,208,188,0,124,139,244,80,7,80,31,251,252,191,0,6,185,0,1,
-242,165,234,29,6,0,0,190,190,7,179,4,128,60,128,116,14,128,60,0,117,28,
-131,198,16,254,203,117,239,205,24,139,20,139,76,2,139,238,131,198,16,254,
-203,116,26,128,60,0,116,244,190,139,6,172,60,0,116,11,86,187,7,0,180,14,
-205,16,94,235,240,235,254,191,5,0,187,0,124,184,1,2,87,205,19,95,115,12,
-51,192,205,19,79,117,237,190,163,6,235,211,190,194,6,191,254,125,129,61,
-85,170,117,199,139,245,234,0,124,0,0,73,110,118,97,108,105,100,32,112,97,
-114,116,105,116,105,111,110,32,116,97,98,108,101,0,69,114,114,111,114,32,
-108,111,97,100,105,110,103,32,111,112,101,114,97,116,105,110,103,32,115,
-121,115,116,101,109,0,77,105,115,115,105,110,103,32,111,112,101,114,97,
-116,105,110,103,32,115,121,115,116,101,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,
-1,1,0,4,15,63,60,63,0,0,0,241,239,0,0,0,0,1,61,5,15,63,243,48,240,0,0,144,
-208,2,0,0,0,1,244,165,15,63,170,192,192,3,0,144,208,2,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,85,170
-};
-
-u_char bteasy17[] = {
-51,192,142,192,142,216,142,208,188,0,124,252,139,244,191,0,6,185,0,1,242,
-165,234,96,6,0,0,139,213,88,162,72,7,60,53,116,28,180,16,246,228,5,174,
-4,150,246,68,4,255,116,62,198,4,128,232,218,0,138,116,1,139,76,2,235,8,
-232,207,0,185,1,0,50,209,187,0,124,184,1,2,205,19,114,30,129,191,254,1,
-85,170,117,22,234,0,124,0,0,128,250,129,116,2,178,128,139,234,66,128,242,
-179,136,22,58,7,191,190,7,185,4,0,198,6,45,7,49,50,246,136,45,138,69,4,
-60,0,116,35,60,5,116,31,254,198,190,42,7,232,113,0,190,72,7,70,70,139,28,
-10,255,116,5,50,125,4,117,243,141,183,114,7,232,90,0,131,199,16,254,6,45,
-7,226,203,128,62,117,4,2,116,11,190,59,7,10,246,117,10,205,24,235,172,190,
-42,7,232,57,0,232,54,0,50,228,205,26,139,218,131,195,96,180,1,205,22,180,
-0,117,11,205,26,59,211,114,242,160,72,7,235,10,205,22,138,196,60,28,116,
-243,4,246,60,49,114,214,60,53,119,210,80,190,40,7,187,27,6,83,252,172,80,
-36,127,180,14,205,16,88,168,128,116,242,195,86,184,1,3,187,0,6,185,1,0,
-50,246,205,19,94,198,6,72,7,63,195,13,138,13,10,70,48,32,46,32,46,32,46,
-160,100,105,115,107,32,49,13,10,10,68,101,102,97,117,108,116,58,32,70,63,
-160,0,1,0,4,0,6,3,7,7,10,10,99,14,100,14,101,20,128,20,129,25,130,30,147,
-36,165,39,159,43,117,47,82,47,219,50,64,55,242,61,0,100,111,243,72,80,70,
-211,79,115,178,85,110,105,248,78,111,118,101,108,236,77,105,110,105,248,
-76,105,110,117,248,65,109,111,101,98,225,66,83,196,66,83,68,233,80,67,73,
-216,67,80,205,86,101,110,105,248,68,111,115,115,101,227,63,191,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,85,170
-};
-
-int
-scan_block(int fd, daddr_t block)
-{
- u_char foo[512];
-
- if (-1 == lseek(fd,block * 512,SEEK_SET))
- err(1,"lseek");
- if (512 != read(fd,foo, 512))
- return 1;
- return 0;
-}
-
-void
-Scan_Disk(struct disk *d)
-{
- char device[64];
- u_long l;
- int i,j,fd;
-
- strcpy(device,"/dev/r");
- strcat(device,d->name);
-
- fd = open(device,O_RDWR);
- if (fd < 0) {
- warn("open(%s) failed",device);
- return;
- }
- for(i=-1,l=0;;l++) {
- j = scan_block(fd,l);
- if (j != i) {
- if (i == -1) {
- printf("%c: %lu.",j ? 'B' : 'G', l);
- fflush(stdout);
- } else if (i == 0) {
- printf(".%lu\nB: %lu.",l-1,l);
- fflush(stdout);
- } else {
- printf(".%lu\nG: %lu.",l-1,l);
- fflush(stdout);
- }
- i = j;
- }
- }
- close(fd);
-}
-
-int
-main(int argc, char **argv)
-{
- struct disk *d,*db;
- char myprompt[BUFSIZ];
-#ifndef READLINE
- char input[BUFSIZ];
-#endif
- char *p,*q=0;
- char **cp,*cmds[200];
- int ncmd,i;
-
- if (argc < 2) {
- fprintf(stderr,"Usage:\n\t%s diskname\n",argv[0]);
- exit(1);
- }
- d = Open_Disk(argv[1]);
- if (!d)
- err(1,"Couldn't open disk %s",argv[1]);
-
- sprintf(myprompt,"%s %s> ",argv[0],argv[1]);
- while(1) {
- printf("--==##==--\n");
- p = CheckRules(d);
- Debug_Disk(d);
- if (p) {
- printf("%s",p);
- free(p);
- }
-#ifdef READLINE
- if (q)
- free(q);
- q = p = readline(myprompt);
-#else
- printf(myprompt);
- fflush(stdout);
- q = p = fgets(input,sizeof(input),stdin);
-#endif
- if(!p)
- break;
- for(cp = cmds; (*cp = strsep(&p, " \t\n")) != NULL;)
- if (**cp != '\0')
- cp++;
- ncmd = cp - cmds;
- if(!ncmd)
- continue;
- if (!strcasecmp(*cmds,"quit")) { break; }
- if (!strcasecmp(*cmds,"exit")) { break; }
- if (!strcasecmp(*cmds,"q")) { break; }
- if (!strcasecmp(*cmds,"x")) { break; }
- if (!strcasecmp(*cmds,"dwim") && ncmd == 6) {
- printf("dwim = %p\n",
- Create_Chunk_DWIM(d,
- (struct chunk *)strtol(cmds[1],0,0),
- strtol(cmds[2],0,0),
- strtol(cmds[3],0,0),
- strtol(cmds[4],0,0),
- strtol(cmds[5],0,0)));
- continue;
- }
- if (!strcasecmp(*cmds,"mknod")) {
- MakeDevDisk(d,"/tmp");
- continue;
- }
- if (!strcasecmp(*cmds,"delete") && ncmd == 2) {
- printf("delete = %d\n",
- Delete_Chunk(d,
- (struct chunk *)strtol(cmds[1],0,0)));
- continue;
- }
- if (!strcasecmp(*cmds,"allfreebsd")) {
- All_FreeBSD(d, 0);
- continue;
- }
- if (!strcasecmp(*cmds,"dedicate")) {
- All_FreeBSD(d, 1);
- continue;
- }
- if (!strcasecmp(*cmds,"bios") && ncmd == 4) {
- Set_Bios_Geom(d,
- strtol(cmds[1],0,0),
- strtol(cmds[2],0,0),
- strtol(cmds[3],0,0));
- continue;
- }
-#if 0
- if (!strcasecmp(*cmds,"phys") && ncmd == 4) {
- d = Set_Phys_Geom(d,
- strtol(cmds[1],0,0),
- strtol(cmds[2],0,0),
- strtol(cmds[3],0,0));
- continue;
- }
-#endif
-#if 0
- if (!strcasecmp(*cmds,"collapse")) {
- if (cmds[1])
- while (Collapse_Chunk(d,
- (struct chunk *)strtol(cmds[1],0,0)))
- ;
- else
- Collapse_Disk(d);
- continue;
- }
-#endif
- if (!strcasecmp(*cmds,"list")) {
- cp = Disk_Names();
- printf("Disks:");
- for(i=0;cp[i];i++) {
- printf(" %s",cp[i]);
- free(cp[i]);
- }
- free(cp);
- continue;
- }
- if (!strcasecmp(*cmds,"create") && ncmd == 6) {
-
- printf("Create=%d\n",
- Create_Chunk(d,
- strtol(cmds[1],0,0),
- strtol(cmds[2],0,0),
- strtol(cmds[3],0,0),
- strtol(cmds[4],0,0),
- strtol(cmds[5],0,0)));
- continue;
- }
- if (!strcasecmp(*cmds,"read")) {
- db = d;
- if (ncmd > 1)
- d = Open_Disk(cmds[1]);
- else
- d = Open_Disk(argv[1]);
- if (d)
- Free_Disk(db);
- else
- d = db;
- continue;
- }
- if (!strcasecmp(*cmds,"scan")) {
- Scan_Disk(d);
- continue;
- }
- if (!strcasecmp(*cmds,"bteasy")) {
- Set_Boot_Mgr(d,bteasy17);
- continue;
- }
- if (!strcasecmp(*cmds,"mbr")) {
- Set_Boot_Mgr(d,mbr);
- continue;
- }
- if (!strcasecmp(*cmds,"boot")) {
- extern u_char boot1[],boot2[];
- Set_Boot_Blocks(d,boot1,boot2);
- continue;
- }
- if (!strcasecmp(*cmds,"write")) {
- printf("Write=%d\n",
- Write_Disk(d));
- Free_Disk(d);
- d = Open_Disk(d->name);
- continue;
- }
- if (strcasecmp(*cmds,"help"))
- printf("\007ERROR\n");
- printf("CMDS:\n");
- printf("\tallfreebsd\n");
- printf("\tdedicate\n");
- printf("\tbios cyl hd sect\n");
- printf("\tboot\n");
- printf("\tbteasy17\n");
-#if 0
- printf("\tcollapse [pointer]\n");
-#endif
- printf("\tcreate offset size enum subtype flags\n");
- printf("\t\tsubtype(part): swap=1, ffs=7\n");
- printf("\tdelete pointer\n");
- printf("\tlist\n");
- printf("\tmbr\n");
-#if 0
- printf("\tphys cyl hd sect\n");
-#endif
- printf("\tquit\n");
- printf("\tread [disk]\n");
- printf("\tscan\n");
- printf("\twrite\n");
- printf("\nENUM:\n\t");
- for(i=0;chunk_n[i];i++)
- printf("%d = %s%s",i,chunk_n[i],i == 4 ? "\n\t" : " ");
- printf("\n");
-
- }
- exit (0);
-}
diff --git a/lib/libdisk/write_disk.c b/lib/libdisk/write_disk.c
deleted file mode 100644
index f592dafae397f..0000000000000
--- a/lib/libdisk/write_disk.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "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: write_disk.c,v 1.14.2.1 1995/07/21 11:22:38 rgrimes Exp $
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <err.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/disklabel.h>
-#include <sys/diskslice.h>
-#include "libdisk.h"
-
-#define DOSPTYP_EXTENDED 5
-#define BBSIZE 8192
-#define SBSIZE 8192
-#define DEF_RPM 3600
-#define DEF_INTERLEAVE 1
-
-#define WHERE(offset,disk) (disk->flags & DISK_ON_TRACK ? offset + 63 : offset)
-int
-Write_FreeBSD(int fd, struct disk *new, struct disk *old, struct chunk *c1)
-{
- struct disklabel *dl;
- struct chunk *c2;
- int i,j;
- void *p;
- u_char buf[BBSIZE];
-
- for(i=0;i<BBSIZE/512;i++) {
- p = read_block(fd,WHERE(i + c1->offset,new));
- memcpy(buf+512*i,p,512);
- free(p);
- }
- if(new->boot1)
- memcpy(buf,new->boot1,512);
-
- if(new->boot2)
- memcpy(buf+512,new->boot2,BBSIZE-512);
-
- dl = (struct disklabel *) (buf+512*LABELSECTOR+LABELOFFSET);
- memset(dl,0,sizeof *dl);
-
- for(c2=c1->part;c2;c2=c2->next) {
- if (c2->type == unused) continue;
- if (!strcmp(c2->name,"X")) continue;
- j = c2->name[5] - 'a';
- if (j < 0 || j >= MAXPARTITIONS || j == RAW_PART) {
- warn("Weird parititon letter %c",c2->name[5]);
- continue;
- }
- 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;
- /*
- * Add in defaults for superblock size, interleave, and rpms
- */
- dl->d_sbsize = SBSIZE;
- dl->d_interleave = DEF_INTERLEAVE;
- dl->d_rpm = DEF_RPM;
-
- strcpy(dl->d_typename,c1->name);
-
- dl->d_secsize = 512;
- dl->d_secperunit = new->chunks->size;
-#if 0
- dl->d_ncylinders = new->real_cyl ? new->real_cyl : new->bios_cyl;
- dl->d_ntracks = new->real_hd ? new->real_hd : new->bios_hd;
- dl->d_nsectors = new->real_sect ? new->real_sect : new->bios_sect;
-#else
- dl->d_ncylinders = new->bios_cyl;
- dl->d_ntracks = new->bios_hd;
- dl->d_nsectors = new->bios_sect;
-#endif
- dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors;
-
- dl->d_npartitions = MAXPARTITIONS;
-
- dl->d_type = new->name[0] == 's' ? DTYPE_SCSI : DTYPE_ESDI;
- 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);
-
- for(i=0;i<BBSIZE/512;i++) {
- write_block(fd,WHERE(i + c1->offset,new),buf+512*i);
- }
-
- return 0;
-}
-
-int
-Write_Extended(int fd, struct disk *new, struct disk *old, struct chunk *c1)
-{
- return 0;
-}
-
-int
-Write_Disk(struct disk *d1)
-{
- int fd,i,j;
- struct disk *old = 0;
- struct chunk *c1;
- int ret = 0;
- char device[64];
- u_char *mbr;
- struct dos_partition *dp,work[NDOSPART];
- int s[4];
-
- strcpy(device,"/dev/r");
- strcat(device,d1->name);
-
- fd = open(device,O_RDWR);
- if (fd < 0) {
- warn("open(%s) failed",device);
- return 1;
- }
-
- memset(s,0,sizeof s);
- mbr = read_block(fd,WHERE(0,d1));
- dp = (struct dos_partition*) (mbr + DOSPARTOFF);
- memcpy(work,dp,sizeof work);
- dp = work;
- free(mbr);
- for (c1=d1->chunks->part; c1 ; c1 = c1->next) {
- if (c1->type == unused) continue;
- if (!strcmp(c1->name,"X")) continue;
- j = c1->name[4] - '1';
- if (j < 0 || j > 3)
- continue;
- s[j]++;
- if (c1->type == extended)
- ret += Write_Extended(fd, d1,old,c1);
- if (c1->type == freebsd)
- ret += Write_FreeBSD(fd, d1,old,c1);
-
- dp[j].dp_start = c1->offset;
- dp[j].dp_size = c1->size;
-
- i = c1->offset;
- if (i >= 1024*d1->bios_sect*d1->bios_hd) {
- dp[j].dp_ssect = 0xff;
- dp[j].dp_shd = 0xff;
- dp[j].dp_scyl = 0xff;
- } else {
- dp[j].dp_ssect = i % d1->bios_sect;
- i -= dp[j].dp_ssect++;
- i /= d1->bios_sect;
- dp[j].dp_shd = i % d1->bios_hd;
- i -= dp[j].dp_shd;
- i /= d1->bios_hd;
- dp[j].dp_scyl = i;
- i -= dp[j].dp_scyl;
- dp[j].dp_ssect |= i >> 2;
- }
-
-#ifdef DEBUG
- printf("S:%lu = (%x/%x/%x)",
- c1->offset,dp[j].dp_scyl,dp[j].dp_shd,dp[j].dp_ssect);
-#endif
-
- i = c1->end;
- dp[j].dp_esect = i % d1->bios_sect;
- i -= dp[j].dp_esect++;
- i /= d1->bios_sect;
- dp[j].dp_ehd = i % d1->bios_hd;
- i -= dp[j].dp_ehd;
- i /= d1->bios_hd;
- if (i>1023) i = 1023;
- dp[j].dp_ecyl = i;
- i -= dp[j].dp_ecyl;
- dp[j].dp_esect |= i >> 2;
-
-#ifdef DEBUG
- printf(" E:%lu = (%x/%x/%x)\n",
- c1->end,dp[j].dp_ecyl,dp[j].dp_ehd,dp[j].dp_esect);
-#endif
-
- dp[j].dp_typ = c1->subtype;
- if (c1->flags & CHUNK_ACTIVE)
- dp[j].dp_flag = 0x80;
- else
- dp[j].dp_flag = 0;
- }
- 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[i].dp_typ == 0xa5)
- dp[i].dp_flag = 0x80;
-
- mbr = read_block(fd,WHERE(0,d1));
- if (d1->bootmgr)
- memcpy(mbr,d1->bootmgr,DOSPARTOFF);
- memcpy(mbr+DOSPARTOFF,dp,sizeof *dp * NDOSPART);
- mbr[512-2] = 0x55;
- mbr[512-1] = 0xaa;
- write_block(fd,WHERE(0,d1),mbr);
-
- i = 1;
- i = ioctl(fd,DIOCSYNCSLICEINFO,&i);
- if (i != 0)
- warn("ioctl(DIOCSYNCSLICEINFO)");
- close(fd);
- return 0;
-}
-