18281Sjkh/* 28281Sjkh * ---------------------------------------------------------------------------- 38281Sjkh * "THE BEER-WARE LICENSE" (Revision 42): 493150Sphk * <phk@FreeBSD.org> 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 * 950479Speter * $FreeBSD$ 108281Sjkh */ 118281Sjkh 12161060Snetchild#include "sade.h" 138281Sjkh#include <fcntl.h> 148281Sjkh#include <err.h> 15133040Smarcel#include <libdisk.h> 168281Sjkh 17156123Sjhbstatic int 188281Sjkhscan_block(int fd, daddr_t block) 198281Sjkh{ 208549Sjkh u_char foo[512]; 218281Sjkh 228549Sjkh if (-1 == lseek(fd,block * 512,SEEK_SET)) 238549Sjkh err(1,"lseek"); 248549Sjkh if (512 != read(fd,foo, 512)) 258549Sjkh return 1; 268549Sjkh return 0; 278281Sjkh} 288281Sjkh 29156123Sjhbstatic void 308641SjkhScan_Disk(Disk *d) 318281Sjkh{ 328549Sjkh char device[64]; 338549Sjkh u_long l; 348549Sjkh int i,j,fd; 358881Srgrimes 3661102Smsmith strcpy(device,"/dev/"); 378549Sjkh strcat(device,d->name); 388881Srgrimes 398549Sjkh fd = open(device,O_RDWR); 408549Sjkh if (fd < 0) { 418549Sjkh msgWarn("open(%s) failed", device); 428549Sjkh return; 438549Sjkh } 448549Sjkh for(i=-1,l=0;;l++) { 458549Sjkh j = scan_block(fd,l); 468549Sjkh if (j != i) { 478549Sjkh if (i == -1) { 488549Sjkh printf("%c: %lu.",j ? 'B' : 'G', l); 498549Sjkh fflush(stdout); 508549Sjkh } else if (i == 0) { 518549Sjkh printf(".%lu\nB: %lu.",l-1,l); 528549Sjkh fflush(stdout); 538549Sjkh } else { 548549Sjkh printf(".%lu\nG: %lu.",l-1,l); 558549Sjkh fflush(stdout); 568549Sjkh } 578881Srgrimes i = j; 588549Sjkh } 598881Srgrimes } 608549Sjkh close(fd); 618281Sjkh} 628281Sjkh 638281Sjkhvoid 648641Sjkhslice_wizard(Disk *d) 658281Sjkh{ 668641Sjkh Disk *db; 678549Sjkh char myprompt[BUFSIZ]; 688549Sjkh char input[BUFSIZ]; 698549Sjkh char *p,*q=0; 708549Sjkh char **cp,*cmds[200]; 718549Sjkh int ncmd,i; 728881Srgrimes 7374677Sjkh systemSuspendDialog(); 748549Sjkh sprintf(myprompt,"%s> ", d->name); 758549Sjkh while(1) { 768549Sjkh printf("--==##==--\n"); 778549Sjkh Debug_Disk(d); 788549Sjkh p = CheckRules(d); 798549Sjkh if (p) { 808549Sjkh printf("%s",p); 818549Sjkh free(p); 828549Sjkh } 8379304Skris printf("%s", myprompt); 848549Sjkh fflush(stdout); 858549Sjkh q = p = fgets(input,sizeof(input),stdin); 868549Sjkh if(!p) 878549Sjkh break; 888549Sjkh for(cp = cmds; (*cp = strsep(&p, " \t\n")) != NULL;) 898549Sjkh if (**cp != '\0') 908549Sjkh cp++; 918549Sjkh ncmd = cp - cmds; 928549Sjkh if(!ncmd) 938549Sjkh continue; 948549Sjkh if (!strcasecmp(*cmds,"quit")) { break; } 958549Sjkh if (!strcasecmp(*cmds,"exit")) { break; } 968549Sjkh if (!strcasecmp(*cmds,"q")) { break; } 978549Sjkh if (!strcasecmp(*cmds,"x")) { break; } 988549Sjkh if (!strcasecmp(*cmds,"delete") && ncmd == 2) { 998549Sjkh printf("delete = %d\n", 1008549Sjkh Delete_Chunk(d, 1018549Sjkh (struct chunk *)strtol(cmds[1],0,0))); 1028549Sjkh continue; 1038549Sjkh } 1048549Sjkh if (!strcasecmp(*cmds,"allfreebsd")) { 10512661Speter All_FreeBSD(d, 0); 1068549Sjkh continue; 1078549Sjkh } 10812661Speter if (!strcasecmp(*cmds,"dedicate")) { 10912661Speter All_FreeBSD(d, 1); 11012661Speter continue; 11112661Speter } 1128881Srgrimes if (!strcasecmp(*cmds,"bios") && ncmd == 4) { 1138549Sjkh Set_Bios_Geom(d, 1148549Sjkh strtol(cmds[1],0,0), 1158549Sjkh strtol(cmds[2],0,0), 1168549Sjkh strtol(cmds[3],0,0)); 1178549Sjkh continue; 1188549Sjkh } 1198881Srgrimes if (!strcasecmp(*cmds,"list")) { 1208549Sjkh cp = Disk_Names(); 1218549Sjkh printf("Disks:"); 1228549Sjkh for(i=0;cp[i];i++) { 1238549Sjkh printf(" %s",cp[i]); 1248549Sjkh free(cp[i]); 1258881Srgrimes } 1268549Sjkh free(cp); 1278549Sjkh continue; 1288549Sjkh } 12961277Snyan#ifdef PC98 13061277Snyan if (!strcasecmp(*cmds,"create") && ncmd == 7) { 13161277Snyan printf("Create=%d\n", 13261277Snyan Create_Chunk(d, 13361277Snyan strtol(cmds[1],0,0), 13461277Snyan strtol(cmds[2],0,0), 13561277Snyan strtol(cmds[3],0,0), 13661277Snyan strtol(cmds[4],0,0), 13761277Snyan strtol(cmds[5],0,0), 13861277Snyan cmds[6])); 13961277Snyan continue; 14061277Snyan } 14161277Snyan#else 1428881Srgrimes if (!strcasecmp(*cmds,"create") && ncmd == 6) { 1438549Sjkh printf("Create=%d\n", 1448549Sjkh Create_Chunk(d, 1458281Sjkh strtol(cmds[1],0,0), 1468281Sjkh strtol(cmds[2],0,0), 1478549Sjkh strtol(cmds[3],0,0), 1488549Sjkh strtol(cmds[4],0,0), 149105686Sphk strtol(cmds[5],0,0), "")); 1508549Sjkh continue; 1518281Sjkh } 15261277Snyan#endif 1538549Sjkh if (!strcasecmp(*cmds,"read")) { 1548549Sjkh db = d; 1558549Sjkh if (ncmd > 1) 1568549Sjkh d = Open_Disk(cmds[1]); 1578549Sjkh else 1588549Sjkh d = Open_Disk(d->name); 1598549Sjkh if (d) 1608549Sjkh Free_Disk(db); 1618549Sjkh else 1628549Sjkh d = db; 1638549Sjkh continue; 1648549Sjkh } 1658549Sjkh if (!strcasecmp(*cmds,"scan")) { 1668549Sjkh Scan_Disk(d); 1678549Sjkh continue; 1688549Sjkh } 1698549Sjkh if (!strcasecmp(*cmds,"write")) { 1708549Sjkh printf("Write=%d\n", 17115439Sjkh Fake ? 0 : Write_Disk(d)); 172106099Sphk q = strdup(d->name); 1738549Sjkh Free_Disk(d); 174106099Sphk d = Open_Disk(q); 1758549Sjkh continue; 1768549Sjkh } 1778549Sjkh if (strcasecmp(*cmds,"help")) 1788549Sjkh printf("\007ERROR\n"); 1798549Sjkh printf("CMDS:\n"); 1808549Sjkh printf("allfreebsd\t\t"); 18112661Speter printf("dedicate\t\t"); 1828549Sjkh printf("bios cyl hd sect\n"); 1838549Sjkh printf("collapse [pointer]\t\t"); 18461277Snyan#ifdef PC98 18561277Snyan printf("create offset size enum subtype flags name\n"); 18661277Snyan#else 1878549Sjkh printf("create offset size enum subtype flags\n"); 18861277Snyan#endif 1898549Sjkh printf("subtype(part): swap=1, ffs=7\t\t"); 1908549Sjkh printf("delete pointer\n"); 1918549Sjkh printf("list\t\t"); 1928549Sjkh printf("quit\n"); 1938549Sjkh printf("read [disk]\t\t"); 1948549Sjkh printf("scan\n"); 1958549Sjkh printf("write\t\t"); 1968549Sjkh printf("\n"); 1978881Srgrimes 1988549Sjkh } 19974677Sjkh systemResumeDialog(); 2008281Sjkh} 201