diff options
author | jkh <jkh@FreeBSD.org> | 1995-05-04 23:36:23 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1995-05-04 23:36:23 +0000 |
commit | f087fb199fa8a181cea6bbb1396edf5b4d95f16f (patch) | |
tree | 6b41fde46007c62694ac47291e41d28b0524524d /usr.sbin | |
parent | 6e0554da35def531ecbc2de73120bffeb09df22b (diff) | |
download | FreeBSD-src-f087fb199fa8a181cea6bbb1396edf5b4d95f16f.zip FreeBSD-src-f087fb199fa8a181cea6bbb1396edf5b4d95f16f.tar.gz |
Everything but the partition editor is done. This commit is for MBR testing.
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/sade/Makefile | 3 | ||||
-rw-r--r-- | usr.sbin/sade/devices.c | 85 | ||||
-rw-r--r-- | usr.sbin/sade/disks.c | 100 | ||||
-rw-r--r-- | usr.sbin/sade/install.c | 47 | ||||
-rw-r--r-- | usr.sbin/sade/menus.c | 6 | ||||
-rw-r--r-- | usr.sbin/sade/msg.c | 6 | ||||
-rw-r--r-- | usr.sbin/sade/sade.h | 17 | ||||
-rw-r--r-- | usr.sbin/sade/wizard.c | 265 | ||||
-rw-r--r-- | usr.sbin/sysinstall/Makefile | 3 | ||||
-rw-r--r-- | usr.sbin/sysinstall/devices.c | 85 | ||||
-rw-r--r-- | usr.sbin/sysinstall/disks.c | 100 | ||||
-rw-r--r-- | usr.sbin/sysinstall/install.c | 47 | ||||
-rw-r--r-- | usr.sbin/sysinstall/menus.c | 6 | ||||
-rw-r--r-- | usr.sbin/sysinstall/msg.c | 6 | ||||
-rw-r--r-- | usr.sbin/sysinstall/sysinstall.h | 17 | ||||
-rw-r--r-- | usr.sbin/sysinstall/wizard.c | 265 |
16 files changed, 940 insertions, 118 deletions
diff --git a/usr.sbin/sade/Makefile b/usr.sbin/sade/Makefile index a6d0704..f2fa070 100644 --- a/usr.sbin/sade/Makefile +++ b/usr.sbin/sade/Makefile @@ -7,7 +7,8 @@ CLEANFILES= makedevs.c rtermcap SRCS = globals.c main.c dmenu.c menus.c \ misc.c msg.c system.c install.c \ termcap.c makedevs.c media.c variable.c \ - devices.c dist.c lang.c + devices.c dist.c lang.c wizard.c \ + disks.c CFLAGS += -Wall -g -I${.CURDIR}/../libdisk diff --git a/usr.sbin/sade/devices.c b/usr.sbin/sade/devices.c index c777c0b..582db23 100644 --- a/usr.sbin/sade/devices.c +++ b/usr.sbin/sade/devices.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: devices.c,v 1.2 1995/05/04 03:51:14 jkh Exp $ + * $Id: devices.c,v 1.3 1995/05/04 19:48:09 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -42,7 +42,6 @@ */ #include "sysinstall.h" -#include "libdisk.h" #include <ctype.h> /* Where we start displaying chunk information on the screen */ @@ -79,13 +78,13 @@ static struct chunk *chunk_info[10]; static int current_chunk; static void -record_chunks(char *disk, struct disk *d) +record_chunks(struct disk *d) { struct chunk *c1; int i = 0; int last_free = 0; if (!d->chunks) - msgFatal("No chunk list found for %s!", disk); + msgFatal("No chunk list found for %s!", d->name); c1 = d->chunks->part; while (c1) { if (c1->type == unused && c1->size > last_free) { @@ -99,14 +98,15 @@ record_chunks(char *disk, struct disk *d) } static void -print_chunks(char *disk, struct disk *d) +print_chunks(struct disk *d) { int row; int i; attrset(A_NORMAL); mvaddstr(0, 0, "Disk name:\t"); - attrset(A_BOLD); addstr(disk); attrset(A_NORMAL); + attrset(A_BOLD); addstr(d->name); attrset(A_NORMAL); + attrset(A_REVERSE); mvaddstr(0, 55, "Master Partition Editor"); attrset(A_NORMAL); mvprintw(1, 0, "BIOS Geometry:\t%lu cyls/%lu heads/%lu sectors", d->bios_cyl, d->bios_hd, d->bios_sect); @@ -129,42 +129,34 @@ print_chunks(char *disk, struct disk *d) static void print_command_summary() { - mvprintw(15, 0, "The following commands are supported (in upper or lower case):"); + mvprintw(14, 0, "The following commands are supported (in upper or lower case):"); + mvprintw(16, 0, "A = Use Entire Disk B = Scan For Bad Blocks"); mvprintw(17, 0, "C = Create New Partition D = Delete Partition"); - mvprintw(18, 0, "B = Scan For Bad Blocks U = Undo All Changes"); - mvprintw(19, 0, "W = Write Changes ESC = Proceed to next screen"); + mvprintw(18, 0, "G = Set BIOS Geometry U = Undo All Changes"); + mvprintw(19, 0, "W = `Wizard' Mode ESC = Proceed to next screen"); mvprintw(21, 0, "The currently selected partition is displayed in "); attrset(A_BOLD); addstr("bold"); attrset(A_NORMAL); - mvprintw(22, 0, "Use F1 or `?' for help on this screen"); move(0, 0); } struct disk * -device_slice_disk(char *disk) +device_slice_disk(struct disk *d) { - struct disk *d; char *p; int key = 0; Boolean chunking; char *msg = NULL; - - d = Open_Disk(disk); - if (!d) - msgFatal("Couldn't open disk `%s'!", disk); - p = CheckRules(d); - if (p) { - msgConfirm(p); - free(p); - } + char name[40]; dialog_clear(); chunking = TRUE; + strncpy(name, d->name, 40); keypad(stdscr, TRUE); - record_chunks(disk, d); + record_chunks(d); while (chunking) { clear(); - print_chunks(disk, d); + print_chunks(d); print_command_summary(); if (msg) { standout(); mvprintw(23, 0, msg); standend(); @@ -203,10 +195,16 @@ device_slice_disk(char *disk) systemDisplayFile("slice.hlp"); break; + case 'A': + All_FreeBSD(d); + record_chunks(d); + break; + case 'B': if (chunk_info[current_chunk]->type != freebsd) msg = "Can only scan for bad blocks in FreeBSD partition."; - else + else if (strncmp(name, "sd", 2) || + !msgYesNo("This typically makes sense only for ESDI, IDE or MFM drives.\nAre you sure you want to do this on a SCSI disk?")) chunk_info[current_chunk]->flags |= CHUNK_BAD144; break; @@ -220,13 +218,13 @@ device_slice_disk(char *disk) snprintf(tmp, 20, "%d", chunk_info[current_chunk]->size); val = msgGetInput(tmp, "Please specify size for new FreeBSD partition"); - if (val && (size = atoi(val)) > 0) { + if (val && (size = strtol(val, 0, 0)) > 0) { Create_Chunk(d, chunk_info[current_chunk]->offset, size, freebsd, 3, chunk_info[current_chunk]->flags); - record_chunks(disk, d); + record_chunks(d); } } break; @@ -236,21 +234,36 @@ device_slice_disk(char *disk) msg = "Partition is already unused!"; else { Delete_Chunk(d, chunk_info[current_chunk]); - record_chunks(disk, d); + record_chunks(d); } break; + case 'G': + /* Set geometry */ + break; + case 'U': Free_Disk(d); - d = Open_Disk(disk); - record_chunks(disk, d); + d = Open_Disk(name); + if (!d) + msgFatal("Can't reopen disk %s!", name); + record_chunks(d); break; case 'W': - if (!msgYesNo("Are you sure you want to write this to disk?")) - Write_Disk(d); + if (!msgYesNo("Are you sure you want to go into Wizard mode?\nNo seat belts whatsoever are provided!")) { + clear(); + dialog_clear(); + end_dialog(); + DialogActive = FALSE; + slice_wizard(d); + clear(); + dialog_clear(); + DialogActive = TRUE; + record_chunks(d); + } else - msg = "Write not confirmed"; + msg = "Wise choice!"; break; case 27: /* ESC */ @@ -258,10 +271,16 @@ device_slice_disk(char *disk) break; default: - msg = "Invalid character typed."; + beep(); + msg = "Type F1 or ? for help"; break; } } + p = CheckRules(d); + if (p) { + msgConfirm(p); + free(p); + } clear(); refresh(); return d; diff --git a/usr.sbin/sade/disks.c b/usr.sbin/sade/disks.c new file mode 100644 index 0000000..0313372 --- /dev/null +++ b/usr.sbin/sade/disks.c @@ -0,0 +1,100 @@ +/* + * The new sysinstall program. + * + * This is probably the last program in the `sysinstall' line - the next + * generation being essentially a complete rewrite. + * + * $Id: install.c,v 1.5 1995/05/04 03:51:16 jkh Exp $ + * + * Copyright (c) 1995 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Jordan Hubbard + * for the FreeBSD Project. + * 4. The name of Jordan Hubbard or the FreeBSD project may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include "sysinstall.h" + +/* If the given disk has a root partition on it, return TRUE */ +static Boolean +contains_root_partition(struct disk *d) +{ + return FALSE; +} + +void +partition_disk(struct disk *d) +{ +} + +int +write_disks(struct disk **disks) +{ + int i; + extern u_char boot1[], boot2[]; + extern u_char mbr[], bteasy17[]; + + dialog_clear(); + if (!msgYesNo("Last Chance! Are you sure you want to write your changes to disk?")) { + for (i = 0; disks[i]; i++) { + if (contains_root_partition(disks[i])) + Set_Boot_Blocks(disks[i], boot1, boot2); + if (i == 0 && !msgYesNo("Would you like to install a boot manager?\n\nThis will allow you to easily select between other operating systems\non the first disk, as well as boot from a driver other than the first.")) + Set_Boot_Mgr(disks[i], bteasy17); + else if (i == 0 && !msgYesNo("Would you like to remove an existing boot manager?")) + Set_Boot_Mgr(disks[i], mbr); + Write_Disk(disks[i]); + } + return 0; + } + return 1; +} + +void +make_filesystems(struct disk **disks) +{ +} + +void +cpio_extract(struct disk **disks) +{ +} + +void +extract_dists(struct disk **disks) +{ +} + +void +do_final_setup(struct disk **disks) +{ +} + diff --git a/usr.sbin/sade/install.c b/usr.sbin/sade/install.c index 7de31ae..f64562c 100644 --- a/usr.sbin/sade/install.c +++ b/usr.sbin/sade/install.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: install.c,v 1.5 1995/05/04 03:51:16 jkh Exp $ + * $Id: install.c,v 1.6 1995/05/04 19:48:11 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -43,6 +43,8 @@ #include "sysinstall.h" +Boolean SystemWasInstalled; + static int installHook(char *str) { @@ -53,6 +55,7 @@ installHook(char *str) /* Clip garbage off the ends */ string_prune(str); str = string_skipwhite(str); + /* Try and open all the disks */ while (str) { char *cp; @@ -63,30 +66,42 @@ installHook(char *str) beep(); return 0; } - disks[i++] = device_slice_disk(str); + disks[i] = Open_Disk(str); + if (!disks[i]) + msgFatal("Unable to open disk %s!", str); + ++i; str = cp; } disks[i] = NULL; if (!i) return 0; - else { -#ifdef notdoneyet - partition_disks(disks); - if (!confirm_write(disks)) { - for (i = 0; disks[i]; i++) - Free_Disk(disks[i]); - return 0; - } - else { + + while (1) { + /* Now go set up all the MBR partition information */ + for (i = 0; disks[i]; i++) + disks[i] = device_slice_disk(disks[i]); + + for (i = 0; disks[i]; i++) + partition_disk(disks[i]); + + if (!write_disks(disks)) { make_filesystems(disks); cpio_extract(disks); extract_dists(disks); do_final_setup(disks); - systemShutdown(); + SystemWasInstalled = TRUE; + break; + } + else { + dialog_clear(); + if (msgYesNo("Would you like to go back to the master partition menu?")) { + for (i = 0; disks[i]; i++) + Free_Disk(disks[i]); + break; + } } -#endif } - return 1; + return SystemWasInstalled; } int @@ -105,7 +120,7 @@ installCustom(char *str) dmenuOpen(menu, &choice, &scroll, &curr, &max); free(menu); free(devs); - return 1; + return SystemWasInstalled; } int @@ -124,7 +139,7 @@ installExpress(char *str) dmenuOpen(menu, &choice, &scroll, &curr, &max); free(menu); free(devs); - return 1; + return SystemWasInstalled; } int diff --git a/usr.sbin/sade/menus.c b/usr.sbin/sade/menus.c index 39d2194..a823f5d 100644 --- a/usr.sbin/sade/menus.c +++ b/usr.sbin/sade/menus.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: menus.c,v 1.5 1995/05/04 03:51:19 jkh Exp $ + * $Id: menus.c,v 1.6 1995/05/04 19:48:14 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -65,7 +65,7 @@ DMenu MenuInitial = { "This is the main menu of the FreeBSD installation system. Please\n\ select one of the options below by using the arrow keys or typing the\n\ first character of the option name you're interested in. Invoke an\n\ -option by pressing enter.", /* prompt */ +option by pressing enter. If you'd like a shell, press ESC", /* prompt */ "Press F1 for usage instructions", /* help line */ "usage.hlp", /* help file */ { { "Usage", "Quick start - How to use this menu system.", /* U */ @@ -76,8 +76,6 @@ option by pressing enter.", /* prompt */ DMENU_SUBMENU, (void *)&MenuLanguage, 0 }, { "Install", "Begin installation", /* I */ DMENU_CALL, (void *)installCustom, 0 }, - { "Bootmsg", "Read the boot messages again.", /* B */ - DMENU_SYSTEM_COMMAND_BOX, (void *)"dmesg", 0 }, { NULL } }, }; diff --git a/usr.sbin/sade/msg.c b/usr.sbin/sade/msg.c index e6c2ba2..442a3c9 100644 --- a/usr.sbin/sade/msg.c +++ b/usr.sbin/sade/msg.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: msg.c,v 1.3 1995/05/04 03:51:21 jkh Exp $ + * $Id: msg.c,v 1.4 1995/05/04 19:48:16 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -173,7 +173,7 @@ msgConfirm(char *fmt, ...) va_end(args); use_helpline(NULL); use_helpfile(NULL); - dialog_mesgbox("User Confirmation Request", errstr, -1, -1); + dialog_mesgbox("User Attention Requested", errstr, -1, -1); free(errstr); } @@ -191,7 +191,7 @@ msgYesNo(char *fmt, ...) va_end(args); use_helpline(NULL); use_helpfile(NULL); - ret = dialog_yesno("Decision Required", errstr, -1, -1); + ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); free(errstr); return ret; } diff --git a/usr.sbin/sade/sade.h b/usr.sbin/sade/sade.h index 3152e2d..d0da1c1 100644 --- a/usr.sbin/sade/sade.h +++ b/usr.sbin/sade/sade.h @@ -4,7 +4,7 @@ * This is probably the last attempt in the `sysinstall' line, the next * generation being slated to essentially a complete rewrite. * - * $Id: sysinstall.h,v 1.5 1995/05/04 03:51:22 jkh Exp $ + * $Id: sysinstall.h,v 1.6 1995/05/04 19:48:17 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -49,6 +49,7 @@ #include <string.h> #include <unistd.h> #include <dialog.h> +#include "libdisk.h" /*** Defines ***/ @@ -171,6 +172,7 @@ extern int CpioFD; /* The file descriptor for our CPIO floppy */ extern int DebugFD; /* Where diagnostic output goes */ extern Boolean OnCDROM; /* Are we running off of a CDROM? */ extern Boolean OnSerial; /* Are we on a serial console? */ +extern Boolean SystemWasInstalled; /* Did we install it? */ extern Boolean DialogActive; /* Is the dialog() stuff up? */ extern Variable *VarHead; /* The head of the variable chain */ extern unsigned int Dists; /* Which distributions we want */ @@ -208,6 +210,14 @@ extern void systemChangeLang(char *lang); extern void systemChangeTerminal(char *color, char *mono); extern void systemChangeScreenmap(char *newmap); +/* disks.c */ +extern void partition_disk(struct disk *disks); +extern int write_disks(struct disk **disks); +extern void make_filesystems(struct disk **disks); +extern void cpio_extract(struct disk **disks); +extern void extract_dists(struct disk **disks); +extern void do_final_setup(struct disk **disks); + /* dmenu.c */ extern void dmenuOpen(DMenu *menu, int *choice, int *scroll, int *curr, int *max); @@ -248,7 +258,7 @@ extern int mediaSetFS(char *str); /* devices.c */ extern Device *device_get_all(DeviceType type, int *ndevs); -extern struct disk *device_slice_disk(char *disk); +extern struct disk *device_slice_disk(struct disk *d); extern DMenu *device_create_disk_menu(DMenu *menu, Device **rdevs, int (*func)()); @@ -268,5 +278,8 @@ extern void lang_set_Russian(char *str); extern void lang_set_Spanish(char *str); extern void lang_set_Swedish(char *str); +/* wizard.c */ +extern void slice_wizard(struct disk *d); + #endif /* _SYSINSTALL_H_INCLUDE */ diff --git a/usr.sbin/sade/wizard.c b/usr.sbin/sade/wizard.c new file mode 100644 index 0000000..88fd33b --- /dev/null +++ b/usr.sbin/sade/wizard.c @@ -0,0 +1,265 @@ +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + * + * $Id: tst01.c,v 1.8 1995/05/01 04:05:26 phk Exp $ + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <err.h> +#include <sys/types.h> +#include "libdisk.h" + +u_char mbr[] = { +250,51,192,142,208,188,0,124,139,244,80,7,80,31,251,252,191,0,6,185,0,1, +242,165,234,29,6,0,0,190,190,7,179,4,128,60,128,116,14,128,60,0,117,28, +131,198,16,254,203,117,239,205,24,139,20,139,76,2,139,238,131,198,16,254, +203,116,26,128,60,0,116,244,190,139,6,172,60,0,116,11,86,187,7,0,180,14, +205,16,94,235,240,235,254,191,5,0,187,0,124,184,1,2,87,205,19,95,115,12, +51,192,205,19,79,117,237,190,163,6,235,211,190,194,6,191,254,125,129,61, +85,170,117,199,139,245,234,0,124,0,0,73,110,118,97,108,105,100,32,112,97, +114,116,105,116,105,111,110,32,116,97,98,108,101,0,69,114,114,111,114,32, +108,111,97,100,105,110,103,32,111,112,101,114,97,116,105,110,103,32,115, +121,115,116,101,109,0,77,105,115,115,105,110,103,32,111,112,101,114,97, +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, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,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, +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, +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, +0,0,0,0,0,0,0,0,85,170 +}; + +u_char bteasy17[] = { +51,192,142,192,142,216,142,208,188,0,124,252,139,244,191,0,6,185,0,1,242, +165,234,96,6,0,0,139,213,88,162,72,7,60,53,116,28,180,16,246,228,5,174, +4,150,246,68,4,255,116,62,198,4,128,232,218,0,138,116,1,139,76,2,235,8, +232,207,0,185,1,0,50,209,187,0,124,184,1,2,205,19,114,30,129,191,254,1, +85,170,117,22,234,0,124,0,0,128,250,129,116,2,178,128,139,234,66,128,242, +179,136,22,58,7,191,190,7,185,4,0,198,6,45,7,49,50,246,136,45,138,69,4, +60,0,116,35,60,5,116,31,254,198,190,42,7,232,113,0,190,72,7,70,70,139,28, +10,255,116,5,50,125,4,117,243,141,183,114,7,232,90,0,131,199,16,254,6,45, +7,226,203,128,62,117,4,2,116,11,190,59,7,10,246,117,10,205,24,235,172,190, +42,7,232,57,0,232,54,0,50,228,205,26,139,218,131,195,96,180,1,205,22,180, +0,117,11,205,26,59,211,114,242,160,72,7,235,10,205,22,138,196,60,28,116, +243,4,246,60,49,114,214,60,53,119,210,80,190,40,7,187,27,6,83,252,172,80, +36,127,180,14,205,16,88,168,128,116,242,195,86,184,1,3,187,0,6,185,1,0, +50,246,205,19,94,198,6,72,7,63,195,13,138,13,10,70,48,32,46,32,46,32,46, +160,100,105,115,107,32,49,13,10,10,68,101,102,97,117,108,116,58,32,70,63, +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, +36,165,39,159,43,117,47,82,47,219,50,64,55,242,61,0,100,111,243,72,80,70, +211,79,115,178,85,110,105,248,78,111,118,101,108,236,77,105,110,105,248, +76,105,110,117,248,65,109,111,101,98,225,66,83,196,66,83,68,233,80,67,73, +216,67,80,205,86,101,110,105,248,68,111,115,115,101,227,63,191,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,85,170 +}; + +int +scan_block(int fd, daddr_t block) +{ + u_char foo[512]; + + if (-1 == lseek(fd,block * 512,SEEK_SET)) + err(1,"lseek"); + if (512 != read(fd,foo, 512)) + return 1; + return 0; +} + +void +Scan_Disk(struct disk *d) +{ + char device[64]; + u_long l; + int i,j,fd; + + strcpy(device,"/dev/r"); + strcat(device,d->name); + + fd = open(device,O_RDWR); + if (fd < 0) { + warn("open(%s) failed",device); + return; + } + for(i=-1,l=0;;l++) { + j = scan_block(fd,l); + if (j != i) { + if (i == -1) { + printf("%c: %lu.",j ? 'B' : 'G', l); + fflush(stdout); + } else if (i == 0) { + printf(".%lu\nB: %lu.",l-1,l); + fflush(stdout); + } else { + printf(".%lu\nG: %lu.",l-1,l); + fflush(stdout); + } + i = j; + } + } + close(fd); +} + +void +slice_wizard(struct disk *d) +{ + struct disk *db; + char myprompt[BUFSIZ]; + char input[BUFSIZ]; + char *p,*q=0; + char **cp,*cmds[200]; + int ncmd,i; + + sprintf(myprompt,"%s> ", d->name); + while(1) { + printf("--==##==--\n"); + Debug_Disk(d); + p = CheckRules(d); + if (p) { + printf("%s",p); + free(p); + } + printf(myprompt); + fflush(stdout); + q = p = fgets(input,sizeof(input),stdin); + if(!p) + break; + for(cp = cmds; (*cp = strsep(&p, " \t\n")) != NULL;) + if (**cp != '\0') + cp++; + ncmd = cp - cmds; + if(!ncmd) + continue; + if (!strcasecmp(*cmds,"quit")) { break; } + if (!strcasecmp(*cmds,"exit")) { break; } + if (!strcasecmp(*cmds,"q")) { break; } + if (!strcasecmp(*cmds,"x")) { break; } + if (!strcasecmp(*cmds,"delete") && ncmd == 2) { + printf("delete = %d\n", + Delete_Chunk(d, + (struct chunk *)strtol(cmds[1],0,0))); + continue; + } + if (!strcasecmp(*cmds,"allfreebsd")) { + All_FreeBSD(d); + continue; + } + if (!strcasecmp(*cmds,"bios") && ncmd == 4) { + Set_Bios_Geom(d, + strtol(cmds[1],0,0), + strtol(cmds[2],0,0), + strtol(cmds[3],0,0)); + continue; + } + if (!strcasecmp(*cmds,"phys") && ncmd == 4) { + d = Set_Phys_Geom(d, + strtol(cmds[1],0,0), + strtol(cmds[2],0,0), + strtol(cmds[3],0,0)); + continue; + } + if (!strcasecmp(*cmds,"collapse")) { + if (cmds[1]) + while (Collapse_Chunk(d, + (struct chunk *)strtol(cmds[1],0,0))) + ; + else + Collapse_Disk(d); + continue; + } + if (!strcasecmp(*cmds,"list")) { + cp = Disk_Names(); + printf("Disks:"); + for(i=0;cp[i];i++) { + printf(" %s",cp[i]); + free(cp[i]); + } + free(cp); + continue; + } + if (!strcasecmp(*cmds,"create") && ncmd == 6) { + + printf("Create=%d\n", + Create_Chunk(d, + strtol(cmds[1],0,0), + strtol(cmds[2],0,0), + strtol(cmds[3],0,0), + strtol(cmds[4],0,0), + strtol(cmds[5],0,0))); + continue; + } + if (!strcasecmp(*cmds,"read")) { + db = d; + if (ncmd > 1) + d = Open_Disk(cmds[1]); + else + d = Open_Disk(d->name); + if (d) + Free_Disk(db); + else + d = db; + continue; + } + if (!strcasecmp(*cmds,"scan")) { + Scan_Disk(d); + continue; + } + if (!strcasecmp(*cmds,"bteasy")) { + Set_Boot_Mgr(d,bteasy17); + continue; + } + if (!strcasecmp(*cmds,"mbr")) { + Set_Boot_Mgr(d,mbr); + continue; + } + if (!strcasecmp(*cmds,"boot")) { + extern u_char boot1[],boot2[]; + Set_Boot_Blocks(d,boot1,boot2); + continue; + } + if (!strcasecmp(*cmds,"write")) { + printf("Write=%d\n", + Write_Disk(d)); + Free_Disk(d); + d = Open_Disk(d->name); + continue; + } + if (strcasecmp(*cmds,"help")) + printf("\007ERROR\n"); + printf("CMDS:\n"); + printf("allfreebsd\t\t"); + printf("bios cyl hd sect\n"); + printf("boot\t\t"); + printf("bteasy17\n"); + printf("collapse [pointer]\t\t"); + printf("create offset size enum subtype flags\n"); + printf("subtype(part): swap=1, ffs=7\t\t"); + printf("delete pointer\n"); + printf("list\t\t"); + printf("mbr\n"); + printf("phys cyl hd sect\t\t"); + printf("quit\n"); + printf("read [disk]\t\t"); + printf("scan\n"); + printf("write\t\t"); + printf("ENUM:\n\t"); + for(i=0;chunk_n[i];i++) + printf("%d = %s%s",i,chunk_n[i],i == 4 ? "\n\t" : " "); + printf("\n"); + + } +} diff --git a/usr.sbin/sysinstall/Makefile b/usr.sbin/sysinstall/Makefile index a6d0704..f2fa070 100644 --- a/usr.sbin/sysinstall/Makefile +++ b/usr.sbin/sysinstall/Makefile @@ -7,7 +7,8 @@ CLEANFILES= makedevs.c rtermcap SRCS = globals.c main.c dmenu.c menus.c \ misc.c msg.c system.c install.c \ termcap.c makedevs.c media.c variable.c \ - devices.c dist.c lang.c + devices.c dist.c lang.c wizard.c \ + disks.c CFLAGS += -Wall -g -I${.CURDIR}/../libdisk diff --git a/usr.sbin/sysinstall/devices.c b/usr.sbin/sysinstall/devices.c index c777c0b..582db23 100644 --- a/usr.sbin/sysinstall/devices.c +++ b/usr.sbin/sysinstall/devices.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: devices.c,v 1.2 1995/05/04 03:51:14 jkh Exp $ + * $Id: devices.c,v 1.3 1995/05/04 19:48:09 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -42,7 +42,6 @@ */ #include "sysinstall.h" -#include "libdisk.h" #include <ctype.h> /* Where we start displaying chunk information on the screen */ @@ -79,13 +78,13 @@ static struct chunk *chunk_info[10]; static int current_chunk; static void -record_chunks(char *disk, struct disk *d) +record_chunks(struct disk *d) { struct chunk *c1; int i = 0; int last_free = 0; if (!d->chunks) - msgFatal("No chunk list found for %s!", disk); + msgFatal("No chunk list found for %s!", d->name); c1 = d->chunks->part; while (c1) { if (c1->type == unused && c1->size > last_free) { @@ -99,14 +98,15 @@ record_chunks(char *disk, struct disk *d) } static void -print_chunks(char *disk, struct disk *d) +print_chunks(struct disk *d) { int row; int i; attrset(A_NORMAL); mvaddstr(0, 0, "Disk name:\t"); - attrset(A_BOLD); addstr(disk); attrset(A_NORMAL); + attrset(A_BOLD); addstr(d->name); attrset(A_NORMAL); + attrset(A_REVERSE); mvaddstr(0, 55, "Master Partition Editor"); attrset(A_NORMAL); mvprintw(1, 0, "BIOS Geometry:\t%lu cyls/%lu heads/%lu sectors", d->bios_cyl, d->bios_hd, d->bios_sect); @@ -129,42 +129,34 @@ print_chunks(char *disk, struct disk *d) static void print_command_summary() { - mvprintw(15, 0, "The following commands are supported (in upper or lower case):"); + mvprintw(14, 0, "The following commands are supported (in upper or lower case):"); + mvprintw(16, 0, "A = Use Entire Disk B = Scan For Bad Blocks"); mvprintw(17, 0, "C = Create New Partition D = Delete Partition"); - mvprintw(18, 0, "B = Scan For Bad Blocks U = Undo All Changes"); - mvprintw(19, 0, "W = Write Changes ESC = Proceed to next screen"); + mvprintw(18, 0, "G = Set BIOS Geometry U = Undo All Changes"); + mvprintw(19, 0, "W = `Wizard' Mode ESC = Proceed to next screen"); mvprintw(21, 0, "The currently selected partition is displayed in "); attrset(A_BOLD); addstr("bold"); attrset(A_NORMAL); - mvprintw(22, 0, "Use F1 or `?' for help on this screen"); move(0, 0); } struct disk * -device_slice_disk(char *disk) +device_slice_disk(struct disk *d) { - struct disk *d; char *p; int key = 0; Boolean chunking; char *msg = NULL; - - d = Open_Disk(disk); - if (!d) - msgFatal("Couldn't open disk `%s'!", disk); - p = CheckRules(d); - if (p) { - msgConfirm(p); - free(p); - } + char name[40]; dialog_clear(); chunking = TRUE; + strncpy(name, d->name, 40); keypad(stdscr, TRUE); - record_chunks(disk, d); + record_chunks(d); while (chunking) { clear(); - print_chunks(disk, d); + print_chunks(d); print_command_summary(); if (msg) { standout(); mvprintw(23, 0, msg); standend(); @@ -203,10 +195,16 @@ device_slice_disk(char *disk) systemDisplayFile("slice.hlp"); break; + case 'A': + All_FreeBSD(d); + record_chunks(d); + break; + case 'B': if (chunk_info[current_chunk]->type != freebsd) msg = "Can only scan for bad blocks in FreeBSD partition."; - else + else if (strncmp(name, "sd", 2) || + !msgYesNo("This typically makes sense only for ESDI, IDE or MFM drives.\nAre you sure you want to do this on a SCSI disk?")) chunk_info[current_chunk]->flags |= CHUNK_BAD144; break; @@ -220,13 +218,13 @@ device_slice_disk(char *disk) snprintf(tmp, 20, "%d", chunk_info[current_chunk]->size); val = msgGetInput(tmp, "Please specify size for new FreeBSD partition"); - if (val && (size = atoi(val)) > 0) { + if (val && (size = strtol(val, 0, 0)) > 0) { Create_Chunk(d, chunk_info[current_chunk]->offset, size, freebsd, 3, chunk_info[current_chunk]->flags); - record_chunks(disk, d); + record_chunks(d); } } break; @@ -236,21 +234,36 @@ device_slice_disk(char *disk) msg = "Partition is already unused!"; else { Delete_Chunk(d, chunk_info[current_chunk]); - record_chunks(disk, d); + record_chunks(d); } break; + case 'G': + /* Set geometry */ + break; + case 'U': Free_Disk(d); - d = Open_Disk(disk); - record_chunks(disk, d); + d = Open_Disk(name); + if (!d) + msgFatal("Can't reopen disk %s!", name); + record_chunks(d); break; case 'W': - if (!msgYesNo("Are you sure you want to write this to disk?")) - Write_Disk(d); + if (!msgYesNo("Are you sure you want to go into Wizard mode?\nNo seat belts whatsoever are provided!")) { + clear(); + dialog_clear(); + end_dialog(); + DialogActive = FALSE; + slice_wizard(d); + clear(); + dialog_clear(); + DialogActive = TRUE; + record_chunks(d); + } else - msg = "Write not confirmed"; + msg = "Wise choice!"; break; case 27: /* ESC */ @@ -258,10 +271,16 @@ device_slice_disk(char *disk) break; default: - msg = "Invalid character typed."; + beep(); + msg = "Type F1 or ? for help"; break; } } + p = CheckRules(d); + if (p) { + msgConfirm(p); + free(p); + } clear(); refresh(); return d; diff --git a/usr.sbin/sysinstall/disks.c b/usr.sbin/sysinstall/disks.c new file mode 100644 index 0000000..0313372 --- /dev/null +++ b/usr.sbin/sysinstall/disks.c @@ -0,0 +1,100 @@ +/* + * The new sysinstall program. + * + * This is probably the last program in the `sysinstall' line - the next + * generation being essentially a complete rewrite. + * + * $Id: install.c,v 1.5 1995/05/04 03:51:16 jkh Exp $ + * + * Copyright (c) 1995 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Jordan Hubbard + * for the FreeBSD Project. + * 4. The name of Jordan Hubbard or the FreeBSD project may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include "sysinstall.h" + +/* If the given disk has a root partition on it, return TRUE */ +static Boolean +contains_root_partition(struct disk *d) +{ + return FALSE; +} + +void +partition_disk(struct disk *d) +{ +} + +int +write_disks(struct disk **disks) +{ + int i; + extern u_char boot1[], boot2[]; + extern u_char mbr[], bteasy17[]; + + dialog_clear(); + if (!msgYesNo("Last Chance! Are you sure you want to write your changes to disk?")) { + for (i = 0; disks[i]; i++) { + if (contains_root_partition(disks[i])) + Set_Boot_Blocks(disks[i], boot1, boot2); + if (i == 0 && !msgYesNo("Would you like to install a boot manager?\n\nThis will allow you to easily select between other operating systems\non the first disk, as well as boot from a driver other than the first.")) + Set_Boot_Mgr(disks[i], bteasy17); + else if (i == 0 && !msgYesNo("Would you like to remove an existing boot manager?")) + Set_Boot_Mgr(disks[i], mbr); + Write_Disk(disks[i]); + } + return 0; + } + return 1; +} + +void +make_filesystems(struct disk **disks) +{ +} + +void +cpio_extract(struct disk **disks) +{ +} + +void +extract_dists(struct disk **disks) +{ +} + +void +do_final_setup(struct disk **disks) +{ +} + diff --git a/usr.sbin/sysinstall/install.c b/usr.sbin/sysinstall/install.c index 7de31ae..f64562c 100644 --- a/usr.sbin/sysinstall/install.c +++ b/usr.sbin/sysinstall/install.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: install.c,v 1.5 1995/05/04 03:51:16 jkh Exp $ + * $Id: install.c,v 1.6 1995/05/04 19:48:11 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -43,6 +43,8 @@ #include "sysinstall.h" +Boolean SystemWasInstalled; + static int installHook(char *str) { @@ -53,6 +55,7 @@ installHook(char *str) /* Clip garbage off the ends */ string_prune(str); str = string_skipwhite(str); + /* Try and open all the disks */ while (str) { char *cp; @@ -63,30 +66,42 @@ installHook(char *str) beep(); return 0; } - disks[i++] = device_slice_disk(str); + disks[i] = Open_Disk(str); + if (!disks[i]) + msgFatal("Unable to open disk %s!", str); + ++i; str = cp; } disks[i] = NULL; if (!i) return 0; - else { -#ifdef notdoneyet - partition_disks(disks); - if (!confirm_write(disks)) { - for (i = 0; disks[i]; i++) - Free_Disk(disks[i]); - return 0; - } - else { + + while (1) { + /* Now go set up all the MBR partition information */ + for (i = 0; disks[i]; i++) + disks[i] = device_slice_disk(disks[i]); + + for (i = 0; disks[i]; i++) + partition_disk(disks[i]); + + if (!write_disks(disks)) { make_filesystems(disks); cpio_extract(disks); extract_dists(disks); do_final_setup(disks); - systemShutdown(); + SystemWasInstalled = TRUE; + break; + } + else { + dialog_clear(); + if (msgYesNo("Would you like to go back to the master partition menu?")) { + for (i = 0; disks[i]; i++) + Free_Disk(disks[i]); + break; + } } -#endif } - return 1; + return SystemWasInstalled; } int @@ -105,7 +120,7 @@ installCustom(char *str) dmenuOpen(menu, &choice, &scroll, &curr, &max); free(menu); free(devs); - return 1; + return SystemWasInstalled; } int @@ -124,7 +139,7 @@ installExpress(char *str) dmenuOpen(menu, &choice, &scroll, &curr, &max); free(menu); free(devs); - return 1; + return SystemWasInstalled; } int diff --git a/usr.sbin/sysinstall/menus.c b/usr.sbin/sysinstall/menus.c index 39d2194..a823f5d 100644 --- a/usr.sbin/sysinstall/menus.c +++ b/usr.sbin/sysinstall/menus.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: menus.c,v 1.5 1995/05/04 03:51:19 jkh Exp $ + * $Id: menus.c,v 1.6 1995/05/04 19:48:14 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -65,7 +65,7 @@ DMenu MenuInitial = { "This is the main menu of the FreeBSD installation system. Please\n\ select one of the options below by using the arrow keys or typing the\n\ first character of the option name you're interested in. Invoke an\n\ -option by pressing enter.", /* prompt */ +option by pressing enter. If you'd like a shell, press ESC", /* prompt */ "Press F1 for usage instructions", /* help line */ "usage.hlp", /* help file */ { { "Usage", "Quick start - How to use this menu system.", /* U */ @@ -76,8 +76,6 @@ option by pressing enter.", /* prompt */ DMENU_SUBMENU, (void *)&MenuLanguage, 0 }, { "Install", "Begin installation", /* I */ DMENU_CALL, (void *)installCustom, 0 }, - { "Bootmsg", "Read the boot messages again.", /* B */ - DMENU_SYSTEM_COMMAND_BOX, (void *)"dmesg", 0 }, { NULL } }, }; diff --git a/usr.sbin/sysinstall/msg.c b/usr.sbin/sysinstall/msg.c index e6c2ba2..442a3c9 100644 --- a/usr.sbin/sysinstall/msg.c +++ b/usr.sbin/sysinstall/msg.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: msg.c,v 1.3 1995/05/04 03:51:21 jkh Exp $ + * $Id: msg.c,v 1.4 1995/05/04 19:48:16 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -173,7 +173,7 @@ msgConfirm(char *fmt, ...) va_end(args); use_helpline(NULL); use_helpfile(NULL); - dialog_mesgbox("User Confirmation Request", errstr, -1, -1); + dialog_mesgbox("User Attention Requested", errstr, -1, -1); free(errstr); } @@ -191,7 +191,7 @@ msgYesNo(char *fmt, ...) va_end(args); use_helpline(NULL); use_helpfile(NULL); - ret = dialog_yesno("Decision Required", errstr, -1, -1); + ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1); free(errstr); return ret; } diff --git a/usr.sbin/sysinstall/sysinstall.h b/usr.sbin/sysinstall/sysinstall.h index 3152e2d..d0da1c1 100644 --- a/usr.sbin/sysinstall/sysinstall.h +++ b/usr.sbin/sysinstall/sysinstall.h @@ -4,7 +4,7 @@ * This is probably the last attempt in the `sysinstall' line, the next * generation being slated to essentially a complete rewrite. * - * $Id: sysinstall.h,v 1.5 1995/05/04 03:51:22 jkh Exp $ + * $Id: sysinstall.h,v 1.6 1995/05/04 19:48:17 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -49,6 +49,7 @@ #include <string.h> #include <unistd.h> #include <dialog.h> +#include "libdisk.h" /*** Defines ***/ @@ -171,6 +172,7 @@ extern int CpioFD; /* The file descriptor for our CPIO floppy */ extern int DebugFD; /* Where diagnostic output goes */ extern Boolean OnCDROM; /* Are we running off of a CDROM? */ extern Boolean OnSerial; /* Are we on a serial console? */ +extern Boolean SystemWasInstalled; /* Did we install it? */ extern Boolean DialogActive; /* Is the dialog() stuff up? */ extern Variable *VarHead; /* The head of the variable chain */ extern unsigned int Dists; /* Which distributions we want */ @@ -208,6 +210,14 @@ extern void systemChangeLang(char *lang); extern void systemChangeTerminal(char *color, char *mono); extern void systemChangeScreenmap(char *newmap); +/* disks.c */ +extern void partition_disk(struct disk *disks); +extern int write_disks(struct disk **disks); +extern void make_filesystems(struct disk **disks); +extern void cpio_extract(struct disk **disks); +extern void extract_dists(struct disk **disks); +extern void do_final_setup(struct disk **disks); + /* dmenu.c */ extern void dmenuOpen(DMenu *menu, int *choice, int *scroll, int *curr, int *max); @@ -248,7 +258,7 @@ extern int mediaSetFS(char *str); /* devices.c */ extern Device *device_get_all(DeviceType type, int *ndevs); -extern struct disk *device_slice_disk(char *disk); +extern struct disk *device_slice_disk(struct disk *d); extern DMenu *device_create_disk_menu(DMenu *menu, Device **rdevs, int (*func)()); @@ -268,5 +278,8 @@ extern void lang_set_Russian(char *str); extern void lang_set_Spanish(char *str); extern void lang_set_Swedish(char *str); +/* wizard.c */ +extern void slice_wizard(struct disk *d); + #endif /* _SYSINSTALL_H_INCLUDE */ diff --git a/usr.sbin/sysinstall/wizard.c b/usr.sbin/sysinstall/wizard.c new file mode 100644 index 0000000..88fd33b --- /dev/null +++ b/usr.sbin/sysinstall/wizard.c @@ -0,0 +1,265 @@ +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + * + * $Id: tst01.c,v 1.8 1995/05/01 04:05:26 phk Exp $ + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <err.h> +#include <sys/types.h> +#include "libdisk.h" + +u_char mbr[] = { +250,51,192,142,208,188,0,124,139,244,80,7,80,31,251,252,191,0,6,185,0,1, +242,165,234,29,6,0,0,190,190,7,179,4,128,60,128,116,14,128,60,0,117,28, +131,198,16,254,203,117,239,205,24,139,20,139,76,2,139,238,131,198,16,254, +203,116,26,128,60,0,116,244,190,139,6,172,60,0,116,11,86,187,7,0,180,14, +205,16,94,235,240,235,254,191,5,0,187,0,124,184,1,2,87,205,19,95,115,12, +51,192,205,19,79,117,237,190,163,6,235,211,190,194,6,191,254,125,129,61, +85,170,117,199,139,245,234,0,124,0,0,73,110,118,97,108,105,100,32,112,97, +114,116,105,116,105,111,110,32,116,97,98,108,101,0,69,114,114,111,114,32, +108,111,97,100,105,110,103,32,111,112,101,114,97,116,105,110,103,32,115, +121,115,116,101,109,0,77,105,115,115,105,110,103,32,111,112,101,114,97, +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, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,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, +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, +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, +0,0,0,0,0,0,0,0,85,170 +}; + +u_char bteasy17[] = { +51,192,142,192,142,216,142,208,188,0,124,252,139,244,191,0,6,185,0,1,242, +165,234,96,6,0,0,139,213,88,162,72,7,60,53,116,28,180,16,246,228,5,174, +4,150,246,68,4,255,116,62,198,4,128,232,218,0,138,116,1,139,76,2,235,8, +232,207,0,185,1,0,50,209,187,0,124,184,1,2,205,19,114,30,129,191,254,1, +85,170,117,22,234,0,124,0,0,128,250,129,116,2,178,128,139,234,66,128,242, +179,136,22,58,7,191,190,7,185,4,0,198,6,45,7,49,50,246,136,45,138,69,4, +60,0,116,35,60,5,116,31,254,198,190,42,7,232,113,0,190,72,7,70,70,139,28, +10,255,116,5,50,125,4,117,243,141,183,114,7,232,90,0,131,199,16,254,6,45, +7,226,203,128,62,117,4,2,116,11,190,59,7,10,246,117,10,205,24,235,172,190, +42,7,232,57,0,232,54,0,50,228,205,26,139,218,131,195,96,180,1,205,22,180, +0,117,11,205,26,59,211,114,242,160,72,7,235,10,205,22,138,196,60,28,116, +243,4,246,60,49,114,214,60,53,119,210,80,190,40,7,187,27,6,83,252,172,80, +36,127,180,14,205,16,88,168,128,116,242,195,86,184,1,3,187,0,6,185,1,0, +50,246,205,19,94,198,6,72,7,63,195,13,138,13,10,70,48,32,46,32,46,32,46, +160,100,105,115,107,32,49,13,10,10,68,101,102,97,117,108,116,58,32,70,63, +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, +36,165,39,159,43,117,47,82,47,219,50,64,55,242,61,0,100,111,243,72,80,70, +211,79,115,178,85,110,105,248,78,111,118,101,108,236,77,105,110,105,248, +76,105,110,117,248,65,109,111,101,98,225,66,83,196,66,83,68,233,80,67,73, +216,67,80,205,86,101,110,105,248,68,111,115,115,101,227,63,191,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,85,170 +}; + +int +scan_block(int fd, daddr_t block) +{ + u_char foo[512]; + + if (-1 == lseek(fd,block * 512,SEEK_SET)) + err(1,"lseek"); + if (512 != read(fd,foo, 512)) + return 1; + return 0; +} + +void +Scan_Disk(struct disk *d) +{ + char device[64]; + u_long l; + int i,j,fd; + + strcpy(device,"/dev/r"); + strcat(device,d->name); + + fd = open(device,O_RDWR); + if (fd < 0) { + warn("open(%s) failed",device); + return; + } + for(i=-1,l=0;;l++) { + j = scan_block(fd,l); + if (j != i) { + if (i == -1) { + printf("%c: %lu.",j ? 'B' : 'G', l); + fflush(stdout); + } else if (i == 0) { + printf(".%lu\nB: %lu.",l-1,l); + fflush(stdout); + } else { + printf(".%lu\nG: %lu.",l-1,l); + fflush(stdout); + } + i = j; + } + } + close(fd); +} + +void +slice_wizard(struct disk *d) +{ + struct disk *db; + char myprompt[BUFSIZ]; + char input[BUFSIZ]; + char *p,*q=0; + char **cp,*cmds[200]; + int ncmd,i; + + sprintf(myprompt,"%s> ", d->name); + while(1) { + printf("--==##==--\n"); + Debug_Disk(d); + p = CheckRules(d); + if (p) { + printf("%s",p); + free(p); + } + printf(myprompt); + fflush(stdout); + q = p = fgets(input,sizeof(input),stdin); + if(!p) + break; + for(cp = cmds; (*cp = strsep(&p, " \t\n")) != NULL;) + if (**cp != '\0') + cp++; + ncmd = cp - cmds; + if(!ncmd) + continue; + if (!strcasecmp(*cmds,"quit")) { break; } + if (!strcasecmp(*cmds,"exit")) { break; } + if (!strcasecmp(*cmds,"q")) { break; } + if (!strcasecmp(*cmds,"x")) { break; } + if (!strcasecmp(*cmds,"delete") && ncmd == 2) { + printf("delete = %d\n", + Delete_Chunk(d, + (struct chunk *)strtol(cmds[1],0,0))); + continue; + } + if (!strcasecmp(*cmds,"allfreebsd")) { + All_FreeBSD(d); + continue; + } + if (!strcasecmp(*cmds,"bios") && ncmd == 4) { + Set_Bios_Geom(d, + strtol(cmds[1],0,0), + strtol(cmds[2],0,0), + strtol(cmds[3],0,0)); + continue; + } + if (!strcasecmp(*cmds,"phys") && ncmd == 4) { + d = Set_Phys_Geom(d, + strtol(cmds[1],0,0), + strtol(cmds[2],0,0), + strtol(cmds[3],0,0)); + continue; + } + if (!strcasecmp(*cmds,"collapse")) { + if (cmds[1]) + while (Collapse_Chunk(d, + (struct chunk *)strtol(cmds[1],0,0))) + ; + else + Collapse_Disk(d); + continue; + } + if (!strcasecmp(*cmds,"list")) { + cp = Disk_Names(); + printf("Disks:"); + for(i=0;cp[i];i++) { + printf(" %s",cp[i]); + free(cp[i]); + } + free(cp); + continue; + } + if (!strcasecmp(*cmds,"create") && ncmd == 6) { + + printf("Create=%d\n", + Create_Chunk(d, + strtol(cmds[1],0,0), + strtol(cmds[2],0,0), + strtol(cmds[3],0,0), + strtol(cmds[4],0,0), + strtol(cmds[5],0,0))); + continue; + } + if (!strcasecmp(*cmds,"read")) { + db = d; + if (ncmd > 1) + d = Open_Disk(cmds[1]); + else + d = Open_Disk(d->name); + if (d) + Free_Disk(db); + else + d = db; + continue; + } + if (!strcasecmp(*cmds,"scan")) { + Scan_Disk(d); + continue; + } + if (!strcasecmp(*cmds,"bteasy")) { + Set_Boot_Mgr(d,bteasy17); + continue; + } + if (!strcasecmp(*cmds,"mbr")) { + Set_Boot_Mgr(d,mbr); + continue; + } + if (!strcasecmp(*cmds,"boot")) { + extern u_char boot1[],boot2[]; + Set_Boot_Blocks(d,boot1,boot2); + continue; + } + if (!strcasecmp(*cmds,"write")) { + printf("Write=%d\n", + Write_Disk(d)); + Free_Disk(d); + d = Open_Disk(d->name); + continue; + } + if (strcasecmp(*cmds,"help")) + printf("\007ERROR\n"); + printf("CMDS:\n"); + printf("allfreebsd\t\t"); + printf("bios cyl hd sect\n"); + printf("boot\t\t"); + printf("bteasy17\n"); + printf("collapse [pointer]\t\t"); + printf("create offset size enum subtype flags\n"); + printf("subtype(part): swap=1, ffs=7\t\t"); + printf("delete pointer\n"); + printf("list\t\t"); + printf("mbr\n"); + printf("phys cyl hd sect\t\t"); + printf("quit\n"); + printf("read [disk]\t\t"); + printf("scan\n"); + printf("write\t\t"); + printf("ENUM:\n\t"); + for(i=0;chunk_n[i];i++) + printf("%d = %s%s",i,chunk_n[i],i == 4 ? "\n\t" : " "); + printf("\n"); + + } +} |