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