diff options
Diffstat (limited to 'lib/libdisk')
-rw-r--r-- | lib/libdisk/Makefile | 23 | ||||
-rw-r--r-- | lib/libdisk/blocks.c | 41 | ||||
-rw-r--r-- | lib/libdisk/change.c | 62 | ||||
-rw-r--r-- | lib/libdisk/chunk.c | 433 | ||||
-rw-r--r-- | lib/libdisk/create_chunk.c | 359 | ||||
-rw-r--r-- | lib/libdisk/disk.c | 327 | ||||
-rw-r--r-- | lib/libdisk/disklabel.c | 33 | ||||
-rw-r--r-- | lib/libdisk/libdisk.h | 324 | ||||
-rw-r--r-- | lib/libdisk/rules.c | 316 | ||||
-rw-r--r-- | lib/libdisk/tst01.c | 313 | ||||
-rw-r--r-- | lib/libdisk/write_disk.c | 233 |
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; -} - |