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