Initial import from FreeBSD RELENG_4:
[dragonfly.git] / lib / libdisk / tst01.c
1 /*
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@login.dknet.dk> wrote this file.  As long as you retain this notice you
5  * can do whatever you want with this stuff. If we meet some day, and you think
6  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7  * ----------------------------------------------------------------------------
8  *
9  * $FreeBSD: src/lib/libdisk/tst01.c,v 1.23.2.4 2000/08/07 08:55:19 ps Exp $
10  *
11  */
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <unistd.h>
16 #include <fcntl.h>
17 #include <string.h>
18 #include <err.h>
19 #ifdef READLINE
20 #include <readline/readline.h>
21 #include <readline/history.h>
22 #endif
23 #include <sys/types.h>
24 #include <paths.h>
25 #include "libdisk.h"
26
27 u_char mbr[] = {
28 250,51,192,142,208,188,0,124,139,244,80,7,80,31,251,252,191,0,6,185,0,1,
29 242,165,234,29,6,0,0,190,190,7,179,4,128,60,128,116,14,128,60,0,117,28,
30 131,198,16,254,203,117,239,205,24,139,20,139,76,2,139,238,131,198,16,254,
31 203,116,26,128,60,0,116,244,190,139,6,172,60,0,116,11,86,187,7,0,180,14,
32 205,16,94,235,240,235,254,191,5,0,187,0,124,184,1,2,87,205,19,95,115,12,
33 51,192,205,19,79,117,237,190,163,6,235,211,190,194,6,191,254,125,129,61,
34 85,170,117,199,139,245,234,0,124,0,0,73,110,118,97,108,105,100,32,112,97,
35 114,116,105,116,105,111,110,32,116,97,98,108,101,0,69,114,114,111,114,32,
36 108,111,97,100,105,110,103,32,111,112,101,114,97,116,105,110,103,32,115,
37 121,115,116,101,109,0,77,105,115,115,105,110,103,32,111,112,101,114,97,
38 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,
39 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
40 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
41 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
42 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
43 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
44 0,0,0,0,0,0,0,0,0,0,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,
45 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,
46 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,
47 0,0,0,0,0,0,0,0,85,170
48 };
49
50 u_char bteasy17[] = {
51 51,192,142,192,142,216,142,208,188,0,124,252,139,244,191,0,6,185,0,1,242,
52 165,234,96,6,0,0,139,213,88,162,72,7,60,53,116,28,180,16,246,228,5,174,
53 4,150,246,68,4,255,116,62,198,4,128,232,218,0,138,116,1,139,76,2,235,8,
54 232,207,0,185,1,0,50,209,187,0,124,184,1,2,205,19,114,30,129,191,254,1,
55 85,170,117,22,234,0,124,0,0,128,250,129,116,2,178,128,139,234,66,128,242,
56 179,136,22,58,7,191,190,7,185,4,0,198,6,45,7,49,50,246,136,45,138,69,4,
57 60,0,116,35,60,5,116,31,254,198,190,42,7,232,113,0,190,72,7,70,70,139,28,
58 10,255,116,5,50,125,4,117,243,141,183,114,7,232,90,0,131,199,16,254,6,45,
59 7,226,203,128,62,117,4,2,116,11,190,59,7,10,246,117,10,205,24,235,172,190,
60 42,7,232,57,0,232,54,0,50,228,205,26,139,218,131,195,96,180,1,205,22,180,
61 0,117,11,205,26,59,211,114,242,160,72,7,235,10,205,22,138,196,60,28,116,
62 243,4,246,60,49,114,214,60,53,119,210,80,190,40,7,187,27,6,83,252,172,80,
63 36,127,180,14,205,16,88,168,128,116,242,195,86,184,1,3,187,0,6,185,1,0,
64 50,246,205,19,94,198,6,72,7,63,195,13,138,13,10,70,48,32,46,32,46,32,46,
65 160,100,105,115,107,32,49,13,10,10,68,101,102,97,117,108,116,58,32,70,63,
66 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,
67 36,165,39,159,43,117,47,82,47,219,50,64,55,242,61,0,100,111,243,72,80,70,
68 211,79,115,178,85,110,105,248,78,111,118,101,108,236,77,105,110,105,248,
69 76,105,110,117,248,65,109,111,101,98,225,66,83,196,66,83,68,233,80,67,73,
70 216,67,80,205,86,101,110,105,248,68,111,115,115,101,227,63,191,0,0,0,0,
71 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
72 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
73 0,85,170
74 };
75
76 int
77 scan_block(int fd, daddr_t block)
78 {
79         u_char foo[512];
80
81         if (-1 == lseek(fd, (off_t)block * 512, SEEK_SET))
82                 err(1, "lseek");
83         if (512 != read(fd,foo, 512))
84                 return 1;
85         return 0;
86 }
87
88 void
89 Scan_Disk(struct disk *d)
90 {
91         char device[64];
92         u_long l;
93         int i,j,fd;
94
95         strcpy(device,_PATH_DEV);
96         strcat(device,d->name);
97
98         fd = open(device,O_RDWR);
99         if (fd < 0) {
100                 warn("open(%s) failed",device);
101                 return;
102         }
103         for(i=-1,l=0;;l++) {
104                 j = scan_block(fd,l);
105                 if (j != i) {
106                         if (i == -1) {
107                                 printf("%c: %lu.",j ? 'B' : 'G', l);
108                                 fflush(stdout);
109                         } else if (i == 0) {
110                                 printf(".%lu\nB: %lu.",l-1,l);
111                                 fflush(stdout);
112                         } else {
113                                 printf(".%lu\nG: %lu.",l-1,l);
114                                 fflush(stdout);
115                         }
116                         i = j;
117                 }
118         }
119         close(fd);
120 }
121
122 int
123 main(int argc, char **argv)
124 {
125         struct disk *d,*db;
126         char myprompt[BUFSIZ];
127 #ifndef READLINE
128         char input[BUFSIZ];
129 #endif
130         char *p,*q=0;
131         char **cp,*cmds[200];
132         int ncmd,i;
133
134         if (argc < 2) {
135                 fprintf(stderr,"Usage:\n\t%s diskname\n",argv[0]);
136                 exit(1);
137         }
138         d = Open_Disk(argv[1]);
139         if (!d)
140                 err(1,"Couldn't open disk %s",argv[1]);
141
142         sprintf(myprompt,"%s %s> ",argv[0],argv[1]);
143         while(1) {
144                 printf("--==##==--\n");
145                 p = CheckRules(d);
146                 Debug_Disk(d);
147                 if (p) {
148                         printf("%s",p);
149                         free(p);
150                 }
151 #ifdef READLINE
152                 if (q)
153                         free(q);
154                 q = p = readline(myprompt);
155 #else
156                 printf("%s", myprompt);
157                 fflush(stdout);
158                 q = p = fgets(input,sizeof(input),stdin);
159 #endif
160                 if(!p)
161                         break;
162                 for(cp = cmds; (*cp = strsep(&p, " \t\n")) != NULL;)
163                         if (**cp != '\0')
164                                 cp++;
165                 ncmd = cp - cmds;
166                 if(!ncmd)
167                         continue;
168                 if (!strcasecmp(*cmds,"quit")) { break; }
169                 if (!strcasecmp(*cmds,"exit")) { break; }
170                 if (!strcasecmp(*cmds,"q")) { break; }
171                 if (!strcasecmp(*cmds,"x")) { break; }
172                 if (!strcasecmp(*cmds,"dwim") && ncmd == 6) {
173                         printf("dwim = %p\n",
174                                 Create_Chunk_DWIM(d,
175                                         (struct chunk *)strtol(cmds[1],0,0),
176                                         strtol(cmds[2],0,0),
177                                         strtol(cmds[3],0,0),
178                                         strtol(cmds[4],0,0),
179                                         strtol(cmds[5],0,0)));
180                         continue;
181                 }
182                 if (!strcasecmp(*cmds,"mknod")) {
183                         MakeDevDisk(d,"/tmp");
184                         continue;
185                 }
186                 if (!strcasecmp(*cmds,"delete") && ncmd == 2) {
187                         printf("delete = %d\n",
188                                 Delete_Chunk(d,
189                                         (struct chunk *)strtol(cmds[1],0,0)));
190                         continue;
191                 }
192                 if (!strcasecmp(*cmds,"allfreebsd")) {
193                         All_FreeBSD(d, 0);
194                         continue;
195                 }
196                 if (!strcasecmp(*cmds,"dedicate")) {
197                         All_FreeBSD(d, 1);
198                         continue;
199                 }
200                 if (!strcasecmp(*cmds,"sanitize")) {
201                         Sanitize_Bios_Geom(d);
202                         continue;
203                 }
204                 if (!strcasecmp(*cmds,"bios") && ncmd == 4) {
205                         Set_Bios_Geom(d,
206                                 strtol(cmds[1],0,0),
207                                 strtol(cmds[2],0,0),
208                                 strtol(cmds[3],0,0));
209                         continue;
210                 }
211                 if (!strcasecmp(*cmds,"list")) {
212                         cp = Disk_Names();
213                         printf("Disks:");
214                         for(i=0;cp[i];i++) {
215                                 printf(" %s",cp[i]);
216                                 free(cp[i]);
217                         }
218                         free(cp);
219                         continue;
220                 }
221 #ifdef PC98
222                 if (!strcasecmp(*cmds,"create") && ncmd == 7) {
223 #else
224                 if (!strcasecmp(*cmds,"create") && ncmd == 6) {
225 #endif
226
227                         printf("Create=%d\n",
228                                 Create_Chunk(d,
229                                         strtol(cmds[1],0,0),
230                                         strtol(cmds[2],0,0),
231                                         strtol(cmds[3],0,0),
232                                         strtol(cmds[4],0,0),
233 #ifdef PC98
234                                         strtol(cmds[5],0,0),
235                                         cmds[6]));
236 #else
237                                         strtol(cmds[5],0,0)));
238 #endif
239                         continue;
240                 }
241                 if (!strcasecmp(*cmds,"read")) {
242                         db = d;
243                         if (ncmd > 1)
244                                 d = Open_Disk(cmds[1]);
245                         else
246                                 d = Open_Disk(argv[1]);
247                         if (d)
248                                 Free_Disk(db);
249                         else
250                                 d = db;
251                         continue;
252                 }
253                 if (!strcasecmp(*cmds,"scan")) {
254                         Scan_Disk(d);
255                         continue;
256                 }
257                 if (!strcasecmp(*cmds,"bteasy")) {
258                         Set_Boot_Mgr(d,bteasy17);
259                         continue;
260                 }
261                 if (!strcasecmp(*cmds,"mbr")) {
262                         Set_Boot_Mgr(d,mbr);
263                         continue;
264                 }
265 #ifndef __alpha__       /* don't think this compiles on i386 either */
266                 if (!strcasecmp(*cmds,"boot")) {
267                         Set_Boot_Blocks(d,boot1,boot2);
268                         continue;
269                 }
270 #endif
271                 if (!strcasecmp(*cmds,"write")) {
272                         printf("Write=%d\n",
273                                 Write_Disk(d));
274                         Free_Disk(d);
275                         d = Open_Disk(d->name);
276                         continue;
277                 }
278                 if (strcasecmp(*cmds,"help"))
279                         printf("\007ERROR\n");
280                 printf("CMDS:\n");
281                 printf("\tallfreebsd\n");
282                 printf("\tdedicate\n");
283                 printf("\tbios cyl hd sect\n");
284                 printf("\tboot\n");
285                 printf("\tbteasy17\n");
286 #if 0
287                 printf("\tcollapse [pointer]\n");
288 #endif
289 #ifdef PC98
290                 printf("\tcreate offset size enum subtype flags name\n");
291 #else
292                 printf("\tcreate offset size enum subtype flags\n");
293 #endif
294                 printf("\t\tsubtype(part): swap=1, ffs=7\n");
295                 printf("\tdelete pointer\n");
296                 printf("\tlist\n");
297                 printf("\tmbr\n");
298 #if 0
299                 printf("\tphys cyl hd sect\n");
300 #endif
301                 printf("\tquit\n");
302                 printf("\tread [disk]\n");
303                 printf("\tscan\n");
304                 printf("\twrite\n");
305                 printf("\nENUM:\n\t");
306                 for(i=0;chunk_n[i];i++)
307                         printf("%d = %s%s",i,chunk_n[i],i == 4 ? "\n\t" : "  ");
308                 printf("\n");
309
310         }
311         exit (0);
312 }