summaryrefslogtreecommitdiffstats
path: root/sbin/sysinstall
diff options
context:
space:
mode:
authorpaul <paul@FreeBSD.org>1994-11-19 05:20:13 +0000
committerpaul <paul@FreeBSD.org>1994-11-19 05:20:13 +0000
commit45071d7640a3e9858ca4840888a16053dc25f01c (patch)
treef2234357336b1fb76eef6f0d5b40c87ccf40dfc4 /sbin/sysinstall
parentff4e7b036e4b7056ef672d18cd304fdda6e4e4c4 (diff)
downloadFreeBSD-src-45071d7640a3e9858ca4840888a16053dc25f01c.zip
FreeBSD-src-45071d7640a3e9858ca4840888a16053dc25f01c.tar.gz
I hope this gets my changes merged back into the current branch.
Removed a layer of menus. Auto select partition to install into -- first FreeBSD partition in MBR table. Abort if no FreeBSD partition. Added a F_BUTTON type. Fixed up label editor to show free space properly. Fixed a few bugs.
Diffstat (limited to 'sbin/sysinstall')
-rw-r--r--sbin/sysinstall/Makefile2
-rw-r--r--sbin/sysinstall/editor.c177
-rw-r--r--sbin/sysinstall/editor.h7
-rw-r--r--sbin/sysinstall/label.c154
-rw-r--r--sbin/sysinstall/label.h96
-rw-r--r--sbin/sysinstall/mbr.c164
-rw-r--r--sbin/sysinstall/stage1.c114
-rw-r--r--sbin/sysinstall/utils.c11
8 files changed, 429 insertions, 296 deletions
diff --git a/sbin/sysinstall/Makefile b/sbin/sysinstall/Makefile
index 610a1f3..fda713c 100644
--- a/sbin/sysinstall/Makefile
+++ b/sbin/sysinstall/Makefile
@@ -9,7 +9,7 @@ SRCS = bootarea.c editor.c exec.c dkcksum.c label.c main.c mbr.c \
termcap.c utils.c makedevs.c ourcurses.c
CFLAGS += -Wall -g -static -I${.CURDIR}/../../sys/
-LDADD = -ldialog -lncurses -lmytinfo -lforms
+LDADD = -ldialog -lncurses -lmytinfo
DPADD = ${LIBDIALOG} ${LIBNCURSES} ${LIBMYTINFO}
makedevs.c: dev2c.sh
diff --git a/sbin/sysinstall/editor.c b/sbin/sysinstall/editor.c
index 572c18c..c1cd690 100644
--- a/sbin/sysinstall/editor.c
+++ b/sbin/sysinstall/editor.c
@@ -10,17 +10,32 @@ disp_fields(WINDOW *window, struct field field[], int no_fields)
int i, j;
int len;
- wattrset(window, dialog_attr);
for (i=0; i < no_fields; i++) {
- len=strlen(field[i].field);
wmove(window, field[i].y, field[i].x);
- for (j=0; j < field[i].width; j++)
- if (j < len)
- waddch(window, field[i].field[j]);
- else
- waddch(window, ' ');
+ switch (field[i].type) {
+ case F_TITLE:
+ case F_EDIT:
+ if (field[i].type == F_TITLE)
+ wattrset(window, title_attr);
+ else
+ wattrset(window, dialog_attr);
+ len=strlen(field[i].field);
+ for (j=0; j < field[i].width; j++)
+ if (j < len)
+ waddch(window, field[i].field[j]);
+ else
+ waddch(window, ' ');
+ break;
+ case F_BUTTON:
+ print_button(window, field[i].field,
+ field[i].y,
+ field[i].x,
+ FALSE);
+ break;
+ }
}
wrefresh(window);
+ return (0);
}
int
@@ -51,3 +66,151 @@ change_field(struct field field, int key)
}
return (next);
}
+
+int
+edit_line(WINDOW *window, int y, int x, char *field, int width, int maxlen)
+{
+ int len;
+ int key = 0;
+ int fpos, dispos, curpos;
+ int i;
+ int done = 0;
+
+ len = strlen(field);
+ if (len < width) {
+ fpos = len;
+ curpos = len;
+ dispos = 0;
+ } else {
+ fpos = width;
+ curpos = width;
+ dispos = len - width;
+ };
+
+
+ do {
+ wattrset(window, item_selected_attr);
+ wmove(window, y, x);
+ for (i=0; i < width; i++)
+ if (i < (len - dispos))
+ waddch(window, field[dispos+i]);
+ else
+ waddch(window, ' ');
+ wmove(window, y, x + curpos);
+ wrefresh(window);
+
+ key = wgetch(window);
+ switch (key) {
+ case TAB:
+ case KEY_BTAB:
+ case KEY_UP:
+ case KEY_DOWN:
+ case ESC:
+ case '\n':
+ case '\r':
+ case ' ':
+ done = 1;
+ break;
+ case KEY_HOME:
+ if (len < width) {
+ fpos = len;
+ curpos = len;
+ dispos = 0;
+ } else {
+ fpos = width;
+ curpos = width;
+ dispos = len - width;
+ };
+ break;
+ case KEY_END:
+ if (len < width) {
+ dispos = 0;
+ curpos = len - 1;
+ } else {
+ dispos = len - width - 1;
+ curpos = width - 1;
+ }
+ fpos = len - 1;
+ break;
+ case KEY_LEFT:
+ if ((!curpos) && (!dispos)) {
+ beep();
+ break;
+ }
+ if (--curpos < 0) {
+ curpos = 0;
+ if (--dispos < 0)
+ dispos = 0;
+ }
+ if (--fpos < 0)
+ fpos = 0;
+ break;
+ case KEY_RIGHT:
+ if ((curpos + dispos) == len) {
+ beep();
+ break;
+ }
+ if ((curpos == (width-1)) && (dispos == (maxlen - width -1))) {
+ beep();
+ break;
+ }
+ if (++curpos >= width) {
+ curpos = width - 1;
+ dispos++;
+ }
+ if (dispos >= len)
+ dispos = len - 1;
+ if (++fpos >= len) {
+ fpos = len;
+ }
+ break;
+ case KEY_BACKSPACE:
+ case KEY_DC:
+ if ((!curpos) && (!dispos)) {
+ beep();
+ break;
+ }
+ if (fpos > 0) {
+ memmove(field+fpos-1, field+fpos, len - fpos);
+ len--;
+ fpos--;
+ if (curpos > 0)
+ --curpos;
+ if (!curpos)
+ --dispos;
+ if (dispos < 0)
+ dispos = 0;
+ } else
+ beep();
+ break;
+ default:
+ if (len < maxlen - 1) {
+ memmove(field+fpos+1, field+fpos, len - fpos);
+ field[fpos] = key;
+ len++;
+ fpos++;
+ if (++curpos == width) {
+ --curpos;
+ dispos++;
+ }
+ if (len == (maxlen - 1)) {
+ dispos = (maxlen - width - 1);
+ }
+ } else
+ beep();
+ break;
+ }
+ } while (!done);
+ wattrset(window, dialog_attr);
+ wmove(window, y, x);
+ for (i=0; i < width; i++)
+ if (i < (len - dispos))
+ waddch(window, field[dispos+i]);
+ else
+ waddch(window, ' ');
+ wmove(window, y, x + curpos);
+ wstandend(window);
+ field[len] = 0;
+ wrefresh(window);
+ return (key);
+}
diff --git a/sbin/sysinstall/editor.h b/sbin/sysinstall/editor.h
index c3375a4..79dd6a6 100644
--- a/sbin/sysinstall/editor.h
+++ b/sbin/sysinstall/editor.h
@@ -12,7 +12,14 @@ struct field {
int left;
int right;
char field[80];
+ int type;
};
+#define F_EDIT 0
+#define F_TITLE 1
+#define F_BUTTON 2
+#define F_TOGGLE 3
+
int disp_fields(WINDOW *, struct field *, int);
int change_field(struct field, int);
+int edit_line(WINDOW *, int, int, char *, int, int);
diff --git a/sbin/sysinstall/label.c b/sbin/sysinstall/label.c
index 1592d21..9dc8c38 100644
--- a/sbin/sysinstall/label.c
+++ b/sbin/sysinstall/label.c
@@ -30,42 +30,42 @@ extern char boot2[];
int
disk_size(struct disklabel *lbl)
{
- int size;
-
- size = lbl->d_secsize * lbl->d_nsectors *
+ int size;
+
+ size = lbl->d_secsize * lbl->d_nsectors *
lbl->d_ntracks * lbl->d_ncylinders;
- return (size / 1024 / 1024);
+ return (size / 1024 / 1024);
}
int
sectstoMb(int nsects, int secsize)
{
- int size;
-
- size = nsects * secsize;
- if (size)
+ int size;
+
+ size = nsects * secsize;
+ if (size)
size /= 1024 * 1024;
- return (size);
+ return (size);
}
int
Mbtosects(int Mb, int secsize)
{
- int nsects;
+ int nsects;
- nsects = (Mb * 1024 * 1024) / secsize;
- return(nsects);
+ nsects = (Mb * 1024 * 1024) / secsize;
+ return(nsects);
}
int
rndtocylbdry(int size, int secpercyl)
{
- int nocyls;
-
- nocyls = size / secpercyl;
- if ((nocyls * secpercyl) < size)
- nocyls++;
- return (nocyls * secpercyl);
+ int nocyls;
+
+ nocyls = size / secpercyl;
+ if ((nocyls * secpercyl) < size)
+ nocyls++;
+ return (nocyls * secpercyl);
}
char *
@@ -108,11 +108,12 @@ edit_disklabel(int disk)
int key = 0;
int next;
int cur_field;
+ int cur_part;
int i;
struct disklabel *lbl = &disk_list[disk].lbl;
- int offset;
- int nsects;
- int avail_sects;
+ int offset, slop;
+ int nsects, hog;
+ int avail_sects, free;
lbl->d_magic = DISKMAGIC;
bcopy("INSTALLATION", lbl->d_typename, strlen("INSTALLATION"));
@@ -126,7 +127,7 @@ edit_disklabel(int disk)
lbl->d_sbsize = SBSIZE;
lbl->d_npartitions = 8;
- /* Inialise the fstab entries */
+ /* Initialise the entries */
for (i=0; i < MAXPARTITIONS; i++) {
disk_list[disk].mounts[i].fs_spec =
(char *)malloc(label_field[i*5].maxlen+1);
@@ -152,6 +153,9 @@ edit_disklabel(int disk)
return (-1);
}
sprintf(disk_list[disk].mounts[i].fs_file, "%s", "Not Mounted");
+
+ sprintf(label_field[(i*5)+3].field, "%d",
+ sectstoMb(lbl->d_partitions[i].p_size, lbl->d_secsize));
}
if (!(window = newwin(24, 79, 0, 0))) {
@@ -162,49 +166,15 @@ edit_disklabel(int disk)
keypad(window, TRUE);
draw_box(window, 0, 0, 24, 79, dialog_attr, border_attr);
-
cur_field = 1;
while (key != ESC) {
- for (i=0; i < MAXPARTITIONS; i++) {
- sprintf(label_field[(i*5)].field, "%s",
- disk_list[disk].mounts[i].fs_spec);
- sprintf(label_field[(i*5)+1].field, "%s",
- disk_list[disk].mounts[i].fs_mntops);
- sprintf(label_field[(i*5)+2].field, "%s",
- fstypenames[lbl->d_partitions[i].p_fstype]);
- sprintf(label_field[(i*5)+3].field, "%d",
- sectstoMb(lbl->d_partitions[i].p_size,lbl->d_secsize));
- sprintf(label_field[(i*5)+4].field, "%s",
- disk_list[disk].mounts[i].fs_file);
- }
- disp_fields(window, label_field, sizeof(label_field)/sizeof(struct field));
- key = line_edit(window, label_field[cur_field].y,
- label_field[cur_field].x,
- label_field[cur_field].width,
- label_field[cur_field].maxlen,
- item_selected_attr,
- 1,
- label_field[cur_field].field);
- next = change_field(label_field[cur_field], key);
- if (next == -1)
- beep();
- else
- cur_field = next;
-
- /* Update label */
- for (i=0; i<MAXPARTITIONS; i++) {
- sprintf(disk_list[disk].mounts[i].fs_spec, "%s",
- label_field[(i*5)].field);
- sprintf(disk_list[disk].mounts[i].fs_mntops, "%s",
- label_field[(i*5)+1].field);
- sprintf(disk_list[disk].mounts[i].fs_file, "%s",
- label_field[(i*5)+4].field);
- }
+ /* Update disklabel */
avail_sects = lbl->d_partitions[OURPART].p_size;
offset = lbl->d_partitions[OURPART].p_offset;
+ slop = rndtocylbdry(offset, lbl->d_secpercyl) - offset;
for (i=0; i < MAXPARTITIONS; i++) {
if (i == OURPART)
continue;
@@ -213,6 +183,11 @@ edit_disklabel(int disk)
lbl->d_partitions[i].p_offset = offset;
nsects = atoi(label_field[(i*5)+3].field);
nsects = Mbtosects(nsects, lbl->d_secsize);
+ nsects = rndtocylbdry(nsects, lbl->d_secpercyl);
+ if (slop) {
+ nsects += slop;
+ slop = 0;
+ }
if (nsects > avail_sects)
nsects = avail_sects;
avail_sects -= nsects;
@@ -223,6 +198,69 @@ edit_disklabel(int disk)
lbl->d_partitions[i].p_fsize = DEFFSIZE;
lbl->d_partitions[i].p_frag = DEFFRAG;
}
+
+ for (i=0; i < MAXPARTITIONS; i++) {
+ sprintf(label_field[(i*5)].field, "%s",
+ disk_list[disk].mounts[i].fs_spec);
+ sprintf(label_field[(i*5)+1].field, "%s",
+ disk_list[disk].mounts[i].fs_mntops);
+ sprintf(label_field[(i*5)+2].field, "%s",
+ fstypenames[lbl->d_partitions[i].p_fstype]);
+ sprintf(label_field[(i*5)+3].field, "%d",
+ sectstoMb(lbl->d_partitions[i].p_size,lbl->d_secsize));
+ sprintf(label_field[(i*5)+4].field, "%s",
+ disk_list[disk].mounts[i].fs_file);
+ }
+
+ sprintf(label_field[47].field, "%d",
+ sectstoMb(avail_sects, lbl->d_secsize));
+
+ disp_fields(window, label_field,
+ sizeof(label_field)/sizeof(struct field));
+
+ do {
+ next = change_field(label_field[cur_field], key);
+ if (next == -1) {
+ beep();
+ break;
+ } else
+ cur_field = next;
+ cur_part = cur_field/5;
+ } while ((cur_part == OURPART) || (cur_part == RAWPART));
+
+ if (label_field[cur_field].type == F_EDIT)
+ key = edit_line(window, label_field[cur_field].y,
+ label_field[cur_field].x,
+ label_field[cur_field].field,
+ label_field[cur_field].width,
+ label_field[cur_field].maxlen);
+ if (label_field[cur_field].type == F_TOGGLE) {
+ /* There's ony one fortunately */
+ key = edit_line(window, label_field[cur_field].y,
+ label_field[cur_field].x,
+ label_field[cur_field].field,
+ label_field[cur_field].width,
+ label_field[cur_field].maxlen);
+ if (key == ' ') {
+ if (strcmp(label_field[cur_field].field, "YES"))
+ strcpy(label_field[cur_field].field, "NO");
+ } else
+ strcpy(label_field[cur_field].field, "YES");
+ }
+ /*
+ * Skip certain partitions.
+ * XXX - This isn't very elegant.
+ */
+ /* Update mount info */
+
+ for (i=0; i<MAXPARTITIONS; i++) {
+ sprintf(disk_list[disk].mounts[i].fs_spec, "%s",
+ label_field[(i*5)].field);
+ sprintf(disk_list[disk].mounts[i].fs_mntops, "%s",
+ label_field[(i*5)+1].field);
+ sprintf(disk_list[disk].mounts[i].fs_file, "%s",
+ label_field[(i*5)+4].field);
+ }
}
if (write_bootblocks(disk) == -1)
diff --git a/sbin/sysinstall/label.h b/sbin/sysinstall/label.h
index 365b6ed..f95d0c9 100644
--- a/sbin/sysinstall/label.h
+++ b/sbin/sysinstall/label.h
@@ -1,48 +1,52 @@
struct field label_field[] = {
- { 4, 02, 10, 10, -1, -1, -1, -1, -1, "wd0a"},
- { 4, 16, 3, 3, 2, 36, 6, -1, 2, "YES"},
- { 4, 27, 6, 30, 3, 37, 7, -1, 3, "MSDOS"},
- { 4, 39, 5, 5, 4, 38, 8, -1, 4, "1000"},
- { 4, 47, 30, 80, 6, 39, 9, -1, 1, "/an/example/mountpoint"},
- { 6, 02, 4, 4, -1, -1, -1, -1, -1, "wd0b"},
- { 6, 16, 3, 3, 7, 1, 11, -1, 7, "YES"},
- { 6, 27, 6, 20, 8, 2, 12, -1, 8, "MSDOS"},
- { 6, 39, 5, 5, 9, 3, 13, -1, 9, "1000"},
- { 6, 47, 30, 80, 11, 4, 14, -1, 6, "/an/example/mountpoint"},
- { 8, 02, 10, 10, -1, -1, -1, -1, -1, "wd0c"},
- { 8, 16, 3, 3, 12, 6, 16, -1, 12, "YES"},
- { 8, 27, 6, 20, 13, 7, 17, -1, 13, "MSDOS"},
- { 8, 39, 5, 5, 14, 8, 18, -1, 14, "1000"},
- { 8, 47, 30, 80, 16, 9, 19, -1, 11, "/an/example/mountpoint"},
- {10, 02, 10, 10, -1, -1, -1, -1, -1, "wd0d"},
- {10, 16, 3, 3, 17, 11, 21, -1, 17, "YES"},
- {10, 27, 6, 20, 18, 12, 22, -1, 18, "MSDOS"},
- {10, 39, 5, 5, 19, 13, 23, -1, 19, "1000"},
- {10, 47, 30, 80, 21, 14, 24, -1, 16, "/an/example/mountpoint"},
- {12, 02, 10, 10, -1, -1, -1, -1, -1, "wd0e"},
- {12, 16, 3, 3, 22, 16, 26, -1, 22, "YES"},
- {12, 27, 6, 20, 23, 17, 27, -1, 23, "MSDOS"},
- {12, 39, 5, 5, 24, 18, 28, -1, 24, "1000"},
- {12, 47, 30, 80, 26, 19, 29, -1, 21, "/an/example/mountpoint"},
- {14, 02, 10, 10, -1, -1, -1, -1, -1, "wd0f"},
- {14, 16, 3, 3, 27, 21, 31, -1, 27, "YES"},
- {14, 27, 6, 20, 28, 22, 32, -1, 28, "MSDOS"},
- {14, 39, 5, 5, 29, 23, 33, -1, 29, "1000"},
- {14, 47, 30, 80, 31, 24, 34, -1, 26, "/an/example/mountpoint"},
- {16, 02, 10, 10, -1, -1, -1, -1, -1, "wd0g"},
- {16, 16, 3, 3, 32, 26, 36, -1, 32, "YES"},
- {16, 27, 6, 20, 33, 27, 37, -1, 33, "MSDOS"},
- {16, 39, 5, 5, 34, 28, 38, -1, 34, "1000"},
- {16, 47, 30, 80, 36, 29, 39, -1, 31, "/an/example/mountpoint"},
- {18, 02, 10, 10, -1, -1, -1, -1, -1, "wd0h"},
- {18, 16, 3, 3, 37, 31, 1, -1, 37, "YES"},
- {18, 27, 6, 20, 38, 32, 2, -1, 38, "MSDOS"},
- {18, 39, 5, 5, 39, 33, 3, -1, 39, "1000"},
- {18, 47, 30, 80, 1, 34, 4, -1, 36, "/an/example/mountpoint"},
- { 0, 18, 17, 17, -1, -1, -1, -1, -1, "Disk label editor"},
- { 2, 2, 11, 11, -1, -1, -1, -1, -1, "Partition"},
- { 2, 14, 8, 8, -1, -1, -1, -1, -1, "Preserve"},
- { 2, 25, 10, 10, -1, -1, -1, -1, -1, "Filesystem"},
- { 2, 39, 5, 5, -1, -1, -1, -1, -1, "Size"},
- { 2, 47, 10, 10, -1, -1, -1, -1, -1, "Mountpoint"}
+ { 6, 02, 10, 10, -1, -1, -1, -1, -1, "wd0a", F_EDIT},
+ { 6, 16, 3, 3, 2, 1, 6, -1, 2, "YES", F_TOGGLE},
+ { 6, 27, 6, 30, 3, 1, 7, -1, 3, "MSDOS", F_EDIT},
+ { 6, 39, 5, 5, 4, 1, 8, -1, 4, "1000", F_EDIT},
+ { 6, 47, 30, 80, 6, 1, 9, -1, 1, "/an/example/mountpoint", F_EDIT},
+ { 8, 02, 4, 4, -1, -1, -1, -1, -1, "wd0b", F_EDIT},
+ { 8, 16, 3, 3, 7, 1, 11, -1, 7, "YES", F_TOGGLE},
+ { 8, 27, 6, 20, 8, 2, 12, -1, 8, "MSDOS", F_EDIT},
+ { 8, 39, 5, 5, 9, 3, 13, -1, 9, "1000", F_EDIT},
+ { 8, 47, 30, 80, 11, 4, 14, -1, 6, "/an/example/mountpoint", F_EDIT},
+ {10, 02, 10, 10, -1, -1, -1, -1, -1, "wd0c", F_EDIT},
+ {10, 16, 3, 3, 12, 6, 16, -1, 12, "YES", F_TOGGLE},
+ {10, 27, 6, 20, 13, 7, 17, -1, 13, "MSDOS", F_EDIT},
+ {10, 39, 5, 5, 14, 8, 18, -1, 14, "1000", F_EDIT},
+ {10, 47, 30, 80, 16, 9, 19, -1, 11, "/an/example/mountpoint", F_EDIT},
+ {12, 02, 10, 10, -1, -1, -1, -1, -1, "wd0d", F_EDIT},
+ {12, 16, 3, 3, 17, 11, 21, -1, 17, "YES", F_TOGGLE},
+ {12, 27, 6, 20, 18, 12, 22, -1, 18, "MSDOS", F_EDIT},
+ {12, 39, 5, 5, 19, 13, 23, -1, 19, "1000", F_EDIT},
+ {12, 47, 30, 80, 21, 14, 24, -1, 16, "/an/example/mountpoint", F_EDIT},
+ {14, 02, 10, 10, -1, -1, -1, -1, -1, "wd0e", F_EDIT},
+ {14, 16, 3, 3, 22, 16, 26, -1, 22, "YES", F_TOGGLE},
+ {14, 27, 6, 20, 23, 17, 27, -1, 23, "MSDOS", F_EDIT},
+ {14, 39, 5, 5, 24, 18, 28, -1, 24, "1000", F_EDIT},
+ {14, 47, 30, 80, 26, 19, 29, -1, 21, "/an/example/mountpoint", F_EDIT},
+ {16, 02, 10, 10, -1, -1, -1, -1, -1, "wd0f", F_EDIT},
+ {16, 16, 3, 3, 27, 21, 31, -1, 27, "YES", F_TOGGLE},
+ {16, 27, 6, 20, 28, 22, 32, -1, 28, "MSDOS", F_EDIT},
+ {16, 39, 5, 5, 29, 23, 33, -1, 29, "1000", F_EDIT},
+ {16, 47, 30, 80, 31, 24, 34, -1, 26, "/an/example/mountpoint", F_EDIT},
+ {18, 02, 10, 10, -1, -1, -1, -1, -1, "wd0g", F_EDIT},
+ {18, 16, 3, 3, 32, 26, 36, -1, 32, "YES", F_TOGGLE},
+ {18, 27, 6, 20, 33, 27, 37, -1, 33, "MSDOS", F_EDIT},
+ {18, 39, 5, 5, 34, 28, 38, -1, 34, "1000", F_EDIT},
+ {18, 47, 30, 80, 36, 29, 39, -1, 31, "/an/example/mountpoint", F_EDIT},
+ {20, 02, 10, 10, -1, -1, -1, -1, -1, "wd0h", F_EDIT},
+ {20, 16, 3, 3, 37, 31, 1, -1, 37, "YES", F_TOGGLE},
+ {20, 27, 6, 20, 38, 32, 1, -1, 38, "MSDOS", F_EDIT},
+ {20, 39, 5, 5, 39, 33, 1, -1, 39, "1000", F_EDIT},
+ {20, 47, 30, 80, 1, 34, 1, -1, 1, "/an/example/mountpoint", F_EDIT},
+ { 0, 27, 17, 17, -1, -1, -1, -1, -1, "Disk label editor", F_TITLE},
+ { 4, 2, 11, 11, -1, -1, -1, -1, -1, "Partition", F_TITLE},
+ { 4, 14, 8, 8, -1, -1, -1, -1, -1, "Preserve", F_TITLE},
+ { 4, 25, 10, 10, -1, -1, -1, -1, -1, "Filesystem", F_TITLE},
+ { 4, 39, 5, 5, -1, -1, -1, -1, -1, "Size", F_TITLE},
+ { 4, 47, 10, 10, -1, -1, -1, -1, -1, "Mountpoint", F_TITLE},
+ { 2, 34, 11, 11, -1, -1, -1, -1, -1, "Free space:", F_EDIT},
+ { 2, 47, 6, 6, -1, -1, -1, -1, -1, "000000", F_EDIT},
+ {22, 30, 2, 2, -1, -1, -1, -1, -1, "OK", F_BUTTON},
+ {22, 50, 2, 2, -1, -1, -1, -1, -1, "Cancel", F_BUTTON},
};
diff --git a/sbin/sysinstall/mbr.c b/sbin/sysinstall/mbr.c
index 5ddd0c0..f6644dd 100644
--- a/sbin/sysinstall/mbr.c
+++ b/sbin/sysinstall/mbr.c
@@ -151,46 +151,46 @@ clear_mbr(struct mbr *mbr, char *bootcode)
int fd;
/*
- * If installing to the whole disk
- * then clobber any existing bootcode.
+ * Must replace any old bootcode that was read
+ * from disk with our bootblocks.
*/
- TellEm("Loading MBR code from %s", bootcode);
- fd = open(bootcode, O_RDONLY);
- if (fd < 0) {
- sprintf(errmsg, "Couldn't open boot file %s\n", bootcode);
- return(-1);
- }
-
- if (read(fd, mbr->bootcode, MBRSIZE) < 0) {
- sprintf(errmsg, "Couldn't read from boot file %s\n", bootcode);
- return(-1);
- }
+ TellEm("Loading MBR code from %s", bootcode);
+ fd = open(bootcode, O_RDONLY);
+ if (fd < 0) {
+ sprintf(errmsg, "Couldn't open boot file %s\n", bootcode);
+ return(-1);
+ }
- if (close(fd) == -1) {
- sprintf(errmsg, "Couldn't close boot file %s\n", bootcode);
- return(-1);
- }
+ if (read(fd, mbr->bootcode, MBRSIZE) < 0) {
+ sprintf(errmsg, "Couldn't read from boot file %s\n", bootcode);
+ return(-1);
+ }
- /* Create an empty partition table */
+ if (close(fd) == -1) {
+ sprintf(errmsg, "Couldn't close boot file %s\n", bootcode);
+ return(-1);
+ }
- for (i=0; i < NDOSPART; i++) {
- mbr->dospart[i].dp_flag = 0;
- mbr->dospart[i].dp_shd = 0;
- mbr->dospart[i].dp_ssect = 0;
- mbr->dospart[i].dp_scyl = 0;
- mbr->dospart[i].dp_typ = 0;
- mbr->dospart[i].dp_ehd = 0;
- mbr->dospart[i].dp_esect = 0;
- mbr->dospart[i].dp_ecyl = 0;
- mbr->dospart[i].dp_start = 0;
- mbr->dospart[i].dp_size = 0;
- }
+ /* Create an empty partition table */
+
+ for (i=0; i < NDOSPART; i++) {
+ mbr->dospart[i].dp_flag = 0;
+ mbr->dospart[i].dp_shd = 0;
+ mbr->dospart[i].dp_ssect = 0;
+ mbr->dospart[i].dp_scyl = 0;
+ mbr->dospart[i].dp_typ = 0;
+ mbr->dospart[i].dp_ehd = 0;
+ mbr->dospart[i].dp_esect = 0;
+ mbr->dospart[i].dp_ecyl = 0;
+ mbr->dospart[i].dp_start = 0;
+ mbr->dospart[i].dp_size = 0;
+ }
- mbr->magic = MBR_MAGIC;
-
- dialog_clear();
- return(0);
+ mbr->magic = MBR_MAGIC;
+
+ dialog_clear();
+ return(0);
}
int
@@ -212,7 +212,7 @@ dedicated_mbr(struct mbr *mbr, char *bootcode, struct disklabel *lbl)
dp->dp_size =
(lbl->d_nsectors * lbl->d_ntracks * lbl->d_ncylinders) - dp->dp_start;
- dp->dp_typ = DOSPTYP_386BSD;
+ dp->dp_typ = MBR_PTYPE_FreeBSD;
dp->dp_flag = ACTIVE;
return(0);
@@ -253,12 +253,9 @@ get_geom_values(int disk)
sprintf(field[2].field, "%ld", lbl->d_nsectors);
disp_fields(window, field, sizeof(field)/sizeof(struct field));
- key = line_edit(window, field[cur_field].y, field[cur_field].x,
- field[cur_field].width,
- field[cur_field].maxlen,
- item_selected_attr,
- 1,
- field[cur_field].field);
+ key = edit_line(window, field[cur_field].y, field[cur_field].x,
+ field[cur_field].field, field[cur_field].width,
+ field[cur_field].maxlen);
next = change_field(field[cur_field], key);
if (next == -1)
beep();
@@ -288,7 +285,7 @@ edit_mbr(int disk)
/* Confirm disk parameters */
#ifdef 0
- dialog_msgbox("BIOS disk geometry values", "In order to setup the boot area of the disk it is necessary to know the BIOS values for the disk geometry i.e. the number of cylinders, heads and sectors. These values may be different form the real geometry of the disk, depending on whether or not your system uses geometry translation. At this stage it is the entries from the BIOS that are needed. If you do not know these they can be found by rebooting the machine and entering th BIOS setup routine. See you BIOS manual for details", -1, -1, 1)
+ dialog_msgbox("\nBIOS disk geometry values", "In order to setup the boot area of the disk it is necessary to know the BIOS values for the disk geometry i.e. the number of cylinders, heads and sectors. These values may be different form the real geometry of the disk, depending on whether or not your system uses geometry translation. At this stage it is the entries from the BIOS that are needed. If you do not know these they can be found by rebooting the machine and entering th BIOS setup routine. See you BIOS manual for details.\n", -1, -1, 1)
#endif
if (get_geom_values(disk) == -1)
return(-1);
@@ -303,10 +300,11 @@ edit_mbr(int disk)
while (!ok) {
AskAbort(scratch);
if (!dialog_yesno(TITLE,
- "Are you sure you wish to proceed ?",
- -1, -1)) {
+ "\nAre you sure you wish to proceed ?\n",
+ -1, -1)) {
+ dialog_clear();
if (dedicated_mbr(mbr, boot1, &disk_list[disk].lbl) == -1) {
- sprintf(scratch, "\n\nCouldn't create new master boot record.\n\n%s", errmsg);
+ sprintf(scratch, "\nCouldn't create new master boot record.\n\n%s", errmsg);
return(-1);
}
ok = 1;
@@ -314,17 +312,14 @@ edit_mbr(int disk)
}
}
- sprintf(scratch, "Do you wish to dedicate the whole disk to FreeBSD?\n\nDoing so will overwrite any existing data on the disk.");
+ sprintf(scratch, "\nDo you wish to dedicate the whole disk to FreeBSD?\n\nDoing so will overwrite any existing data on the disk.\n");
dialog_clear_norefresh();
if (!dialog_yesno(TITLE, scratch, -1, -1))
if (dedicated_mbr(mbr, boot1, &disk_list[disk].lbl) == -1) {
- sprintf(scratch, "\n\nCouldn't dedicate disk to FreeBSD.\n\n %s", errmsg);
+ sprintf(scratch, "\nCouldn't dedicate disk to FreeBSD.\n\n %s", errmsg);
return(-1);
}
- /* Fill in fields with mbr data */
-
-
if (!(window = newwin(24, 79, 0, 0))) {
sprintf(errmsg, "Failed to open window for MBR editor\n");
return (-1);
@@ -353,43 +348,60 @@ edit_mbr(int disk)
}
disp_fields(window, mbr_field, sizeof(mbr_field)/sizeof(struct field));
- key = line_edit(window, mbr_field[cur_field].y, mbr_field[cur_field].x,
- mbr_field[cur_field].width,
- mbr_field[cur_field].maxlen,
- item_selected_attr,
- 1,
- mbr_field[cur_field].field);
-
- /* Propagate changes to MBR */
- for (i=0; i < NDOSPART; i++) {
- mbr->dospart[i].dp_start = atoi(mbr_field[(i*12)+2].field);
- mbr->dospart[i].dp_scyl = atoi(mbr_field[(i*12)+3].field);
- mbr->dospart[i].dp_shd = atoi(mbr_field[(i*12)+4].field);
- mbr->dospart[i].dp_ssect = atoi(mbr_field[(i*12)+5].field);
- mbr->dospart[i].dp_ecyl = atoi(mbr_field[(i*12)+7].field);
- mbr->dospart[i].dp_ehd = atoi(mbr_field[(i*12)+8].field);
- mbr->dospart[i].dp_esect = atoi(mbr_field[(i*12)+9].field);
- mbr->dospart[i].dp_size = atoi(mbr_field[(i*12)+10].field);
+ switch (mbr_field[cur_field].type) {
+ case F_EDIT:
+ key = edit_line(window, mbr_field[cur_field].y,
+ mbr_field[cur_field].x,
+ mbr_field[cur_field].field, mbr_field[cur_field].width,
+ mbr_field[cur_field].maxlen);
+ /* Propagate changes to MBR */
+ for (i=0; i < NDOSPART; i++) {
+ mbr->dospart[i].dp_start = atoi(mbr_field[(i*12)+2].field);
+ mbr->dospart[i].dp_scyl = atoi(mbr_field[(i*12)+3].field);
+ mbr->dospart[i].dp_shd = atoi(mbr_field[(i*12)+4].field);
+ mbr->dospart[i].dp_ssect = atoi(mbr_field[(i*12)+5].field);
+ mbr->dospart[i].dp_ecyl = atoi(mbr_field[(i*12)+7].field);
+ mbr->dospart[i].dp_ehd = atoi(mbr_field[(i*12)+8].field);
+ mbr->dospart[i].dp_esect = atoi(mbr_field[(i*12)+9].field);
+ mbr->dospart[i].dp_size = atoi(mbr_field[(i*12)+10].field);
+ }
+ next = change_field(mbr_field[cur_field], key);
+ if (next == -1)
+ beep();
+ else
+ cur_field = next;
+ break;
+ case F_TITLE:
+ default:
+ break;
}
+ }
- next = change_field(mbr_field[cur_field], key);
- if (next == -1)
- beep();
- else
- cur_field = next;
- }
-
- sprintf(scratch, "Writing a new master boot record can erase the current disk contents.\n\n Are you sure you want to write the new MBR?");
+ sprintf(scratch, "\nWriting a new master boot record can erase the current disk contents.\n\n Are you sure you want to write the new MBR?\n");
dialog_clear_norefresh();
if (!dialog_yesno("Write new MBR?", scratch, -1, -1)) {
sprintf(scratch, "/dev/r%s%dd", disk_list[disk].devconf->dc_name,
disk_list[disk].devconf->dc_unit);
if (write_mbr(scratch, mbr) == -1) {
- sprintf(scratch, "The following error occured while trying to write the new MBR\n\n%s", errmsg);
+ sprintf(scratch, "\nThe following error occured while trying to write the new MBR.\n\n%s", errmsg);
return(-1);
}
}
+ /* Find first FreeBSD partition, as kernel would upon boot */
+ disk_list[disk].inst_part = -1;
+ for (i=0; i < NDOSPART; i++)
+ if (mbr->dospart[i].dp_typ == MBR_PTYPE_FreeBSD) {
+ disk_list[disk].inst_part = i;
+ break;
+ }
+
+ if (disk_list[disk].inst_part == -1) {
+ sprintf(errmsg, "\nThere is no space allocated to FreeBSD on %s\n",
+ diskname(disk));
+ return (-1);
+ }
+
delwin(window);
dialog_clear();
return (0);
diff --git a/sbin/sysinstall/stage1.c b/sbin/sysinstall/stage1.c
index 198f16e..554061a 100644
--- a/sbin/sysinstall/stage1.c
+++ b/sbin/sysinstall/stage1.c
@@ -147,7 +147,7 @@ query_devices()
}
int
-select_disk()
+configure_disks()
{
char *disk_names[] = {"wd", "sd", 0};
char diskname[20];
@@ -203,134 +203,42 @@ select_disk()
sprintf(options[(no_disks*2)+1], " Done");
dialog_clear_norefresh();
- if (dialog_menu("FreeBSD Installation", scratch, -1, -1, min(5,no_disks+1), no_disks+1,
- options, selection)) {
- sprintf(scratch,"You selected cancel.");
+ if (dialog_menu("FreeBSD Installation", scratch, -1, -1,
+ min(5, no_disks), no_disks, options, selection)) {
+ dialog_clear_norefresh();
+ sprintf(scratch,"\nYou selected cancel.\n");
AskAbort(scratch);
valid = 0;
continue;
}
-
choice = atoi(selection);
- if (choice == no_disks+1)
- valid = 1;
- else
- if (disk_list[choice-1].selected)
- disk_list[choice-1].selected = 0;
- else
- disk_list[choice-1].selected = 1;
- } while (!valid);
- dialog_clear();
- return(0);
-}
-
-void
-configure_disks()
-{
- int i;
- int items;
- int choice;
- int valid=0;
- int disks[MAX_NO_DEVICES];
-
- do {
- sprintf(scratch, "Select disk to configure");
-
- items = 0;
- for (i = 0; i < no_disks; i++) {
- if (disk_list[i].selected) {
- sprintf(options[(items*2)], "%d",items+1);
- sprintf(options[(items*2)+1], "%s%d",
- disk_list[i].devconf->dc_name,
- disk_list[i].devconf->dc_unit);
- disks[items] = i;
- items++;
- }
- }
-
- sprintf(options[items*2], "%d", items+1);
- sprintf(options[(items*2)+1], "Done");
- items++;
-
- dialog_clear_norefresh();
- if (dialog_menu("FreeBSD Installation", scratch, -1, -1, min(5,items), items,
- options, selection)) {
- sprintf(scratch,"You selected cancel.");
- AskAbort(scratch);
- valid = 0;
- continue;
- }
- choice = atoi(selection);
- if (choice == items)
+ if (choice == no_disks)
valid = 1;
else {
- if (edit_mbr(disks[choice-1]) == -1) {
- sprintf(scratch, "The following error occured while\nediting the master boot record.\n%s", errmsg);
+ if (edit_mbr(choice-1) == -1) {
+ sprintf(scratch, "\nThe following error occured while\nediting the master boot record.\n%s", errmsg);
AskAbort(scratch);
valid = 0;
continue;
};
- disk_list[disks[choice-1]].inst_part = select_partition(disks[choice-1]);
- if (edit_disklabel(disks[choice-1]) == -1) {
- sprintf(scratch, "The following error occured while\nediting the disklabel.\n%s", errmsg);
+ if (edit_disklabel(choice-1) == -1) {
+ sprintf(scratch, "\nThe following error occured while\nediting the disklabel.\n%s", errmsg);
AskAbort(scratch);
valid = 0;
continue;
}
+ disk_list[choice-1].selected = 1;
}
} while (!valid);
- dialog_clear();
}
int
-select_partition(int disk)
-{
- int valid;
- int i;
- int choice;
-
- do {
- valid = 1;
-
- sprintf(scratch,"Select one of the following areas to install to:");
- for (i=0; i < NDOSPART; i++) {
- sprintf(options[(i*2)], "%d",i+1);
- sprintf(options[(i*2)+1], "%s, (%ldMb)",
- part_type(disk_list[disk].mbr.dospart[i].dp_typ),
- disk_list[disk].mbr.dospart[i].dp_size * 512 / (1024 * 1024));
- }
- dialog_clear_norefresh();
- if (dialog_menu(TITLE,
- scratch, -1, -1, 4, 4, options, selection)) {
- sprintf(scratch,"You did not select a valid partition");
- AskAbort(scratch);
- valid = 0;
- }
- dialog_clear();
- choice = atoi(selection) - 1;
- } while (!valid);
- return(choice);
-}
-
-int
stage1()
{
int i;
int ok = 0;
query_devices();
-
- while (!ok) {
- select_disk();
- for (i=0; i < no_disks; i++)
- if (disk_list[i].selected)
- ok = 1;
- if (!ok) {
- sprintf(scratch, "You did not select any disks to install to.");
- AskAbort(scratch);
- }
- }
-
configure_disks();
exit(1);
}
diff --git a/sbin/sysinstall/utils.c b/sbin/sysinstall/utils.c
index db7f349..1a062ed 100644
--- a/sbin/sysinstall/utils.c
+++ b/sbin/sysinstall/utils.c
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id: utils.c,v 1.30 1994/11/17 23:36:49 ache Exp $
+ * $Id: utils.c,v 1.31 1994/11/19 00:09:00 ache Exp $
*
*/
@@ -99,10 +99,11 @@ AskAbort(char *fmt, ...)
va_start(ap,fmt);
vsnprintf(p, 2048, fmt, ap);
va_end(ap);
- strcat(p, "\nDo you wish to abort the installation?");
- if (!dialog_yesno("Abort", p, -1, -1))
+ strcat(p, "\nDo you wish to abort the installation?\n");
+ if (!dialog_yesno("Abort", p, -1, -1)) {
+ dialog_clear_norefresh();
Abort();
- else
+ } else
dialog_clear();
free(p);
}
@@ -110,7 +111,7 @@ AskAbort(char *fmt, ...)
void
Abort()
{
- if (dialog_yesno("Exit sysinstall","Are you sure you want to quit?",
+ if (dialog_yesno("Exit sysinstall","\nAre you sure you want to quit?\n",
-1, -1)) {
dialog_clear();
return;
OpenPOWER on IntegriCloud