summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--release/sysinstall/devices.c244
-rw-r--r--release/sysinstall/install.c75
-rw-r--r--release/sysinstall/main.c6
-rw-r--r--release/sysinstall/menus.c17
-rw-r--r--release/sysinstall/msg.c87
-rw-r--r--release/sysinstall/sysinstall.h8
-rw-r--r--usr.sbin/sade/devices.c244
-rw-r--r--usr.sbin/sade/install.c75
-rw-r--r--usr.sbin/sade/main.c6
-rw-r--r--usr.sbin/sade/menus.c17
-rw-r--r--usr.sbin/sade/msg.c87
-rw-r--r--usr.sbin/sade/sade.h8
-rw-r--r--usr.sbin/sysinstall/devices.c244
-rw-r--r--usr.sbin/sysinstall/install.c75
-rw-r--r--usr.sbin/sysinstall/main.c6
-rw-r--r--usr.sbin/sysinstall/menus.c17
-rw-r--r--usr.sbin/sysinstall/msg.c87
-rw-r--r--usr.sbin/sysinstall/sysinstall.h8
18 files changed, 1005 insertions, 306 deletions
diff --git a/release/sysinstall/devices.c b/release/sysinstall/devices.c
index 0f57283..d45d2df 100644
--- a/release/sysinstall/devices.c
+++ b/release/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: install.c,v 1.2 1995/04/27 18:03:53 jkh Exp $
+ * $Id: devices.c,v 1.1 1995/05/01 21:56:19 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -44,6 +44,9 @@
#include "sysinstall.h"
#include "libdisk.h"
+/* Where we start displaying chunk information on the screen */
+#define CHUNK_START_ROW 5
+
/* Get all device information for a given device class */
Device *
device_get_all(DeviceType which, int *ndevs)
@@ -71,26 +74,78 @@ device_get_all(DeviceType which, int *ndevs)
return devs;
}
-void
-device_print_chunk(struct chunk *c1, int offset, int *row)
+static struct chunk *chunk_info[10];
+static int current_chunk;
+
+static void
+record_chunks(char *disk, struct disk *d)
{
- CHAR_N
-
- if (!c1)
- return;
- mvprintw(*row++, offset, "%10lu %10lu %10lu %-8s %d %-8s %4d %lx",
- c1->offset, c1->size, c1->end, c1->name, c1->type,
- chunk_n[c1->type], c1->subtype, c1->flags);
- device_print_chunk(c1->part, offset + 2, row);
- device_print_chunk(c1->next, offset, row);
+ struct chunk *c1;
+ int i = 0;
+ int last_free = 0;
+ if (!d->chunks)
+ msgFatal("No chunk list found for %s!", disk);
+ c1 = d->chunks->part;
+ while (c1) {
+ if (c1->type == unused && c1->size > last_free) {
+ last_free = c1->size;
+ current_chunk = i;
+ }
+ chunk_info[i++] = c1;
+ c1 = c1->next;
+ }
+ chunk_info[i] = NULL;
}
-int
+static void
+print_chunks(char *disk, struct disk *d)
+{
+ int row;
+ int i;
+
+ attrset(A_NORMAL);
+ mvaddstr(0, 0, "Disk name:\t");
+ attrset(A_BOLD); addstr(disk); attrset(A_NORMAL);
+ mvprintw(1, 0,
+ "BIOS Geometry:\t%lu cyls/%lu heads/%lu sectors",
+ d->bios_cyl, d->bios_hd, d->bios_sect);
+ mvprintw(3, 1, "%10s %10s %10s %8s %8s %8s %8s %8s",
+ "Offset", "Size", "End", "Name", "PType", "Desc",
+ "Subtype", "Flags");
+ attrset(A_NORMAL);
+ for (i = 0, row = CHUNK_START_ROW; chunk_info[i]; i++, row++) {
+ if (i == current_chunk)
+ attrset(A_BOLD);
+ mvprintw(row, 2, "%10lu %10lu %10lu %8s %8d %8s %8d %6lx",
+ chunk_info[i]->offset, chunk_info[i]->size,
+ chunk_info[i]->end, chunk_info[i]->name,
+ chunk_info[i]->type, chunk_n[chunk_info[i]->type],
+ chunk_info[i]->subtype, chunk_info[i]->flags);
+ if (i == current_chunk)
+ attrset(A_NORMAL);
+ }
+}
+
+static void
+print_command_summary()
+{
+ mvprintw(15, 0, "The following commands are supported (in upper or lower case):");
+ 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, "ESC = Proceed to next screen");
+ mvprintw(21, 0, "The currently selected partition is displayed in ");
+ attrset(A_BOLD); addstr("bold"); attrset(A_NORMAL);
+ move(0, 0);
+}
+
+struct disk *
device_slice_disk(char *disk)
{
struct disk *d;
char *p;
- int row;
+ int key = 0;
+ Boolean chunking;
+ char *msg = NULL;
d = Open_Disk(disk);
if (!d)
@@ -100,23 +155,152 @@ device_slice_disk(char *disk)
msgConfirm(p);
free(p);
}
+
dialog_clear();
- while (1) {
+ chunking = TRUE;
+ keypad(stdscr, TRUE);
+
+ record_chunks(disk, d);
+ while (chunking) {
clear();
- mvprintw(0, 0, "Disk name: %s, Flags: %lx", disk, d->flags);
- mvprintw(1, 0,
- "Real Geometry: %lu/%lu/%lu, BIOS Geometry: %lu/%lu/%lu [cyls/heads/sectors]",
- d->real_cyl, d->real_hd, d->real_sect,
- d->bios_cyl, d->bios_hd, d->bios_sect);
- mvprintw(4, 0, "%10s %10s %10s %-8s %4s %-8s %4s %4s",
- "Offset", "Size", "End", "Name", "PType", "Desc",
- "Subtype", "Flags");
- row = 5;
- device_print_chunk(d->chunks, 0, &row);
- move(23, 0);
- addstr("Done!");
- if (getch() == 'q')
- return 0;
+ print_chunks(disk, d);
+ print_command_summary();
+ if (msg) {
+ standout(); mvprintw(23, 0, msg); standend();
+ beep();
+ msg = NULL;
+ }
+ refresh();
+
+ key = getch();
+ switch (key) {
+ case KEY_UP:
+ case '-':
+ if (current_chunk != 0)
+ --current_chunk;
+ break;
+
+ case KEY_DOWN:
+ case '+':
+ case '\r':
+ case '\n':
+ if (chunk_info[current_chunk + 1])
+ ++current_chunk;
+ break;
+
+ case KEY_HOME:
+ current_chunk = 0;
+ break;
+
+ case KEY_END:
+ while (chunk_info[current_chunk + 1])
+ ++current_chunk;
+ break;
+
+ case KEY_F(1):
+ case '?':
+ systemDisplayFile("slice.hlp");
+ break;
+
+ case 'B':
+ case 'b':
+ if (chunk_info[current_chunk]->type != freebsd)
+ msg = "Can only scan for bad blocks in FreeBSD partition.";
+ else
+ chunk_info[current_chunk]->flags |= CHUNK_BAD144;
+ break;
+
+ case 'C':
+ case 'c':
+ if (chunk_info[current_chunk]->type != unused)
+ msg = "Partition in use, delete it first or move to an unused one.";
+ else {
+ char *val;
+ char tmp[20];
+ int size;
+
+ 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) {
+ Create_Chunk(d, chunk_info[current_chunk]->offset,
+ size,
+ freebsd,
+ 3,
+ chunk_info[current_chunk]->flags);
+ record_chunks(disk, d);
+ }
+ }
+ break;
+
+ case 'D':
+ case 'd':
+ if (chunk_info[current_chunk]->type == unused)
+ msg = "Partition is already unused!";
+ else {
+ Delete_Chunk(d, chunk_info[current_chunk]);
+ record_chunks(disk, d);
+ }
+ break;
+
+ case 'U':
+ case 'u':
+ Free_Disk(d);
+ d = Open_Disk(disk);
+ record_chunks(disk, d);
+ break;
+
+ case 27: /* ESC */
+ chunking = FALSE;
+ break;
+
+ default:
+ msg = "Invalid character typed.";
+ break;
+ }
+ }
+ clear();
+ refresh();
+ return d;
+}
+
+/*
+ * Create a menu listing all the devices in the system. The pass-in menu
+ * is expected to be a "prototype" from which the new menu is cloned.
+ */
+DMenu *
+device_create_disk_menu(DMenu *menu, Device **rdevs, int (*hook)())
+{
+ Device *devices;
+ int numdevs;
+
+ devices = device_get_all(DEVICE_TYPE_DISK, &numdevs);
+ *rdevs = devices;
+ if (!devices) {
+ msgConfirm("No devices suitable for installation found!\n\nPlease verify that your disk controller (and attached drives) were detected properly. This can be done by selecting the ``Bootmsg'' option on the main menu and reviewing the boot messages carefully.");
+ return NULL;
+ }
+ else {
+ Device *start;
+ DMenu *tmp;
+ int i;
+
+ tmp = (DMenu *)safe_malloc(sizeof(DMenu) +
+ (sizeof(DMenuItem) * (numdevs + 1)));
+ bcopy(menu, tmp, sizeof(DMenu));
+ for (start = devices, i = 0; start->name[0]; start++, i++) {
+ tmp->items[i].title = start->name;
+ if (!strncmp(start->name, "sd", 2))
+ tmp->items[i].prompt = "SCSI disk";
+ else if (!strncmp(start->name, "wd", 2))
+ tmp->items[i].prompt = "IDE/ESDI/MFM/ST506 disk";
+ else
+ msgFatal("Unknown disk type: %s!", start->name);
+ tmp->items[i].type = DMENU_CALL;
+ tmp->items[i].ptr = hook;
+ tmp->items[i].disabled = FALSE;
+ }
+ tmp->items[i].type = DMENU_NOP;
+ tmp->items[i].title = NULL;
+ return tmp;
}
- return 0;
}
diff --git a/release/sysinstall/install.c b/release/sysinstall/install.c
index 23ad2d2..24b2a05 100644
--- a/release/sysinstall/install.c
+++ b/release/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.3 1995/04/29 19:33:01 jkh Exp $
+ * $Id: install.c,v 1.4 1995/05/01 21:56:22 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -46,60 +46,47 @@
static int
installHook(char *str)
{
- int rcode = 0;
+ int i;
+ struct disk *disks[100]; /* some ridiculously large number */
+ i = 0;
/* Clip garbage off the ends */
string_prune(str);
str = string_skipwhite(str);
while (str) {
char *cp;
- cp = index(str, ' ');
+ cp = index(str, '\n');
if (cp)
*cp++ = 0;
- rcode = !device_slice_disk(str);
+ if (!*str) {
+ beep();
+ return 0;
+ }
+ disks[i++] = device_slice_disk(str);
str = cp;
}
- return rcode;
-}
-
-/* Create a menu listing all the devices in the system. */
-static DMenu *
-getAllDisks(DMenu *menu, Device **rdevs)
-{
- Device *devices;
- int numdevs;
-
- devices = device_get_all(DEVICE_TYPE_DISK, &numdevs);
- *rdevs = devices;
- if (!devices) {
- msgConfirm("No devices suitable for installation found!\n\nPlease verify that your disk controller (and attached drives) were detected properly. This can be done by selecting the ``Bootmsg'' option on the main menu and reviewing the boot messages carefully.");
- return NULL;
- }
+ disks[i] = NULL;
+ if (!i)
+ return 0;
else {
- Device *start;
- DMenu *tmp;
- int i;
-
- tmp = (DMenu *)safe_malloc(sizeof(DMenu) +
- (sizeof(DMenuItem) * (numdevs + 1)));
- bcopy(menu, tmp, sizeof(DMenu));
- for (start = devices, i = 0; start->name[0]; start++, i++) {
- tmp->items[i].title = start->name;
- if (!strncmp(start->name, "sd", 2))
- tmp->items[i].prompt = "SCSI disk";
- else if (!strncmp(start->name, "wd", 2))
- tmp->items[i].prompt = "IDE/ESDI/MFM/ST506 disk";
- else
- msgFatal("Unknown disk type: %s!", start->name);
- tmp->items[i].type = DMENU_CALL;
- tmp->items[i].ptr = installHook;
- tmp->items[i].disabled = FALSE;
+#ifdef notdoneyet
+ partition_disks(disks);
+ if (!confirm_write(disks)) {
+ for (i = 0; disks[i]; i++)
+ Free_Disk(disks[i]);
+ return 0;
}
- tmp->items[i].type = DMENU_NOP;
- tmp->items[i].title = NULL;
- return tmp;
+ else {
+ make_filesystems(disks);
+ cpio_extract(disks);
+ extract_dists(disks);
+ do_final_setup(disks);
+ systemShutdown();
+ }
+#endif
}
+ return 1;
}
int
@@ -110,9 +97,8 @@ installCustom(char *str)
DMenu *menu;
Device *devs;
- msgInfo("Installating the system custom");
variable_set2("install_type", "custom");
- menu = getAllDisks(&MenuDiskDevices, &devs);
+ menu = device_create_disk_menu(&MenuDiskDevices, &devs, installHook);
if (!menu)
return 0;
choice = scroll = curr = max = 0;
@@ -130,9 +116,8 @@ installExpress(char *str)
DMenu *menu;
Device *devs;
- msgInfo("Installating the system express");
variable_set2("install_type", "express");
- menu = getAllDisks(&MenuDiskDevices, &devs);
+ menu = device_create_disk_menu(&MenuDiskDevices, &devs, installHook);
if (!menu)
return 0;
choice = scroll = curr = max = 0;
diff --git a/release/sysinstall/main.c b/release/sysinstall/main.c
index 31a7c0f..a1b1303 100644
--- a/release/sysinstall/main.c
+++ b/release/sysinstall/main.c
@@ -4,7 +4,7 @@
* This is probably the last attempt in the `sysinstall' line, the next
* generation being slated for what's essentially a complete rewrite.
*
- * $Id$
+ * $Id: main.c,v 1.1.1.1 1995/04/27 12:50:34 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -48,6 +48,10 @@ main(int argc, char **argv)
{
int choice, scroll, curr, max;
+ if (geteuid() != 0) {
+ fprintf(stderr, "This utility can only be run as root.\n");
+ return 1;
+ }
/* Set up whatever things need setting up */
systemInitialize(argc, argv);
diff --git a/release/sysinstall/menus.c b/release/sysinstall/menus.c
index 40180137..a2c83e9 100644
--- a/release/sysinstall/menus.c
+++ b/release/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.3 1995/04/29 19:33:03 jkh Exp $
+ * $Id: menus.c,v 1.4 1995/05/01 21:56:25 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -73,12 +73,8 @@ option by pressing enter.", /* prompt */
DMENU_SUBMENU, (void *)&MenuDocumentation, 0 },
{ "Lang", "Select natural language options.", /* L */
DMENU_SUBMENU, (void *)&MenuLanguage, 0 },
- { "Express", "Express installation (don't ask)", /* E */
- DMENU_CALL, (void *)installExpress, 0 },
- { "Custom", "Custom installation (please ask)", /* C */
+ { "Install", "Begin installation", /* I */
DMENU_CALL, (void *)installCustom, 0 },
- { "Maint", "Go into maintainance mode (`fix it').", /* M */
- DMENU_CALL, (void *)installMaint, 0 },
{ "Bootmsg", "Read the boot messages again.", /* B */
DMENU_SYSTEM_COMMAND_BOX, (void *)"dmesg", 0 },
{ NULL } },
@@ -142,6 +138,8 @@ of the english versions.", /* prompt */
DMENU_SET_VARIABLE, (void *)"LANG=ru_SU.KOI8-R", 0 },
{ "Spanish", "Spanish language and character set (ISO-8859-1)", /* S */
DMENU_SET_VARIABLE, (void *)"LANG=es_ES.ISO8859-1", 0 },
+ { "Swedish", "Swedish language and character set (ISO-8859-1)", /* S */
+ DMENU_SET_VARIABLE, (void *)"LANG=sv_SV.ISO8859-1", 0 },
{ NULL } },
};
@@ -247,10 +245,11 @@ DMenu MenuDiskDevices = {
FreeBSD. You need to select at least one drive containing some free\n\
space, though FreeBSD can be installed across several drives if you do\n\
not have the required space on a single drive. If you wish to boot\n\
-off a drive that's not a `zero drive', you will have the option to install\n\
-a boot manager later.",
- "drives.hlp",
+off a drive that's not a `zero drive', or have multiple operating\n\
+systems on your machine, you will have the option to install a boot\n\
+manager later.",
"Press F1 for more information on what you see here.",
+ "drives.hlp",
{ { NULL } },
};
diff --git a/release/sysinstall/msg.c b/release/sysinstall/msg.c
index bbb918b..a7bc625 100644
--- a/release/sysinstall/msg.c
+++ b/release/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.1.1.1 1995/04/27 12:50:34 jkh Exp $
+ * $Id: msg.c,v 1.2 1995/05/01 21:56:29 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -44,20 +44,45 @@
#include "sysinstall.h"
#include <stdarg.h>
+/* Whack up an informational message on the status line, in stand-out */
+void
+msgYap(char *fmt, ...)
+{
+ va_list args;
+ char *errstr;
+ int attrs;
+
+ errstr = (char *)malloc(FILENAME_MAX);
+ errstr[0] = '\0';
+ va_start(args, fmt);
+ vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
+ va_end(args);
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
+ free(errstr);
+}
+
/* Whack up an informational message on the status line */
void
msgInfo(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
errstr[0] = '\0';
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
- addstr(errstr);
+ attrs = getattrs(stdscr);
+ attrset(A_NORMAL);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -67,17 +92,19 @@ msgWarn(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Warning: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
+ attrs = getattrs(stdscr);
beep();
- standout();
- addstr(errstr);
- standend();
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -87,17 +114,19 @@ msgError(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Error: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
beep();
- standout();
- addstr(errstr);
- standend();
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -107,23 +136,25 @@ msgFatal(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Fatal Error: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
beep();
- standout();
- addstr(errstr);
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
addstr(" - ");
addstr("PRESS ANY KEY TO ");
if (getpid() == 1)
addstr("REBOOT");
else
addstr("QUIT");
- standend();
+ attrset(attrs);
+ refresh();
free(errstr);
getch();
systemShutdown();
@@ -164,3 +195,29 @@ msgYesNo(char *fmt, ...)
free(errstr);
return ret;
}
+
+/* Put up a message in an input box and return the value */
+char *
+msgGetInput(char *buf, char *fmt, ...)
+{
+ va_list args;
+ char *errstr;
+ char *ret;
+ static input_buffer[256];
+ int rval;
+
+ errstr = (char *)malloc(FILENAME_MAX);
+ va_start(args, fmt);
+ vsnprintf(errstr, FILENAME_MAX, fmt, args);
+ va_end(args);
+ use_helpline(NULL);
+ use_helpfile(NULL);
+ strcpy(input_buffer, buf);
+ rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
+ free(errstr);
+ if (!rval)
+ return input_buffer;
+ else
+ return NULL;
+}
+
diff --git a/release/sysinstall/sysinstall.h b/release/sysinstall/sysinstall.h
index 525afd1..17cd58ec 100644
--- a/release/sysinstall/sysinstall.h
+++ b/release/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.3 1995/04/29 19:33:05 jkh Exp $
+ * $Id: sysinstall.h,v 1.4 1995/05/01 21:56:30 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -182,11 +182,13 @@ extern int set_termcap(void);
/* msg.c */
extern void msgInfo(char *fmt, ...);
+extern void msgYap(char *fmt, ...);
extern void msgWarn(char *fmt, ...);
extern void msgError(char *fmt, ...);
extern void msgFatal(char *fmt, ...);
extern void msgConfirm(char *fmt, ...);
extern int msgYesNo(char *fmt, ...);
+extern char *msgGetInput(char *buf, char *fmt, ...);
/* media.c */
extern int mediaSetCDROM(char *str);
@@ -198,7 +200,9 @@ extern int mediaSetFS(char *str);
/* devices.c */
extern Device *device_get_all(DeviceType type, int *ndevs);
-extern int device_slice_disk(char *disk);
+extern struct disk *device_slice_disk(char *disk);
+extern DMenu *device_create_disk_menu(DMenu *menu, Device **rdevs,
+ int (*func)());
/* variables.c */
extern void variable_set(char *var);
diff --git a/usr.sbin/sade/devices.c b/usr.sbin/sade/devices.c
index 0f57283..d45d2df 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: install.c,v 1.2 1995/04/27 18:03:53 jkh Exp $
+ * $Id: devices.c,v 1.1 1995/05/01 21:56:19 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -44,6 +44,9 @@
#include "sysinstall.h"
#include "libdisk.h"
+/* Where we start displaying chunk information on the screen */
+#define CHUNK_START_ROW 5
+
/* Get all device information for a given device class */
Device *
device_get_all(DeviceType which, int *ndevs)
@@ -71,26 +74,78 @@ device_get_all(DeviceType which, int *ndevs)
return devs;
}
-void
-device_print_chunk(struct chunk *c1, int offset, int *row)
+static struct chunk *chunk_info[10];
+static int current_chunk;
+
+static void
+record_chunks(char *disk, struct disk *d)
{
- CHAR_N
-
- if (!c1)
- return;
- mvprintw(*row++, offset, "%10lu %10lu %10lu %-8s %d %-8s %4d %lx",
- c1->offset, c1->size, c1->end, c1->name, c1->type,
- chunk_n[c1->type], c1->subtype, c1->flags);
- device_print_chunk(c1->part, offset + 2, row);
- device_print_chunk(c1->next, offset, row);
+ struct chunk *c1;
+ int i = 0;
+ int last_free = 0;
+ if (!d->chunks)
+ msgFatal("No chunk list found for %s!", disk);
+ c1 = d->chunks->part;
+ while (c1) {
+ if (c1->type == unused && c1->size > last_free) {
+ last_free = c1->size;
+ current_chunk = i;
+ }
+ chunk_info[i++] = c1;
+ c1 = c1->next;
+ }
+ chunk_info[i] = NULL;
}
-int
+static void
+print_chunks(char *disk, struct disk *d)
+{
+ int row;
+ int i;
+
+ attrset(A_NORMAL);
+ mvaddstr(0, 0, "Disk name:\t");
+ attrset(A_BOLD); addstr(disk); attrset(A_NORMAL);
+ mvprintw(1, 0,
+ "BIOS Geometry:\t%lu cyls/%lu heads/%lu sectors",
+ d->bios_cyl, d->bios_hd, d->bios_sect);
+ mvprintw(3, 1, "%10s %10s %10s %8s %8s %8s %8s %8s",
+ "Offset", "Size", "End", "Name", "PType", "Desc",
+ "Subtype", "Flags");
+ attrset(A_NORMAL);
+ for (i = 0, row = CHUNK_START_ROW; chunk_info[i]; i++, row++) {
+ if (i == current_chunk)
+ attrset(A_BOLD);
+ mvprintw(row, 2, "%10lu %10lu %10lu %8s %8d %8s %8d %6lx",
+ chunk_info[i]->offset, chunk_info[i]->size,
+ chunk_info[i]->end, chunk_info[i]->name,
+ chunk_info[i]->type, chunk_n[chunk_info[i]->type],
+ chunk_info[i]->subtype, chunk_info[i]->flags);
+ if (i == current_chunk)
+ attrset(A_NORMAL);
+ }
+}
+
+static void
+print_command_summary()
+{
+ mvprintw(15, 0, "The following commands are supported (in upper or lower case):");
+ 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, "ESC = Proceed to next screen");
+ mvprintw(21, 0, "The currently selected partition is displayed in ");
+ attrset(A_BOLD); addstr("bold"); attrset(A_NORMAL);
+ move(0, 0);
+}
+
+struct disk *
device_slice_disk(char *disk)
{
struct disk *d;
char *p;
- int row;
+ int key = 0;
+ Boolean chunking;
+ char *msg = NULL;
d = Open_Disk(disk);
if (!d)
@@ -100,23 +155,152 @@ device_slice_disk(char *disk)
msgConfirm(p);
free(p);
}
+
dialog_clear();
- while (1) {
+ chunking = TRUE;
+ keypad(stdscr, TRUE);
+
+ record_chunks(disk, d);
+ while (chunking) {
clear();
- mvprintw(0, 0, "Disk name: %s, Flags: %lx", disk, d->flags);
- mvprintw(1, 0,
- "Real Geometry: %lu/%lu/%lu, BIOS Geometry: %lu/%lu/%lu [cyls/heads/sectors]",
- d->real_cyl, d->real_hd, d->real_sect,
- d->bios_cyl, d->bios_hd, d->bios_sect);
- mvprintw(4, 0, "%10s %10s %10s %-8s %4s %-8s %4s %4s",
- "Offset", "Size", "End", "Name", "PType", "Desc",
- "Subtype", "Flags");
- row = 5;
- device_print_chunk(d->chunks, 0, &row);
- move(23, 0);
- addstr("Done!");
- if (getch() == 'q')
- return 0;
+ print_chunks(disk, d);
+ print_command_summary();
+ if (msg) {
+ standout(); mvprintw(23, 0, msg); standend();
+ beep();
+ msg = NULL;
+ }
+ refresh();
+
+ key = getch();
+ switch (key) {
+ case KEY_UP:
+ case '-':
+ if (current_chunk != 0)
+ --current_chunk;
+ break;
+
+ case KEY_DOWN:
+ case '+':
+ case '\r':
+ case '\n':
+ if (chunk_info[current_chunk + 1])
+ ++current_chunk;
+ break;
+
+ case KEY_HOME:
+ current_chunk = 0;
+ break;
+
+ case KEY_END:
+ while (chunk_info[current_chunk + 1])
+ ++current_chunk;
+ break;
+
+ case KEY_F(1):
+ case '?':
+ systemDisplayFile("slice.hlp");
+ break;
+
+ case 'B':
+ case 'b':
+ if (chunk_info[current_chunk]->type != freebsd)
+ msg = "Can only scan for bad blocks in FreeBSD partition.";
+ else
+ chunk_info[current_chunk]->flags |= CHUNK_BAD144;
+ break;
+
+ case 'C':
+ case 'c':
+ if (chunk_info[current_chunk]->type != unused)
+ msg = "Partition in use, delete it first or move to an unused one.";
+ else {
+ char *val;
+ char tmp[20];
+ int size;
+
+ 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) {
+ Create_Chunk(d, chunk_info[current_chunk]->offset,
+ size,
+ freebsd,
+ 3,
+ chunk_info[current_chunk]->flags);
+ record_chunks(disk, d);
+ }
+ }
+ break;
+
+ case 'D':
+ case 'd':
+ if (chunk_info[current_chunk]->type == unused)
+ msg = "Partition is already unused!";
+ else {
+ Delete_Chunk(d, chunk_info[current_chunk]);
+ record_chunks(disk, d);
+ }
+ break;
+
+ case 'U':
+ case 'u':
+ Free_Disk(d);
+ d = Open_Disk(disk);
+ record_chunks(disk, d);
+ break;
+
+ case 27: /* ESC */
+ chunking = FALSE;
+ break;
+
+ default:
+ msg = "Invalid character typed.";
+ break;
+ }
+ }
+ clear();
+ refresh();
+ return d;
+}
+
+/*
+ * Create a menu listing all the devices in the system. The pass-in menu
+ * is expected to be a "prototype" from which the new menu is cloned.
+ */
+DMenu *
+device_create_disk_menu(DMenu *menu, Device **rdevs, int (*hook)())
+{
+ Device *devices;
+ int numdevs;
+
+ devices = device_get_all(DEVICE_TYPE_DISK, &numdevs);
+ *rdevs = devices;
+ if (!devices) {
+ msgConfirm("No devices suitable for installation found!\n\nPlease verify that your disk controller (and attached drives) were detected properly. This can be done by selecting the ``Bootmsg'' option on the main menu and reviewing the boot messages carefully.");
+ return NULL;
+ }
+ else {
+ Device *start;
+ DMenu *tmp;
+ int i;
+
+ tmp = (DMenu *)safe_malloc(sizeof(DMenu) +
+ (sizeof(DMenuItem) * (numdevs + 1)));
+ bcopy(menu, tmp, sizeof(DMenu));
+ for (start = devices, i = 0; start->name[0]; start++, i++) {
+ tmp->items[i].title = start->name;
+ if (!strncmp(start->name, "sd", 2))
+ tmp->items[i].prompt = "SCSI disk";
+ else if (!strncmp(start->name, "wd", 2))
+ tmp->items[i].prompt = "IDE/ESDI/MFM/ST506 disk";
+ else
+ msgFatal("Unknown disk type: %s!", start->name);
+ tmp->items[i].type = DMENU_CALL;
+ tmp->items[i].ptr = hook;
+ tmp->items[i].disabled = FALSE;
+ }
+ tmp->items[i].type = DMENU_NOP;
+ tmp->items[i].title = NULL;
+ return tmp;
}
- return 0;
}
diff --git a/usr.sbin/sade/install.c b/usr.sbin/sade/install.c
index 23ad2d2..24b2a05 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.3 1995/04/29 19:33:01 jkh Exp $
+ * $Id: install.c,v 1.4 1995/05/01 21:56:22 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -46,60 +46,47 @@
static int
installHook(char *str)
{
- int rcode = 0;
+ int i;
+ struct disk *disks[100]; /* some ridiculously large number */
+ i = 0;
/* Clip garbage off the ends */
string_prune(str);
str = string_skipwhite(str);
while (str) {
char *cp;
- cp = index(str, ' ');
+ cp = index(str, '\n');
if (cp)
*cp++ = 0;
- rcode = !device_slice_disk(str);
+ if (!*str) {
+ beep();
+ return 0;
+ }
+ disks[i++] = device_slice_disk(str);
str = cp;
}
- return rcode;
-}
-
-/* Create a menu listing all the devices in the system. */
-static DMenu *
-getAllDisks(DMenu *menu, Device **rdevs)
-{
- Device *devices;
- int numdevs;
-
- devices = device_get_all(DEVICE_TYPE_DISK, &numdevs);
- *rdevs = devices;
- if (!devices) {
- msgConfirm("No devices suitable for installation found!\n\nPlease verify that your disk controller (and attached drives) were detected properly. This can be done by selecting the ``Bootmsg'' option on the main menu and reviewing the boot messages carefully.");
- return NULL;
- }
+ disks[i] = NULL;
+ if (!i)
+ return 0;
else {
- Device *start;
- DMenu *tmp;
- int i;
-
- tmp = (DMenu *)safe_malloc(sizeof(DMenu) +
- (sizeof(DMenuItem) * (numdevs + 1)));
- bcopy(menu, tmp, sizeof(DMenu));
- for (start = devices, i = 0; start->name[0]; start++, i++) {
- tmp->items[i].title = start->name;
- if (!strncmp(start->name, "sd", 2))
- tmp->items[i].prompt = "SCSI disk";
- else if (!strncmp(start->name, "wd", 2))
- tmp->items[i].prompt = "IDE/ESDI/MFM/ST506 disk";
- else
- msgFatal("Unknown disk type: %s!", start->name);
- tmp->items[i].type = DMENU_CALL;
- tmp->items[i].ptr = installHook;
- tmp->items[i].disabled = FALSE;
+#ifdef notdoneyet
+ partition_disks(disks);
+ if (!confirm_write(disks)) {
+ for (i = 0; disks[i]; i++)
+ Free_Disk(disks[i]);
+ return 0;
}
- tmp->items[i].type = DMENU_NOP;
- tmp->items[i].title = NULL;
- return tmp;
+ else {
+ make_filesystems(disks);
+ cpio_extract(disks);
+ extract_dists(disks);
+ do_final_setup(disks);
+ systemShutdown();
+ }
+#endif
}
+ return 1;
}
int
@@ -110,9 +97,8 @@ installCustom(char *str)
DMenu *menu;
Device *devs;
- msgInfo("Installating the system custom");
variable_set2("install_type", "custom");
- menu = getAllDisks(&MenuDiskDevices, &devs);
+ menu = device_create_disk_menu(&MenuDiskDevices, &devs, installHook);
if (!menu)
return 0;
choice = scroll = curr = max = 0;
@@ -130,9 +116,8 @@ installExpress(char *str)
DMenu *menu;
Device *devs;
- msgInfo("Installating the system express");
variable_set2("install_type", "express");
- menu = getAllDisks(&MenuDiskDevices, &devs);
+ menu = device_create_disk_menu(&MenuDiskDevices, &devs, installHook);
if (!menu)
return 0;
choice = scroll = curr = max = 0;
diff --git a/usr.sbin/sade/main.c b/usr.sbin/sade/main.c
index 31a7c0f..a1b1303 100644
--- a/usr.sbin/sade/main.c
+++ b/usr.sbin/sade/main.c
@@ -4,7 +4,7 @@
* This is probably the last attempt in the `sysinstall' line, the next
* generation being slated for what's essentially a complete rewrite.
*
- * $Id$
+ * $Id: main.c,v 1.1.1.1 1995/04/27 12:50:34 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -48,6 +48,10 @@ main(int argc, char **argv)
{
int choice, scroll, curr, max;
+ if (geteuid() != 0) {
+ fprintf(stderr, "This utility can only be run as root.\n");
+ return 1;
+ }
/* Set up whatever things need setting up */
systemInitialize(argc, argv);
diff --git a/usr.sbin/sade/menus.c b/usr.sbin/sade/menus.c
index 40180137..a2c83e9 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.3 1995/04/29 19:33:03 jkh Exp $
+ * $Id: menus.c,v 1.4 1995/05/01 21:56:25 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -73,12 +73,8 @@ option by pressing enter.", /* prompt */
DMENU_SUBMENU, (void *)&MenuDocumentation, 0 },
{ "Lang", "Select natural language options.", /* L */
DMENU_SUBMENU, (void *)&MenuLanguage, 0 },
- { "Express", "Express installation (don't ask)", /* E */
- DMENU_CALL, (void *)installExpress, 0 },
- { "Custom", "Custom installation (please ask)", /* C */
+ { "Install", "Begin installation", /* I */
DMENU_CALL, (void *)installCustom, 0 },
- { "Maint", "Go into maintainance mode (`fix it').", /* M */
- DMENU_CALL, (void *)installMaint, 0 },
{ "Bootmsg", "Read the boot messages again.", /* B */
DMENU_SYSTEM_COMMAND_BOX, (void *)"dmesg", 0 },
{ NULL } },
@@ -142,6 +138,8 @@ of the english versions.", /* prompt */
DMENU_SET_VARIABLE, (void *)"LANG=ru_SU.KOI8-R", 0 },
{ "Spanish", "Spanish language and character set (ISO-8859-1)", /* S */
DMENU_SET_VARIABLE, (void *)"LANG=es_ES.ISO8859-1", 0 },
+ { "Swedish", "Swedish language and character set (ISO-8859-1)", /* S */
+ DMENU_SET_VARIABLE, (void *)"LANG=sv_SV.ISO8859-1", 0 },
{ NULL } },
};
@@ -247,10 +245,11 @@ DMenu MenuDiskDevices = {
FreeBSD. You need to select at least one drive containing some free\n\
space, though FreeBSD can be installed across several drives if you do\n\
not have the required space on a single drive. If you wish to boot\n\
-off a drive that's not a `zero drive', you will have the option to install\n\
-a boot manager later.",
- "drives.hlp",
+off a drive that's not a `zero drive', or have multiple operating\n\
+systems on your machine, you will have the option to install a boot\n\
+manager later.",
"Press F1 for more information on what you see here.",
+ "drives.hlp",
{ { NULL } },
};
diff --git a/usr.sbin/sade/msg.c b/usr.sbin/sade/msg.c
index bbb918b..a7bc625 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.1.1.1 1995/04/27 12:50:34 jkh Exp $
+ * $Id: msg.c,v 1.2 1995/05/01 21:56:29 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -44,20 +44,45 @@
#include "sysinstall.h"
#include <stdarg.h>
+/* Whack up an informational message on the status line, in stand-out */
+void
+msgYap(char *fmt, ...)
+{
+ va_list args;
+ char *errstr;
+ int attrs;
+
+ errstr = (char *)malloc(FILENAME_MAX);
+ errstr[0] = '\0';
+ va_start(args, fmt);
+ vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
+ va_end(args);
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
+ free(errstr);
+}
+
/* Whack up an informational message on the status line */
void
msgInfo(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
errstr[0] = '\0';
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
- addstr(errstr);
+ attrs = getattrs(stdscr);
+ attrset(A_NORMAL);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -67,17 +92,19 @@ msgWarn(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Warning: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
+ attrs = getattrs(stdscr);
beep();
- standout();
- addstr(errstr);
- standend();
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -87,17 +114,19 @@ msgError(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Error: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
beep();
- standout();
- addstr(errstr);
- standend();
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -107,23 +136,25 @@ msgFatal(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Fatal Error: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
beep();
- standout();
- addstr(errstr);
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
addstr(" - ");
addstr("PRESS ANY KEY TO ");
if (getpid() == 1)
addstr("REBOOT");
else
addstr("QUIT");
- standend();
+ attrset(attrs);
+ refresh();
free(errstr);
getch();
systemShutdown();
@@ -164,3 +195,29 @@ msgYesNo(char *fmt, ...)
free(errstr);
return ret;
}
+
+/* Put up a message in an input box and return the value */
+char *
+msgGetInput(char *buf, char *fmt, ...)
+{
+ va_list args;
+ char *errstr;
+ char *ret;
+ static input_buffer[256];
+ int rval;
+
+ errstr = (char *)malloc(FILENAME_MAX);
+ va_start(args, fmt);
+ vsnprintf(errstr, FILENAME_MAX, fmt, args);
+ va_end(args);
+ use_helpline(NULL);
+ use_helpfile(NULL);
+ strcpy(input_buffer, buf);
+ rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
+ free(errstr);
+ if (!rval)
+ return input_buffer;
+ else
+ return NULL;
+}
+
diff --git a/usr.sbin/sade/sade.h b/usr.sbin/sade/sade.h
index 525afd1..17cd58ec 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.3 1995/04/29 19:33:05 jkh Exp $
+ * $Id: sysinstall.h,v 1.4 1995/05/01 21:56:30 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -182,11 +182,13 @@ extern int set_termcap(void);
/* msg.c */
extern void msgInfo(char *fmt, ...);
+extern void msgYap(char *fmt, ...);
extern void msgWarn(char *fmt, ...);
extern void msgError(char *fmt, ...);
extern void msgFatal(char *fmt, ...);
extern void msgConfirm(char *fmt, ...);
extern int msgYesNo(char *fmt, ...);
+extern char *msgGetInput(char *buf, char *fmt, ...);
/* media.c */
extern int mediaSetCDROM(char *str);
@@ -198,7 +200,9 @@ extern int mediaSetFS(char *str);
/* devices.c */
extern Device *device_get_all(DeviceType type, int *ndevs);
-extern int device_slice_disk(char *disk);
+extern struct disk *device_slice_disk(char *disk);
+extern DMenu *device_create_disk_menu(DMenu *menu, Device **rdevs,
+ int (*func)());
/* variables.c */
extern void variable_set(char *var);
diff --git a/usr.sbin/sysinstall/devices.c b/usr.sbin/sysinstall/devices.c
index 0f57283..d45d2df 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: install.c,v 1.2 1995/04/27 18:03:53 jkh Exp $
+ * $Id: devices.c,v 1.1 1995/05/01 21:56:19 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -44,6 +44,9 @@
#include "sysinstall.h"
#include "libdisk.h"
+/* Where we start displaying chunk information on the screen */
+#define CHUNK_START_ROW 5
+
/* Get all device information for a given device class */
Device *
device_get_all(DeviceType which, int *ndevs)
@@ -71,26 +74,78 @@ device_get_all(DeviceType which, int *ndevs)
return devs;
}
-void
-device_print_chunk(struct chunk *c1, int offset, int *row)
+static struct chunk *chunk_info[10];
+static int current_chunk;
+
+static void
+record_chunks(char *disk, struct disk *d)
{
- CHAR_N
-
- if (!c1)
- return;
- mvprintw(*row++, offset, "%10lu %10lu %10lu %-8s %d %-8s %4d %lx",
- c1->offset, c1->size, c1->end, c1->name, c1->type,
- chunk_n[c1->type], c1->subtype, c1->flags);
- device_print_chunk(c1->part, offset + 2, row);
- device_print_chunk(c1->next, offset, row);
+ struct chunk *c1;
+ int i = 0;
+ int last_free = 0;
+ if (!d->chunks)
+ msgFatal("No chunk list found for %s!", disk);
+ c1 = d->chunks->part;
+ while (c1) {
+ if (c1->type == unused && c1->size > last_free) {
+ last_free = c1->size;
+ current_chunk = i;
+ }
+ chunk_info[i++] = c1;
+ c1 = c1->next;
+ }
+ chunk_info[i] = NULL;
}
-int
+static void
+print_chunks(char *disk, struct disk *d)
+{
+ int row;
+ int i;
+
+ attrset(A_NORMAL);
+ mvaddstr(0, 0, "Disk name:\t");
+ attrset(A_BOLD); addstr(disk); attrset(A_NORMAL);
+ mvprintw(1, 0,
+ "BIOS Geometry:\t%lu cyls/%lu heads/%lu sectors",
+ d->bios_cyl, d->bios_hd, d->bios_sect);
+ mvprintw(3, 1, "%10s %10s %10s %8s %8s %8s %8s %8s",
+ "Offset", "Size", "End", "Name", "PType", "Desc",
+ "Subtype", "Flags");
+ attrset(A_NORMAL);
+ for (i = 0, row = CHUNK_START_ROW; chunk_info[i]; i++, row++) {
+ if (i == current_chunk)
+ attrset(A_BOLD);
+ mvprintw(row, 2, "%10lu %10lu %10lu %8s %8d %8s %8d %6lx",
+ chunk_info[i]->offset, chunk_info[i]->size,
+ chunk_info[i]->end, chunk_info[i]->name,
+ chunk_info[i]->type, chunk_n[chunk_info[i]->type],
+ chunk_info[i]->subtype, chunk_info[i]->flags);
+ if (i == current_chunk)
+ attrset(A_NORMAL);
+ }
+}
+
+static void
+print_command_summary()
+{
+ mvprintw(15, 0, "The following commands are supported (in upper or lower case):");
+ 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, "ESC = Proceed to next screen");
+ mvprintw(21, 0, "The currently selected partition is displayed in ");
+ attrset(A_BOLD); addstr("bold"); attrset(A_NORMAL);
+ move(0, 0);
+}
+
+struct disk *
device_slice_disk(char *disk)
{
struct disk *d;
char *p;
- int row;
+ int key = 0;
+ Boolean chunking;
+ char *msg = NULL;
d = Open_Disk(disk);
if (!d)
@@ -100,23 +155,152 @@ device_slice_disk(char *disk)
msgConfirm(p);
free(p);
}
+
dialog_clear();
- while (1) {
+ chunking = TRUE;
+ keypad(stdscr, TRUE);
+
+ record_chunks(disk, d);
+ while (chunking) {
clear();
- mvprintw(0, 0, "Disk name: %s, Flags: %lx", disk, d->flags);
- mvprintw(1, 0,
- "Real Geometry: %lu/%lu/%lu, BIOS Geometry: %lu/%lu/%lu [cyls/heads/sectors]",
- d->real_cyl, d->real_hd, d->real_sect,
- d->bios_cyl, d->bios_hd, d->bios_sect);
- mvprintw(4, 0, "%10s %10s %10s %-8s %4s %-8s %4s %4s",
- "Offset", "Size", "End", "Name", "PType", "Desc",
- "Subtype", "Flags");
- row = 5;
- device_print_chunk(d->chunks, 0, &row);
- move(23, 0);
- addstr("Done!");
- if (getch() == 'q')
- return 0;
+ print_chunks(disk, d);
+ print_command_summary();
+ if (msg) {
+ standout(); mvprintw(23, 0, msg); standend();
+ beep();
+ msg = NULL;
+ }
+ refresh();
+
+ key = getch();
+ switch (key) {
+ case KEY_UP:
+ case '-':
+ if (current_chunk != 0)
+ --current_chunk;
+ break;
+
+ case KEY_DOWN:
+ case '+':
+ case '\r':
+ case '\n':
+ if (chunk_info[current_chunk + 1])
+ ++current_chunk;
+ break;
+
+ case KEY_HOME:
+ current_chunk = 0;
+ break;
+
+ case KEY_END:
+ while (chunk_info[current_chunk + 1])
+ ++current_chunk;
+ break;
+
+ case KEY_F(1):
+ case '?':
+ systemDisplayFile("slice.hlp");
+ break;
+
+ case 'B':
+ case 'b':
+ if (chunk_info[current_chunk]->type != freebsd)
+ msg = "Can only scan for bad blocks in FreeBSD partition.";
+ else
+ chunk_info[current_chunk]->flags |= CHUNK_BAD144;
+ break;
+
+ case 'C':
+ case 'c':
+ if (chunk_info[current_chunk]->type != unused)
+ msg = "Partition in use, delete it first or move to an unused one.";
+ else {
+ char *val;
+ char tmp[20];
+ int size;
+
+ 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) {
+ Create_Chunk(d, chunk_info[current_chunk]->offset,
+ size,
+ freebsd,
+ 3,
+ chunk_info[current_chunk]->flags);
+ record_chunks(disk, d);
+ }
+ }
+ break;
+
+ case 'D':
+ case 'd':
+ if (chunk_info[current_chunk]->type == unused)
+ msg = "Partition is already unused!";
+ else {
+ Delete_Chunk(d, chunk_info[current_chunk]);
+ record_chunks(disk, d);
+ }
+ break;
+
+ case 'U':
+ case 'u':
+ Free_Disk(d);
+ d = Open_Disk(disk);
+ record_chunks(disk, d);
+ break;
+
+ case 27: /* ESC */
+ chunking = FALSE;
+ break;
+
+ default:
+ msg = "Invalid character typed.";
+ break;
+ }
+ }
+ clear();
+ refresh();
+ return d;
+}
+
+/*
+ * Create a menu listing all the devices in the system. The pass-in menu
+ * is expected to be a "prototype" from which the new menu is cloned.
+ */
+DMenu *
+device_create_disk_menu(DMenu *menu, Device **rdevs, int (*hook)())
+{
+ Device *devices;
+ int numdevs;
+
+ devices = device_get_all(DEVICE_TYPE_DISK, &numdevs);
+ *rdevs = devices;
+ if (!devices) {
+ msgConfirm("No devices suitable for installation found!\n\nPlease verify that your disk controller (and attached drives) were detected properly. This can be done by selecting the ``Bootmsg'' option on the main menu and reviewing the boot messages carefully.");
+ return NULL;
+ }
+ else {
+ Device *start;
+ DMenu *tmp;
+ int i;
+
+ tmp = (DMenu *)safe_malloc(sizeof(DMenu) +
+ (sizeof(DMenuItem) * (numdevs + 1)));
+ bcopy(menu, tmp, sizeof(DMenu));
+ for (start = devices, i = 0; start->name[0]; start++, i++) {
+ tmp->items[i].title = start->name;
+ if (!strncmp(start->name, "sd", 2))
+ tmp->items[i].prompt = "SCSI disk";
+ else if (!strncmp(start->name, "wd", 2))
+ tmp->items[i].prompt = "IDE/ESDI/MFM/ST506 disk";
+ else
+ msgFatal("Unknown disk type: %s!", start->name);
+ tmp->items[i].type = DMENU_CALL;
+ tmp->items[i].ptr = hook;
+ tmp->items[i].disabled = FALSE;
+ }
+ tmp->items[i].type = DMENU_NOP;
+ tmp->items[i].title = NULL;
+ return tmp;
}
- return 0;
}
diff --git a/usr.sbin/sysinstall/install.c b/usr.sbin/sysinstall/install.c
index 23ad2d2..24b2a05 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.3 1995/04/29 19:33:01 jkh Exp $
+ * $Id: install.c,v 1.4 1995/05/01 21:56:22 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -46,60 +46,47 @@
static int
installHook(char *str)
{
- int rcode = 0;
+ int i;
+ struct disk *disks[100]; /* some ridiculously large number */
+ i = 0;
/* Clip garbage off the ends */
string_prune(str);
str = string_skipwhite(str);
while (str) {
char *cp;
- cp = index(str, ' ');
+ cp = index(str, '\n');
if (cp)
*cp++ = 0;
- rcode = !device_slice_disk(str);
+ if (!*str) {
+ beep();
+ return 0;
+ }
+ disks[i++] = device_slice_disk(str);
str = cp;
}
- return rcode;
-}
-
-/* Create a menu listing all the devices in the system. */
-static DMenu *
-getAllDisks(DMenu *menu, Device **rdevs)
-{
- Device *devices;
- int numdevs;
-
- devices = device_get_all(DEVICE_TYPE_DISK, &numdevs);
- *rdevs = devices;
- if (!devices) {
- msgConfirm("No devices suitable for installation found!\n\nPlease verify that your disk controller (and attached drives) were detected properly. This can be done by selecting the ``Bootmsg'' option on the main menu and reviewing the boot messages carefully.");
- return NULL;
- }
+ disks[i] = NULL;
+ if (!i)
+ return 0;
else {
- Device *start;
- DMenu *tmp;
- int i;
-
- tmp = (DMenu *)safe_malloc(sizeof(DMenu) +
- (sizeof(DMenuItem) * (numdevs + 1)));
- bcopy(menu, tmp, sizeof(DMenu));
- for (start = devices, i = 0; start->name[0]; start++, i++) {
- tmp->items[i].title = start->name;
- if (!strncmp(start->name, "sd", 2))
- tmp->items[i].prompt = "SCSI disk";
- else if (!strncmp(start->name, "wd", 2))
- tmp->items[i].prompt = "IDE/ESDI/MFM/ST506 disk";
- else
- msgFatal("Unknown disk type: %s!", start->name);
- tmp->items[i].type = DMENU_CALL;
- tmp->items[i].ptr = installHook;
- tmp->items[i].disabled = FALSE;
+#ifdef notdoneyet
+ partition_disks(disks);
+ if (!confirm_write(disks)) {
+ for (i = 0; disks[i]; i++)
+ Free_Disk(disks[i]);
+ return 0;
}
- tmp->items[i].type = DMENU_NOP;
- tmp->items[i].title = NULL;
- return tmp;
+ else {
+ make_filesystems(disks);
+ cpio_extract(disks);
+ extract_dists(disks);
+ do_final_setup(disks);
+ systemShutdown();
+ }
+#endif
}
+ return 1;
}
int
@@ -110,9 +97,8 @@ installCustom(char *str)
DMenu *menu;
Device *devs;
- msgInfo("Installating the system custom");
variable_set2("install_type", "custom");
- menu = getAllDisks(&MenuDiskDevices, &devs);
+ menu = device_create_disk_menu(&MenuDiskDevices, &devs, installHook);
if (!menu)
return 0;
choice = scroll = curr = max = 0;
@@ -130,9 +116,8 @@ installExpress(char *str)
DMenu *menu;
Device *devs;
- msgInfo("Installating the system express");
variable_set2("install_type", "express");
- menu = getAllDisks(&MenuDiskDevices, &devs);
+ menu = device_create_disk_menu(&MenuDiskDevices, &devs, installHook);
if (!menu)
return 0;
choice = scroll = curr = max = 0;
diff --git a/usr.sbin/sysinstall/main.c b/usr.sbin/sysinstall/main.c
index 31a7c0f..a1b1303 100644
--- a/usr.sbin/sysinstall/main.c
+++ b/usr.sbin/sysinstall/main.c
@@ -4,7 +4,7 @@
* This is probably the last attempt in the `sysinstall' line, the next
* generation being slated for what's essentially a complete rewrite.
*
- * $Id$
+ * $Id: main.c,v 1.1.1.1 1995/04/27 12:50:34 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -48,6 +48,10 @@ main(int argc, char **argv)
{
int choice, scroll, curr, max;
+ if (geteuid() != 0) {
+ fprintf(stderr, "This utility can only be run as root.\n");
+ return 1;
+ }
/* Set up whatever things need setting up */
systemInitialize(argc, argv);
diff --git a/usr.sbin/sysinstall/menus.c b/usr.sbin/sysinstall/menus.c
index 40180137..a2c83e9 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.3 1995/04/29 19:33:03 jkh Exp $
+ * $Id: menus.c,v 1.4 1995/05/01 21:56:25 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -73,12 +73,8 @@ option by pressing enter.", /* prompt */
DMENU_SUBMENU, (void *)&MenuDocumentation, 0 },
{ "Lang", "Select natural language options.", /* L */
DMENU_SUBMENU, (void *)&MenuLanguage, 0 },
- { "Express", "Express installation (don't ask)", /* E */
- DMENU_CALL, (void *)installExpress, 0 },
- { "Custom", "Custom installation (please ask)", /* C */
+ { "Install", "Begin installation", /* I */
DMENU_CALL, (void *)installCustom, 0 },
- { "Maint", "Go into maintainance mode (`fix it').", /* M */
- DMENU_CALL, (void *)installMaint, 0 },
{ "Bootmsg", "Read the boot messages again.", /* B */
DMENU_SYSTEM_COMMAND_BOX, (void *)"dmesg", 0 },
{ NULL } },
@@ -142,6 +138,8 @@ of the english versions.", /* prompt */
DMENU_SET_VARIABLE, (void *)"LANG=ru_SU.KOI8-R", 0 },
{ "Spanish", "Spanish language and character set (ISO-8859-1)", /* S */
DMENU_SET_VARIABLE, (void *)"LANG=es_ES.ISO8859-1", 0 },
+ { "Swedish", "Swedish language and character set (ISO-8859-1)", /* S */
+ DMENU_SET_VARIABLE, (void *)"LANG=sv_SV.ISO8859-1", 0 },
{ NULL } },
};
@@ -247,10 +245,11 @@ DMenu MenuDiskDevices = {
FreeBSD. You need to select at least one drive containing some free\n\
space, though FreeBSD can be installed across several drives if you do\n\
not have the required space on a single drive. If you wish to boot\n\
-off a drive that's not a `zero drive', you will have the option to install\n\
-a boot manager later.",
- "drives.hlp",
+off a drive that's not a `zero drive', or have multiple operating\n\
+systems on your machine, you will have the option to install a boot\n\
+manager later.",
"Press F1 for more information on what you see here.",
+ "drives.hlp",
{ { NULL } },
};
diff --git a/usr.sbin/sysinstall/msg.c b/usr.sbin/sysinstall/msg.c
index bbb918b..a7bc625 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.1.1.1 1995/04/27 12:50:34 jkh Exp $
+ * $Id: msg.c,v 1.2 1995/05/01 21:56:29 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -44,20 +44,45 @@
#include "sysinstall.h"
#include <stdarg.h>
+/* Whack up an informational message on the status line, in stand-out */
+void
+msgYap(char *fmt, ...)
+{
+ va_list args;
+ char *errstr;
+ int attrs;
+
+ errstr = (char *)malloc(FILENAME_MAX);
+ errstr[0] = '\0';
+ va_start(args, fmt);
+ vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
+ va_end(args);
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
+ free(errstr);
+}
+
/* Whack up an informational message on the status line */
void
msgInfo(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
errstr[0] = '\0';
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
- addstr(errstr);
+ attrs = getattrs(stdscr);
+ attrset(A_NORMAL);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -67,17 +92,19 @@ msgWarn(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Warning: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
+ attrs = getattrs(stdscr);
beep();
- standout();
- addstr(errstr);
- standend();
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -87,17 +114,19 @@ msgError(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Error: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
beep();
- standout();
- addstr(errstr);
- standend();
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
+ attrset(attrs);
+ refresh();
free(errstr);
}
@@ -107,23 +136,25 @@ msgFatal(char *fmt, ...)
{
va_list args;
char *errstr;
+ int attrs;
errstr = (char *)malloc(FILENAME_MAX);
strcpy(errstr, "Fatal Error: ");
va_start(args, fmt);
vsnprintf((char *)(errstr + strlen(errstr)), FILENAME_MAX, fmt, args);
va_end(args);
- move(25, 0);
beep();
- standout();
- addstr(errstr);
+ attrs = getattrs(stdscr);
+ attrset(A_BOLD);
+ mvaddstr(23, 0, errstr);
addstr(" - ");
addstr("PRESS ANY KEY TO ");
if (getpid() == 1)
addstr("REBOOT");
else
addstr("QUIT");
- standend();
+ attrset(attrs);
+ refresh();
free(errstr);
getch();
systemShutdown();
@@ -164,3 +195,29 @@ msgYesNo(char *fmt, ...)
free(errstr);
return ret;
}
+
+/* Put up a message in an input box and return the value */
+char *
+msgGetInput(char *buf, char *fmt, ...)
+{
+ va_list args;
+ char *errstr;
+ char *ret;
+ static input_buffer[256];
+ int rval;
+
+ errstr = (char *)malloc(FILENAME_MAX);
+ va_start(args, fmt);
+ vsnprintf(errstr, FILENAME_MAX, fmt, args);
+ va_end(args);
+ use_helpline(NULL);
+ use_helpfile(NULL);
+ strcpy(input_buffer, buf);
+ rval = dialog_inputbox("Value Required", errstr, -1, -1, input_buffer);
+ free(errstr);
+ if (!rval)
+ return input_buffer;
+ else
+ return NULL;
+}
+
diff --git a/usr.sbin/sysinstall/sysinstall.h b/usr.sbin/sysinstall/sysinstall.h
index 525afd1..17cd58ec 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.3 1995/04/29 19:33:05 jkh Exp $
+ * $Id: sysinstall.h,v 1.4 1995/05/01 21:56:30 jkh Exp $
*
* Copyright (c) 1995
* Jordan Hubbard. All rights reserved.
@@ -182,11 +182,13 @@ extern int set_termcap(void);
/* msg.c */
extern void msgInfo(char *fmt, ...);
+extern void msgYap(char *fmt, ...);
extern void msgWarn(char *fmt, ...);
extern void msgError(char *fmt, ...);
extern void msgFatal(char *fmt, ...);
extern void msgConfirm(char *fmt, ...);
extern int msgYesNo(char *fmt, ...);
+extern char *msgGetInput(char *buf, char *fmt, ...);
/* media.c */
extern int mediaSetCDROM(char *str);
@@ -198,7 +200,9 @@ extern int mediaSetFS(char *str);
/* devices.c */
extern Device *device_get_all(DeviceType type, int *ndevs);
-extern int device_slice_disk(char *disk);
+extern struct disk *device_slice_disk(char *disk);
+extern DMenu *device_create_disk_menu(DMenu *menu, Device **rdevs,
+ int (*func)());
/* variables.c */
extern void variable_set(char *var);
OpenPOWER on IntegriCloud