wizard.c revision 8549
18281Sjkh/*
28281Sjkh * ----------------------------------------------------------------------------
38281Sjkh * "THE BEER-WARE LICENSE" (Revision 42):
48281Sjkh * <phk@login.dknet.dk> wrote this file.  As long as you retain this notice you
58281Sjkh * can do whatever you want with this stuff. If we meet some day, and you think
68281Sjkh * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
78281Sjkh * ----------------------------------------------------------------------------
88281Sjkh *
98549Sjkh * $Id: wizard.c,v 1.1 1995/05/04 23:36:23 jkh Exp $
108281Sjkh *
118281Sjkh */
128281Sjkh
138281Sjkh#include <stdio.h>
148281Sjkh#include <stdlib.h>
158281Sjkh#include <unistd.h>
168281Sjkh#include <fcntl.h>
178281Sjkh#include <string.h>
188281Sjkh#include <err.h>
198281Sjkh#include <sys/types.h>
208281Sjkh#include "libdisk.h"
218281Sjkh
228281Sjkhu_char mbr[] = {
238549Sjkh    250,51,192,142,208,188,0,124,139,244,80,7,80,31,251,252,191,0,6,185,0,1,
248549Sjkh    242,165,234,29,6,0,0,190,190,7,179,4,128,60,128,116,14,128,60,0,117,28,
258549Sjkh    131,198,16,254,203,117,239,205,24,139,20,139,76,2,139,238,131,198,16,254,
268549Sjkh    203,116,26,128,60,0,116,244,190,139,6,172,60,0,116,11,86,187,7,0,180,14,
278549Sjkh    205,16,94,235,240,235,254,191,5,0,187,0,124,184,1,2,87,205,19,95,115,12,
288549Sjkh    51,192,205,19,79,117,237,190,163,6,235,211,190,194,6,191,254,125,129,61,
298549Sjkh    85,170,117,199,139,245,234,0,124,0,0,73,110,118,97,108,105,100,32,112,97,
308549Sjkh    114,116,105,116,105,111,110,32,116,97,98,108,101,0,69,114,114,111,114,32,
318549Sjkh    108,111,97,100,105,110,103,32,111,112,101,114,97,116,105,110,103,32,115,
328549Sjkh    121,115,116,101,109,0,77,105,115,115,105,110,103,32,111,112,101,114,97,
338549Sjkh    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,
348549Sjkh    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
358549Sjkh    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
368549Sjkh    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
378549Sjkh    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
388549Sjkh    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
398549Sjkh    0,0,0,0,0,0,0,0,0,0,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,
408549Sjkh    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,
418549Sjkh    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,
428549Sjkh    0,0,0,0,0,0,0,0,85,170
438281Sjkh};
448281Sjkh
458281Sjkhu_char bteasy17[] = {
468549Sjkh    51,192,142,192,142,216,142,208,188,0,124,252,139,244,191,0,6,185,0,1,242,
478549Sjkh    165,234,96,6,0,0,139,213,88,162,72,7,60,53,116,28,180,16,246,228,5,174,
488549Sjkh    4,150,246,68,4,255,116,62,198,4,128,232,218,0,138,116,1,139,76,2,235,8,
498549Sjkh    232,207,0,185,1,0,50,209,187,0,124,184,1,2,205,19,114,30,129,191,254,1,
508549Sjkh    85,170,117,22,234,0,124,0,0,128,250,129,116,2,178,128,139,234,66,128,242,
518549Sjkh    179,136,22,58,7,191,190,7,185,4,0,198,6,45,7,49,50,246,136,45,138,69,4,
528549Sjkh    60,0,116,35,60,5,116,31,254,198,190,42,7,232,113,0,190,72,7,70,70,139,28,
538549Sjkh    10,255,116,5,50,125,4,117,243,141,183,114,7,232,90,0,131,199,16,254,6,45,
548549Sjkh    7,226,203,128,62,117,4,2,116,11,190,59,7,10,246,117,10,205,24,235,172,190,
558549Sjkh    42,7,232,57,0,232,54,0,50,228,205,26,139,218,131,195,96,180,1,205,22,180,
568549Sjkh    0,117,11,205,26,59,211,114,242,160,72,7,235,10,205,22,138,196,60,28,116,
578549Sjkh    243,4,246,60,49,114,214,60,53,119,210,80,190,40,7,187,27,6,83,252,172,80,
588549Sjkh    36,127,180,14,205,16,88,168,128,116,242,195,86,184,1,3,187,0,6,185,1,0,
598549Sjkh    50,246,205,19,94,198,6,72,7,63,195,13,138,13,10,70,48,32,46,32,46,32,46,
608549Sjkh    160,100,105,115,107,32,49,13,10,10,68,101,102,97,117,108,116,58,32,70,63,
618549Sjkh    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,
628549Sjkh    36,165,39,159,43,117,47,82,47,219,50,64,55,242,61,0,100,111,243,72,80,70,
638549Sjkh    211,79,115,178,85,110,105,248,78,111,118,101,108,236,77,105,110,105,248,
648549Sjkh    76,105,110,117,248,65,109,111,101,98,225,66,83,196,66,83,68,233,80,67,73,
658549Sjkh    216,67,80,205,86,101,110,105,248,68,111,115,115,101,227,63,191,0,0,0,0,
668549Sjkh    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
678549Sjkh    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
688549Sjkh    0,85,170
698281Sjkh};
708281Sjkh
718281Sjkhint
728281Sjkhscan_block(int fd, daddr_t block)
738281Sjkh{
748549Sjkh    u_char foo[512];
758281Sjkh
768549Sjkh    if (-1 == lseek(fd,block * 512,SEEK_SET))
778549Sjkh	err(1,"lseek");
788549Sjkh    if (512 != read(fd,foo, 512))
798549Sjkh	return 1;
808549Sjkh    return 0;
818281Sjkh}
828281Sjkh
838281Sjkhvoid
848281SjkhScan_Disk(struct disk *d)
858281Sjkh{
868549Sjkh    char device[64];
878549Sjkh    u_long l;
888549Sjkh    int i,j,fd;
898549Sjkh
908549Sjkh    strcpy(device,"/dev/r");
918549Sjkh    strcat(device,d->name);
928549Sjkh
938549Sjkh    fd = open(device,O_RDWR);
948549Sjkh    if (fd < 0) {
958549Sjkh	msgWarn("open(%s) failed", device);
968549Sjkh	return;
978549Sjkh    }
988549Sjkh    for(i=-1,l=0;;l++) {
998549Sjkh	j = scan_block(fd,l);
1008549Sjkh	if (j != i) {
1018549Sjkh	    if (i == -1) {
1028549Sjkh		printf("%c: %lu.",j ? 'B' : 'G', l);
1038549Sjkh		fflush(stdout);
1048549Sjkh	    } else if (i == 0) {
1058549Sjkh		printf(".%lu\nB: %lu.",l-1,l);
1068549Sjkh		fflush(stdout);
1078549Sjkh	    } else {
1088549Sjkh		printf(".%lu\nG: %lu.",l-1,l);
1098549Sjkh		fflush(stdout);
1108549Sjkh	    }
1118549Sjkh	    i = j;
1128549Sjkh	}
1138549Sjkh    }
1148549Sjkh    close(fd);
1158281Sjkh}
1168281Sjkh
1178281Sjkhvoid
1188281Sjkhslice_wizard(struct disk *d)
1198281Sjkh{
1208549Sjkh    struct disk *db;
1218549Sjkh    char myprompt[BUFSIZ];
1228549Sjkh    char input[BUFSIZ];
1238549Sjkh    char *p,*q=0;
1248549Sjkh    char **cp,*cmds[200];
1258549Sjkh    int ncmd,i;
1268549Sjkh
1278549Sjkh    sprintf(myprompt,"%s> ", d->name);
1288549Sjkh    while(1) {
1298549Sjkh	printf("--==##==--\n");
1308549Sjkh	Debug_Disk(d);
1318549Sjkh	p = CheckRules(d);
1328549Sjkh	if (p) {
1338549Sjkh	    printf("%s",p);
1348549Sjkh	    free(p);
1358549Sjkh	}
1368549Sjkh	printf(myprompt);
1378549Sjkh	fflush(stdout);
1388549Sjkh	q = p = fgets(input,sizeof(input),stdin);
1398549Sjkh	if(!p)
1408549Sjkh	    break;
1418549Sjkh	for(cp = cmds; (*cp = strsep(&p, " \t\n")) != NULL;)
1428549Sjkh	    if (**cp != '\0')
1438549Sjkh		cp++;
1448549Sjkh	ncmd = cp - cmds;
1458549Sjkh	if(!ncmd)
1468549Sjkh	    continue;
1478549Sjkh	if (!strcasecmp(*cmds,"quit")) { break; }
1488549Sjkh	if (!strcasecmp(*cmds,"exit")) { break; }
1498549Sjkh	if (!strcasecmp(*cmds,"q")) { break; }
1508549Sjkh	if (!strcasecmp(*cmds,"x")) { break; }
1518549Sjkh	if (!strcasecmp(*cmds,"delete") && ncmd == 2) {
1528549Sjkh	    printf("delete = %d\n",
1538549Sjkh		   Delete_Chunk(d,
1548549Sjkh				(struct chunk *)strtol(cmds[1],0,0)));
1558549Sjkh	    continue;
1568549Sjkh	}
1578549Sjkh	if (!strcasecmp(*cmds,"allfreebsd")) {
1588549Sjkh	    All_FreeBSD(d);
1598549Sjkh	    continue;
1608549Sjkh	}
1618549Sjkh	if (!strcasecmp(*cmds,"bios") && ncmd == 4) {
1628549Sjkh	    Set_Bios_Geom(d,
1638549Sjkh			  strtol(cmds[1],0,0),
1648549Sjkh			  strtol(cmds[2],0,0),
1658549Sjkh			  strtol(cmds[3],0,0));
1668549Sjkh	    continue;
1678549Sjkh	}
1688549Sjkh	if (!strcasecmp(*cmds,"phys") && ncmd == 4) {
1698549Sjkh	    d = Set_Phys_Geom(d,
1708549Sjkh			      strtol(cmds[1],0,0),
1718549Sjkh			      strtol(cmds[2],0,0),
1728549Sjkh			      strtol(cmds[3],0,0));
1738549Sjkh	    continue;
1748549Sjkh	}
1758549Sjkh	if (!strcasecmp(*cmds,"collapse")) {
1768549Sjkh	    if (cmds[1])
1778549Sjkh		while (Collapse_Chunk(d,
1788549Sjkh				      (struct chunk *)strtol(cmds[1],0,0)))
1798549Sjkh		    ;
1808549Sjkh	    else
1818549Sjkh		Collapse_Disk(d);
1828549Sjkh	    continue;
1838549Sjkh	}
1848549Sjkh	if (!strcasecmp(*cmds,"list")) {
1858549Sjkh	    cp = Disk_Names();
1868549Sjkh	    printf("Disks:");
1878549Sjkh	    for(i=0;cp[i];i++) {
1888549Sjkh		printf(" %s",cp[i]);
1898549Sjkh		free(cp[i]);
1908549Sjkh	    }
1918549Sjkh	    free(cp);
1928549Sjkh	    continue;
1938549Sjkh	}
1948549Sjkh	if (!strcasecmp(*cmds,"create") && ncmd == 6) {
1958549Sjkh
1968549Sjkh	    printf("Create=%d\n",
1978549Sjkh		   Create_Chunk(d,
1988281Sjkh				strtol(cmds[1],0,0),
1998281Sjkh				strtol(cmds[2],0,0),
2008549Sjkh				strtol(cmds[3],0,0),
2018549Sjkh				strtol(cmds[4],0,0),
2028549Sjkh				strtol(cmds[5],0,0)));
2038549Sjkh	    continue;
2048281Sjkh	}
2058549Sjkh	if (!strcasecmp(*cmds,"read")) {
2068549Sjkh	    db = d;
2078549Sjkh	    if (ncmd > 1)
2088549Sjkh		d = Open_Disk(cmds[1]);
2098549Sjkh	    else
2108549Sjkh		d = Open_Disk(d->name);
2118549Sjkh	    if (d)
2128549Sjkh		Free_Disk(db);
2138549Sjkh	    else
2148549Sjkh		d = db;
2158549Sjkh	    continue;
2168549Sjkh	}
2178549Sjkh	if (!strcasecmp(*cmds,"scan")) {
2188549Sjkh	    Scan_Disk(d);
2198549Sjkh	    continue;
2208549Sjkh	}
2218549Sjkh	if (!strcasecmp(*cmds,"bteasy")) {
2228549Sjkh	    Set_Boot_Mgr(d,bteasy17);
2238549Sjkh	    continue;
2248549Sjkh	}
2258549Sjkh	if (!strcasecmp(*cmds,"mbr")) {
2268549Sjkh	    Set_Boot_Mgr(d,mbr);
2278549Sjkh	    continue;
2288549Sjkh	}
2298549Sjkh	if (!strcasecmp(*cmds,"boot")) {
2308549Sjkh	    extern u_char boot1[],boot2[];
2318549Sjkh	    Set_Boot_Blocks(d,boot1,boot2);
2328549Sjkh	    continue;
2338549Sjkh	}
2348549Sjkh	if (!strcasecmp(*cmds,"write")) {
2358549Sjkh	    printf("Write=%d\n",
2368549Sjkh		   Write_Disk(d));
2378549Sjkh	    Free_Disk(d);
2388549Sjkh	    d = Open_Disk(d->name);
2398549Sjkh	    continue;
2408549Sjkh	}
2418549Sjkh	if (strcasecmp(*cmds,"help"))
2428549Sjkh	    printf("\007ERROR\n");
2438549Sjkh	printf("CMDS:\n");
2448549Sjkh	printf("allfreebsd\t\t");
2458549Sjkh	printf("bios cyl hd sect\n");
2468549Sjkh	printf("boot\t\t");
2478549Sjkh	printf("bteasy17\n");
2488549Sjkh	printf("collapse [pointer]\t\t");
2498549Sjkh	printf("create offset size enum subtype flags\n");
2508549Sjkh	printf("subtype(part): swap=1, ffs=7\t\t");
2518549Sjkh	printf("delete pointer\n");
2528549Sjkh	printf("list\t\t");
2538549Sjkh	printf("mbr\n");
2548549Sjkh	printf("phys cyl hd sect\t\t");
2558549Sjkh	printf("quit\n");
2568549Sjkh	printf("read [disk]\t\t");
2578549Sjkh	printf("scan\n");
2588549Sjkh	printf("write\t\t");
2598549Sjkh	printf("ENUM:\n\t");
2608549Sjkh	for(i=0;chunk_n[i];i++)
2618549Sjkh	    printf("%d = %s%s",i,chunk_n[i],i == 4 ? "\n\t" : "  ");
2628549Sjkh	printf("\n");
2638549Sjkh
2648549Sjkh    }
2658281Sjkh}
266