wizard.c revision 8641
1303231Sdim/* 2303231Sdim * ---------------------------------------------------------------------------- 3303231Sdim * "THE BEER-WARE LICENSE" (Revision 42): 4303231Sdim * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you 5303231Sdim * can do whatever you want with this stuff. If we meet some day, and you think 6303231Sdim * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 7303231Sdim * ---------------------------------------------------------------------------- 8303231Sdim * 9303231Sdim * $Id: wizard.c,v 1.3 1995/05/17 14:40:00 jkh Exp $ 10303231Sdim * 11303231Sdim */ 12303231Sdim 13303231Sdim#include <stdio.h> 14303231Sdim#include <stdlib.h> 15303231Sdim#include <unistd.h> 16303231Sdim#include <fcntl.h> 17314564Sdim#include <string.h> 18303231Sdim#include <err.h> 19303231Sdim#include <sys/types.h> 20303231Sdim#include "sysinstall.h" 21314564Sdim 22314564Sdimu_char mbr[] = { 23314564Sdim 250,51,192,142,208,188,0,124,139,244,80,7,80,31,251,252,191,0,6,185,0,1, 24303231Sdim 242,165,234,29,6,0,0,190,190,7,179,4,128,60,128,116,14,128,60,0,117,28, 25303231Sdim 131,198,16,254,203,117,239,205,24,139,20,139,76,2,139,238,131,198,16,254, 26303231Sdim 203,116,26,128,60,0,116,244,190,139,6,172,60,0,116,11,86,187,7,0,180,14, 27314564Sdim 205,16,94,235,240,235,254,191,5,0,187,0,124,184,1,2,87,205,19,95,115,12, 28314564Sdim 51,192,205,19,79,117,237,190,163,6,235,211,190,194,6,191,254,125,129,61, 29314564Sdim 85,170,117,199,139,245,234,0,124,0,0,73,110,118,97,108,105,100,32,112,97, 30314564Sdim 114,116,105,116,105,111,110,32,116,97,98,108,101,0,69,114,114,111,114,32, 31314564Sdim 108,111,97,100,105,110,103,32,111,112,101,114,97,116,105,110,103,32,115, 32314564Sdim 121,115,116,101,109,0,77,105,115,115,105,110,103,32,111,112,101,114,97, 33314564Sdim 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, 34314564Sdim 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 35314564Sdim 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 36314564Sdim 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 37314564Sdim 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 38303231Sdim 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 39303231Sdim 0,0,0,0,0,0,0,0,0,0,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, 40303231Sdim 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, 41303231Sdim 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, 42314564Sdim 0,0,0,0,0,0,0,0,85,170 43303231Sdim}; 44303231Sdim 45303231Sdimu_char bteasy17[] = { 46303231Sdim 51,192,142,192,142,216,142,208,188,0,124,252,139,244,191,0,6,185,0,1,242, 47303231Sdim 165,234,96,6,0,0,139,213,88,162,72,7,60,53,116,28,180,16,246,228,5,174, 48314564Sdim 4,150,246,68,4,255,116,62,198,4,128,232,218,0,138,116,1,139,76,2,235,8, 49303231Sdim 232,207,0,185,1,0,50,209,187,0,124,184,1,2,205,19,114,30,129,191,254,1, 50303231Sdim 85,170,117,22,234,0,124,0,0,128,250,129,116,2,178,128,139,234,66,128,242, 51303231Sdim 179,136,22,58,7,191,190,7,185,4,0,198,6,45,7,49,50,246,136,45,138,69,4, 52303231Sdim 60,0,116,35,60,5,116,31,254,198,190,42,7,232,113,0,190,72,7,70,70,139,28, 53303231Sdim 10,255,116,5,50,125,4,117,243,141,183,114,7,232,90,0,131,199,16,254,6,45, 54303231Sdim 7,226,203,128,62,117,4,2,116,11,190,59,7,10,246,117,10,205,24,235,172,190, 55303231Sdim 42,7,232,57,0,232,54,0,50,228,205,26,139,218,131,195,96,180,1,205,22,180, 56303231Sdim 0,117,11,205,26,59,211,114,242,160,72,7,235,10,205,22,138,196,60,28,116, 57303231Sdim 243,4,246,60,49,114,214,60,53,119,210,80,190,40,7,187,27,6,83,252,172,80, 58303231Sdim 36,127,180,14,205,16,88,168,128,116,242,195,86,184,1,3,187,0,6,185,1,0, 59303231Sdim 50,246,205,19,94,198,6,72,7,63,195,13,138,13,10,70,48,32,46,32,46,32,46, 60303231Sdim 160,100,105,115,107,32,49,13,10,10,68,101,102,97,117,108,116,58,32,70,63, 61303231Sdim 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, 62303231Sdim 36,165,39,159,43,117,47,82,47,219,50,64,55,242,61,0,100,111,243,72,80,70, 63303231Sdim 211,79,115,178,85,110,105,248,78,111,118,101,108,236,77,105,110,105,248, 64303231Sdim 76,105,110,117,248,65,109,111,101,98,225,66,83,196,66,83,68,233,80,67,73, 65303231Sdim 216,67,80,205,86,101,110,105,248,68,111,115,115,101,227,63,191,0,0,0,0, 66303231Sdim 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 67303231Sdim 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 68303231Sdim 0,85,170 69303231Sdim}; 70303231Sdim 71303231Sdimint 72303231Sdimscan_block(int fd, daddr_t block) 73303231Sdim{ 74303231Sdim u_char foo[512]; 75303231Sdim 76303231Sdim if (-1 == lseek(fd,block * 512,SEEK_SET)) 77303231Sdim err(1,"lseek"); 78303231Sdim if (512 != read(fd,foo, 512)) 79303231Sdim return 1; 80303231Sdim return 0; 81303231Sdim} 82303231Sdim 83314564Sdimvoid 84303231SdimScan_Disk(Disk *d) 85303231Sdim{ 86303231Sdim char device[64]; 87303231Sdim u_long l; 88303231Sdim int i,j,fd; 89303231Sdim 90303231Sdim strcpy(device,"/dev/r"); 91303231Sdim strcat(device,d->name); 92303231Sdim 93303231Sdim fd = open(device,O_RDWR); 94303231Sdim if (fd < 0) { 95303231Sdim msgWarn("open(%s) failed", device); 96303231Sdim return; 97303231Sdim } 98303231Sdim for(i=-1,l=0;;l++) { 99303231Sdim j = scan_block(fd,l); 100303231Sdim if (j != i) { 101303231Sdim if (i == -1) { 102303231Sdim printf("%c: %lu.",j ? 'B' : 'G', l); 103314564Sdim fflush(stdout); 104303231Sdim } else if (i == 0) { 105303231Sdim printf(".%lu\nB: %lu.",l-1,l); 106303231Sdim fflush(stdout); 107303231Sdim } else { 108303231Sdim printf(".%lu\nG: %lu.",l-1,l); 109303231Sdim fflush(stdout); 110314564Sdim } 111303231Sdim i = j; 112303231Sdim } 113303231Sdim } 114303231Sdim close(fd); 115303231Sdim} 116303231Sdim 117303231Sdimvoid 118303231Sdimslice_wizard(Disk *d) 119314564Sdim{ 120303231Sdim Disk *db; 121303231Sdim char myprompt[BUFSIZ]; 122303231Sdim char input[BUFSIZ]; 123303231Sdim char *p,*q=0; 124303231Sdim char **cp,*cmds[200]; 125303231Sdim int ncmd,i; 126303231Sdim 127303231Sdim sprintf(myprompt,"%s> ", d->name); 128303231Sdim while(1) { 129303231Sdim printf("--==##==--\n"); 130303231Sdim Debug_Disk(d); 131303231Sdim p = CheckRules(d); 132303231Sdim if (p) { 133303231Sdim printf("%s",p); 134303231Sdim free(p); 135303231Sdim } 136303231Sdim printf(myprompt); 137303231Sdim fflush(stdout); 138303231Sdim q = p = fgets(input,sizeof(input),stdin); 139303231Sdim if(!p) 140303231Sdim break; 141303231Sdim for(cp = cmds; (*cp = strsep(&p, " \t\n")) != NULL;) 142314564Sdim if (**cp != '\0') 143303231Sdim cp++; 144303231Sdim ncmd = cp - cmds; 145303231Sdim if(!ncmd) 146303231Sdim continue; 147303231Sdim if (!strcasecmp(*cmds,"quit")) { break; } 148303231Sdim if (!strcasecmp(*cmds,"exit")) { break; } 149303231Sdim if (!strcasecmp(*cmds,"q")) { break; } 150303231Sdim if (!strcasecmp(*cmds,"x")) { break; } 151303231Sdim if (!strcasecmp(*cmds,"delete") && ncmd == 2) { 152314564Sdim printf("delete = %d\n", 153303231Sdim Delete_Chunk(d, 154303231Sdim (struct chunk *)strtol(cmds[1],0,0))); 155303231Sdim continue; 156303231Sdim } 157303231Sdim if (!strcasecmp(*cmds,"allfreebsd")) { 158303231Sdim All_FreeBSD(d); 159303231Sdim continue; 160303231Sdim } 161303231Sdim if (!strcasecmp(*cmds,"bios") && ncmd == 4) { 162303231Sdim Set_Bios_Geom(d, 163314564Sdim strtol(cmds[1],0,0), 164303231Sdim strtol(cmds[2],0,0), 165314564Sdim strtol(cmds[3],0,0)); 166303231Sdim continue; 167314564Sdim } 168303231Sdim if (!strcasecmp(*cmds,"phys") && ncmd == 4) { 169303231Sdim d = Set_Phys_Geom(d, 170303231Sdim strtol(cmds[1],0,0), 171303231Sdim strtol(cmds[2],0,0), 172314564Sdim strtol(cmds[3],0,0)); 173314564Sdim continue; 174314564Sdim } 175303231Sdim if (!strcasecmp(*cmds,"collapse")) { 176303231Sdim if (cmds[1]) 177303231Sdim while (Collapse_Chunk(d, 178303231Sdim (struct chunk *)strtol(cmds[1],0,0))) 179303231Sdim ; 180303231Sdim else 181303231Sdim Collapse_Disk(d); 182314564Sdim continue; 183303231Sdim } 184303231Sdim if (!strcasecmp(*cmds,"list")) { 185303231Sdim cp = Disk_Names(); 186303231Sdim printf("Disks:"); 187303231Sdim for(i=0;cp[i];i++) { 188303231Sdim printf(" %s",cp[i]); 189303231Sdim free(cp[i]); 190303231Sdim } 191303231Sdim free(cp); 192303231Sdim continue; 193303231Sdim } 194303231Sdim if (!strcasecmp(*cmds,"create") && ncmd == 6) { 195303231Sdim 196303231Sdim printf("Create=%d\n", 197303231Sdim Create_Chunk(d, 198303231Sdim strtol(cmds[1],0,0), 199303231Sdim strtol(cmds[2],0,0), 200303231Sdim strtol(cmds[3],0,0), 201303231Sdim strtol(cmds[4],0,0), 202303231Sdim strtol(cmds[5],0,0))); 203303231Sdim continue; 204303231Sdim } 205303231Sdim if (!strcasecmp(*cmds,"read")) { 206303231Sdim db = d; 207303231Sdim if (ncmd > 1) 208303231Sdim d = Open_Disk(cmds[1]); 209303231Sdim else 210303231Sdim d = Open_Disk(d->name); 211303231Sdim if (d) 212303231Sdim Free_Disk(db); 213303231Sdim else 214303231Sdim d = db; 215303231Sdim continue; 216303231Sdim } 217303231Sdim if (!strcasecmp(*cmds,"scan")) { 218303231Sdim Scan_Disk(d); 219303231Sdim continue; 220303231Sdim } 221303231Sdim if (!strcasecmp(*cmds,"bteasy")) { 222303231Sdim Set_Boot_Mgr(d,bteasy17); 223303231Sdim continue; 224303231Sdim } 225303231Sdim if (!strcasecmp(*cmds,"mbr")) { 226303231Sdim Set_Boot_Mgr(d,mbr); 227303231Sdim continue; 228303231Sdim } 229303231Sdim if (!strcasecmp(*cmds,"boot")) { 230303231Sdim extern u_char boot1[],boot2[]; 231303231Sdim Set_Boot_Blocks(d,boot1,boot2); 232303231Sdim continue; 233303231Sdim } 234303231Sdim if (!strcasecmp(*cmds,"write")) { 235303231Sdim printf("Write=%d\n", 236303231Sdim Write_Disk(d)); 237303231Sdim Free_Disk(d); 238314564Sdim d = Open_Disk(d->name); 239303231Sdim continue; 240303231Sdim } 241303231Sdim if (strcasecmp(*cmds,"help")) 242303231Sdim printf("\007ERROR\n"); 243303231Sdim printf("CMDS:\n"); 244303231Sdim printf("allfreebsd\t\t"); 245303231Sdim printf("bios cyl hd sect\n"); 246303231Sdim printf("boot\t\t"); 247303231Sdim printf("bteasy17\n"); 248303231Sdim printf("collapse [pointer]\t\t"); 249303231Sdim printf("create offset size enum subtype flags\n"); 250303231Sdim printf("subtype(part): swap=1, ffs=7\t\t"); 251303231Sdim printf("delete pointer\n"); 252303231Sdim printf("list\t\t"); 253314564Sdim printf("mbr\n"); 254314564Sdim printf("phys cyl hd sect\t\t"); 255314564Sdim printf("quit\n"); 256303231Sdim printf("read [disk]\t\t"); 257303231Sdim printf("scan\n"); 258303231Sdim printf("write\t\t"); 259314564Sdim printf("ENUM:\n\t"); 260314564Sdim for(i=0;chunk_n[i];i++) 261314564Sdim printf("%d = %s%s",i,chunk_n[i],i == 4 ? "\n\t" : " "); 262314564Sdim printf("\n"); 263314564Sdim 264303231Sdim } 265303231Sdim} 266303231Sdim