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