wizard.c revision 50479
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 *
950479Speter * $FreeBSD: head/usr.sbin/sade/wizard.c 50479 1999-08-28 01:35:59Z peter $
108281Sjkh *
118281Sjkh */
128281Sjkh
1321243Sjkh#include "sysinstall.h"
148281Sjkh#include <fcntl.h>
158281Sjkh#include <err.h>
168281Sjkh
178281Sjkhint
188281Sjkhscan_block(int fd, daddr_t block)
198281Sjkh{
208549Sjkh    u_char foo[512];
218281Sjkh
228549Sjkh    if (-1 == lseek(fd,block * 512,SEEK_SET))
238549Sjkh	err(1,"lseek");
248549Sjkh    if (512 != read(fd,foo, 512))
258549Sjkh	return 1;
268549Sjkh    return 0;
278281Sjkh}
288281Sjkh
298281Sjkhvoid
308641SjkhScan_Disk(Disk *d)
318281Sjkh{
328549Sjkh    char device[64];
338549Sjkh    u_long l;
348549Sjkh    int i,j,fd;
358881Srgrimes
368549Sjkh    strcpy(device,"/dev/r");
378549Sjkh    strcat(device,d->name);
388881Srgrimes
398549Sjkh    fd = open(device,O_RDWR);
408549Sjkh    if (fd < 0) {
418549Sjkh	msgWarn("open(%s) failed", device);
428549Sjkh	return;
438549Sjkh    }
448549Sjkh    for(i=-1,l=0;;l++) {
458549Sjkh	j = scan_block(fd,l);
468549Sjkh	if (j != i) {
478549Sjkh	    if (i == -1) {
488549Sjkh		printf("%c: %lu.",j ? 'B' : 'G', l);
498549Sjkh		fflush(stdout);
508549Sjkh	    } else if (i == 0) {
518549Sjkh		printf(".%lu\nB: %lu.",l-1,l);
528549Sjkh		fflush(stdout);
538549Sjkh	    } else {
548549Sjkh		printf(".%lu\nG: %lu.",l-1,l);
558549Sjkh		fflush(stdout);
568549Sjkh	    }
578881Srgrimes	    i = j;
588549Sjkh	}
598881Srgrimes    }
608549Sjkh    close(fd);
618281Sjkh}
628281Sjkh
638281Sjkhvoid
648641Sjkhslice_wizard(Disk *d)
658281Sjkh{
668641Sjkh    Disk *db;
678549Sjkh    char myprompt[BUFSIZ];
688549Sjkh    char input[BUFSIZ];
698549Sjkh    char *p,*q=0;
708549Sjkh    char **cp,*cmds[200];
718549Sjkh    int ncmd,i;
728881Srgrimes
738549Sjkh    sprintf(myprompt,"%s> ", d->name);
748549Sjkh    while(1) {
758549Sjkh	printf("--==##==--\n");
768549Sjkh	Debug_Disk(d);
778549Sjkh	p = CheckRules(d);
788549Sjkh	if (p) {
798549Sjkh	    printf("%s",p);
808549Sjkh	    free(p);
818549Sjkh	}
828549Sjkh	printf(myprompt);
838549Sjkh	fflush(stdout);
848549Sjkh	q = p = fgets(input,sizeof(input),stdin);
858549Sjkh	if(!p)
868549Sjkh	    break;
878549Sjkh	for(cp = cmds; (*cp = strsep(&p, " \t\n")) != NULL;)
888549Sjkh	    if (**cp != '\0')
898549Sjkh		cp++;
908549Sjkh	ncmd = cp - cmds;
918549Sjkh	if(!ncmd)
928549Sjkh	    continue;
938549Sjkh	if (!strcasecmp(*cmds,"quit")) { break; }
948549Sjkh	if (!strcasecmp(*cmds,"exit")) { break; }
958549Sjkh	if (!strcasecmp(*cmds,"q")) { break; }
968549Sjkh	if (!strcasecmp(*cmds,"x")) { break; }
978549Sjkh	if (!strcasecmp(*cmds,"delete") && ncmd == 2) {
988549Sjkh	    printf("delete = %d\n",
998549Sjkh		   Delete_Chunk(d,
1008549Sjkh				(struct chunk *)strtol(cmds[1],0,0)));
1018549Sjkh	    continue;
1028549Sjkh	}
1038549Sjkh	if (!strcasecmp(*cmds,"allfreebsd")) {
10412661Speter	    All_FreeBSD(d, 0);
1058549Sjkh	    continue;
1068549Sjkh	}
10712661Speter	if (!strcasecmp(*cmds,"dedicate")) {
10812661Speter	    All_FreeBSD(d, 1);
10912661Speter	    continue;
11012661Speter	}
1118881Srgrimes	if (!strcasecmp(*cmds,"bios") && ncmd == 4) {
1128549Sjkh	    Set_Bios_Geom(d,
1138549Sjkh			  strtol(cmds[1],0,0),
1148549Sjkh			  strtol(cmds[2],0,0),
1158549Sjkh			  strtol(cmds[3],0,0));
1168549Sjkh	    continue;
1178549Sjkh	}
1188881Srgrimes	if (!strcasecmp(*cmds,"list")) {
1198549Sjkh	    cp = Disk_Names();
1208549Sjkh	    printf("Disks:");
1218549Sjkh	    for(i=0;cp[i];i++) {
1228549Sjkh		printf(" %s",cp[i]);
1238549Sjkh		free(cp[i]);
1248881Srgrimes	    }
1258549Sjkh	    free(cp);
1268549Sjkh	    continue;
1278549Sjkh	}
1288881Srgrimes	if (!strcasecmp(*cmds,"create") && ncmd == 6) {
1298881Srgrimes
1308549Sjkh	    printf("Create=%d\n",
1318549Sjkh		   Create_Chunk(d,
1328281Sjkh				strtol(cmds[1],0,0),
1338281Sjkh				strtol(cmds[2],0,0),
1348549Sjkh				strtol(cmds[3],0,0),
1358549Sjkh				strtol(cmds[4],0,0),
1368549Sjkh				strtol(cmds[5],0,0)));
1378549Sjkh	    continue;
1388281Sjkh	}
1398549Sjkh	if (!strcasecmp(*cmds,"read")) {
1408549Sjkh	    db = d;
1418549Sjkh	    if (ncmd > 1)
1428549Sjkh		d = Open_Disk(cmds[1]);
1438549Sjkh	    else
1448549Sjkh		d = Open_Disk(d->name);
1458549Sjkh	    if (d)
1468549Sjkh		Free_Disk(db);
1478549Sjkh	    else
1488549Sjkh		d = db;
1498549Sjkh	    continue;
1508549Sjkh	}
1518549Sjkh	if (!strcasecmp(*cmds,"scan")) {
1528549Sjkh	    Scan_Disk(d);
1538549Sjkh	    continue;
1548549Sjkh	}
1558549Sjkh	if (!strcasecmp(*cmds,"write")) {
1568549Sjkh	    printf("Write=%d\n",
15715439Sjkh		   Fake ? 0 : Write_Disk(d));
1588549Sjkh	    Free_Disk(d);
1598549Sjkh	    d = Open_Disk(d->name);
1608549Sjkh	    continue;
1618549Sjkh	}
1628549Sjkh	if (strcasecmp(*cmds,"help"))
1638549Sjkh	    printf("\007ERROR\n");
1648549Sjkh	printf("CMDS:\n");
1658549Sjkh	printf("allfreebsd\t\t");
16612661Speter	printf("dedicate\t\t");
1678549Sjkh	printf("bios cyl hd sect\n");
1688549Sjkh	printf("collapse [pointer]\t\t");
1698549Sjkh	printf("create offset size enum subtype flags\n");
1708549Sjkh	printf("subtype(part): swap=1, ffs=7\t\t");
1718549Sjkh	printf("delete pointer\n");
1728549Sjkh	printf("list\t\t");
1738549Sjkh	printf("quit\n");
1748549Sjkh	printf("read [disk]\t\t");
1758549Sjkh	printf("scan\n");
1768549Sjkh	printf("write\t\t");
1778549Sjkh	printf("ENUM:\n\t");
1788549Sjkh	for(i=0;chunk_n[i];i++)
1798549Sjkh	    printf("%d = %s%s",i,chunk_n[i],i == 4 ? "\n\t" : "  ");
1808549Sjkh	printf("\n");
1818881Srgrimes
1828549Sjkh    }
1838281Sjkh}
184