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