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