Implemented buttons for all the screens.

Could do with some cosmetic tuning regarding placement and things.

Fixed some dialog code (from Andrew).
Pass mountpoints onto stage2 in a struct fstab *mounts[]
Fix all the field connections to conform to the new L&F document.
This commit is contained in:
Paul Richards 1994-11-19 17:29:19 +00:00
parent d85050deb1
commit 6dd3a38fff
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=4675
10 changed files with 418 additions and 461 deletions

View File

@ -134,6 +134,14 @@ write_bootblocks(int disk)
return (-1);
}
/* Update the in-core label too if possible */
if (ioctl(fd, DIOCSDINFO, lbl) < 0) {
sprintf(errmsg, "Couldn't change in-core disklabel for %s\n\n%s",
scratch, strerror(errno));
return (-1);
}
if (enable_label(fd) == -1)
return (-1);
@ -146,14 +154,6 @@ write_bootblocks(int disk)
if (disable_label(fd) == -1)
return (-1);
/* Update the in-core label too if possible */
if (ioctl(fd, DIOCSDINFO, lbl) < 0) {
sprintf(errmsg, "Couldn't change in-core disklabel for %s\n\n%s",
scratch, strerror(errno));
return (-1);
}
if (close(fd) == -1) {
sprintf(errmsg, "Couldn't close device %s\n\n%s",
scratch, strerror(errno));

View File

@ -58,7 +58,7 @@ change_field(struct field field, int key)
break;
case '\n':
case '\r':
next = field.next;
next = field.right;
break;
default:
next = -1;
@ -66,151 +66,53 @@ change_field(struct field field, int key)
}
return (next);
}
int
edit_line(WINDOW *window, int y, int x, char *field, int width, int maxlen)
button_press(WINDOW *window, struct field field)
{
int len;
int key = 0;
int fpos, dispos, curpos;
int i;
int done = 0;
int key;
len = strlen(field);
if (len < width) {
fpos = len;
curpos = len;
dispos = 0;
} else {
fpos = width;
curpos = width;
dispos = len - width;
};
print_button(window, field.field,
field.y,
field.x,
TRUE);
key = wgetch(window);
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);
switch (key) {
case '\n':
case '\r':
return (0);
case KEY_UP:
case KEY_DOWN:
case KEY_BTAB:
case '\t':
default:
return (key);
}
}
int
toggle_press(WINDOW *window, struct field field)
{
int key;
key = wgetch(window);
switch (key) {
case ' ':
field.spare++;
if (!field.misc[field.spare])
field.spare = 0;
sprintf(field.field, "%", field.misc[field.spare]);
return (key);
break;
case '\n':
case '\r':
case KEY_UP:
case KEY_DOWN:
case KEY_BTAB:
case '\t':
default:
return (key);
}
}

View File

@ -13,6 +13,8 @@ struct field {
int right;
char field[80];
int type;
int spare;
char *misc;
};
#define F_EDIT 0

View File

@ -27,6 +27,8 @@ char *partname[MAXPARTITIONS] = {"a", "b", "c", "d", "e", "f", "g", "h"};
extern char boot1[];
extern char boot2[];
char *yesno[] = {"yes", "no", 0};
int
disk_size(struct disklabel *lbl)
{
@ -76,6 +78,18 @@ diskname(int disk)
return (scratch);
}
int
get_fs_type(char *fstype)
{
int i;
for (i=0; fstypenames[i]; i++)
if (strcmp(fstype, fstypenames[i]))
return (i);
return (FS_OTHER);
}
int
read_disklabel(int disk)
{
@ -106,6 +120,7 @@ edit_disklabel(int disk)
{
WINDOW *window;
int key = 0;
int done;
int next;
int cur_field;
int cur_part;
@ -128,37 +143,74 @@ edit_disklabel(int disk)
lbl->d_npartitions = 8;
/* Initialise the entries */
for (i=0; i < MAXPARTITIONS; i++) {
disk_list[disk].mounts[i].fs_spec =
(char *)malloc(label_field[i*5].maxlen+1);
(char *)malloc(80);
if (!disk_list[disk].mounts[i].fs_spec) {
sprintf(errmsg, "Couldn't allocate memory for device mounts\n");
return (-1);
}
sprintf(disk_list[disk].mounts[i].fs_spec,
"%s%d%s", disk_list[disk].devconf->dc_name,
"/dev/%s%d%s", disk_list[disk].devconf->dc_name,
disk_list[disk].devconf->dc_unit,
partname[i]);
disk_list[disk].mounts[i].fs_mntops =
(char *)malloc(label_field[(i*5)+1].maxlen+1);
if (!disk_list[disk].mounts[i].fs_mntops) {
sprintf(errmsg, "Couldn't allocate memory for mount options\n");
return (-1);
}
sprintf(disk_list[disk].mounts[i].fs_mntops, "%s", "YES");
disk_list[disk].mounts[i].fs_file =
(char *)malloc(label_field[(i*5)+4].maxlen+1);
(char *)malloc(80);
if (!disk_list[disk].mounts[i].fs_file) {
sprintf(errmsg, "Couldn't allocate memory for mount points\n");
return (-1);
}
sprintf(disk_list[disk].mounts[i].fs_file, "%s", "Not Mounted");
disk_list[disk].mounts[i].fs_vfstype =
(char *)malloc(80);
if (!disk_list[disk].mounts[i].fs_vfstype) {
sprintf(errmsg, "Couldn't allocate memory for filesystem type\n");
return (-1);
}
switch (lbl->d_partitions[i].p_fstype) {
case FS_BSDFFS:
sprintf(disk_list[disk].mounts[i].fs_vfstype, "%s", "ufs");
break;
case FS_MSDOS:
sprintf(disk_list[disk].mounts[i].fs_vfstype, "%s", "msdos");
break;
case FS_SWAP:
sprintf(disk_list[disk].mounts[i].fs_vfstype, "%s", "swap");
break;
default:
sprintf(disk_list[disk].mounts[i].fs_vfstype, "%s", "unused");
}
disk_list[disk].mounts[i].fs_mntops =
(char *)malloc(80);
if (!disk_list[disk].mounts[i].fs_mntops) {
sprintf(errmsg, "Couldn't allocate memory for mount options\n");
return (-1);
}
sprintf(disk_list[disk].mounts[i].fs_mntops, "%s", "YES");
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))) {
/*
* Setup the RAWPART and OURPART partition ourselves from the MBR
* in case either one doesn't exist or the new MBR invalidates them.
*/
cur_part = disk_list[disk].inst_part;
lbl->d_partitions[OURPART].p_size =
disk_list[disk].mbr.dospart[cur_part].dp_size;
lbl->d_partitions[OURPART].p_offset =
disk_list[disk].mbr.dospart[cur_part].dp_start;
lbl->d_partitions[RAWPART].p_size = lbl->d_secperunit;
lbl->d_partitions[RAWPART].p_offset = 0;
if (!(window = newwin(LINES, COLS, 0, 0))) {
sprintf(errmsg, "Failed to open window for disklabel editor\n");
return (-1);
}
@ -167,8 +219,13 @@ edit_disklabel(int disk)
draw_box(window, 0, 0, 24, 79, dialog_attr, border_attr);
/* Only one toggle to set up */
for (i=0; i < MAXPARTITIONS; i++)
label_field[(i*5)+1].misc = yesno;
cur_field = 1;
while (key != ESC) {
done = 0;
while (!done && (key != ESC)) {
/* Update disklabel */
@ -205,7 +262,7 @@ edit_disklabel(int disk)
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]);
disk_list[disk].mounts[i].fs_vfstype);
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",
@ -218,49 +275,52 @@ edit_disklabel(int disk)
disp_fields(window, label_field,
sizeof(label_field)/sizeof(struct field));
do {
next = change_field(label_field[cur_field], key);
if (next == -1) {
beep();
switch (label_field[cur_field].type) {
case F_EDIT:
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);
/* 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_file, "%s",
label_field[(i*5)+4].field);
sprintf(disk_list[disk].mounts[i].fs_vfstype, "%s",
label_field[(i*5)+2].field);
sprintf(disk_list[disk].mounts[i].fs_mntops, "%s",
label_field[(i*5)+1].field);
}
break;
case F_BUTTON:
key = button_press(window, label_field[cur_field]);
if (!key && !strcmp(label_field[cur_field].field, "OK")) {
done = 1;
continue;
}
if (!key && !strcmp(label_field[cur_field].field, "Cancel")) {
sprintf(errmsg, "\nUser aborted.\n");
dialog_clear_norefresh();
return (-1);
}
break;
case F_TOGGLE:
key = toggle_press(window, label_field[cur_field]);
break;
case F_TITLE:
default:
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);
}
next = change_field(label_field[cur_field], key);
if (next == -1) {
beep();
} else
cur_field = next;
}
if (write_bootblocks(disk) == -1)
@ -271,7 +331,6 @@ edit_disklabel(int disk)
return(0);
}
void
display_disklabel(int disk)
{

View File

@ -1,52 +1,52 @@
struct field label_field[] = {
{ 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},
{ 6, 02, 10, 10, -1, -1, -1, -1, -1, "wd0a", F_TITLE, 0, 0},
{ 6, 16, 4, 4, -1, 48, 6, 49, 2, "YES", F_EDIT, 0, 0},
{ 6, 27, 7, 7, -1, 48, 7, 1, 3, "MSDOS", F_EDIT, 0, 0},
{ 6, 39, 5, 5, -1, 49, 8, 2, 4, "1000", F_EDIT, 0, 0},
{ 6, 47, 30, 79, -1, 49, 9, 3, 6, "/an/example/mountpoint", F_EDIT, 0, 0},
{ 8, 02, 4, 4, -1, -1, -1, -1, -1, "wd0b", F_TITLE, 0, 0},
{ 8, 16, 4, 4, -1, 1, 11, 4, 7, "YES", F_EDIT, 0, 0},
{ 8, 27, 7, 7, -1, 2, 12, 6, 8, "MSDOS", F_EDIT, 0, 0},
{ 8, 39, 5, 5, -1, 3, 13, 7, 9, "1000", F_EDIT, 0, 0},
{ 8, 47, 30, 79, -1, 4, 14, 8, 11, "/an/example/mountpoint", F_EDIT, 0, 0},
{10, 02, 10, 10, -1, -1, -1, -1, -1, "wd0c", F_TITLE, 0, 0},
{10, 16, 4, 4, -1, 6, 16, 9, 12, "YES", F_EDIT, 0, 0},
{10, 27, 7, 7, -1, 7, 17, 11, 13, "MSDOS", F_EDIT, 0, 0},
{10, 39, 5, 5, -1, 8, 18, 12, 14, "1000", F_EDIT, 0, 0},
{10, 47, 30, 79, -1, 9, 19, 13, 16, "/an/example/mountpoint", F_EDIT, 0, 0},
{12, 02, 10, 10, -1, -1, -1, -1, -1, "wd0d", F_TITLE, 0, 0},
{12, 16, 4, 4, -1, 11, 21, 14, 17, "YES", F_EDIT, 0, 0},
{12, 27, 7, 7, -1, 12, 22, 16, 18, "MSDOS", F_EDIT, 0, 0},
{12, 39, 5, 5, -1, 13, 23, 17, 19, "1000", F_EDIT, 0, 0},
{12, 47, 30, 79, -1, 14, 24, 18, 21, "/an/example/mountpoint", F_EDIT, 0, 0},
{14, 02, 10, 10, -1, -1, -1, -1, -1, "wd0e", F_TITLE, 0, 0},
{14, 16, 4, 4, -1, 16, 26, 19, 22, "YES", F_EDIT, 0, 0},
{14, 27, 7, 7, -1, 17, 27, 21, 23, "MSDOS", F_EDIT, 0, 0},
{14, 39, 5, 5, -1, 18, 28, 22, 24, "1000", F_EDIT, 0, 0},
{14, 47, 30, 79, -1, 19, 29, 23, 26, "/an/example/mountpoint", F_EDIT, 0, 0},
{16, 02, 10, 10, -1, -1, -1, -1, -1, "wd0f", F_TITLE, 0, 0},
{16, 16, 4, 4, -1, 21, 31, 24, 27, "YES", F_EDIT, 0, 0},
{16, 27, 7, 7, -1, 22, 32, 26, 28, "MSDOS", F_EDIT, 0, 0},
{16, 39, 5, 5, -1, 23, 33, 27, 29, "1000", F_EDIT, 0, 0},
{16, 47, 30, 79, -1, 24, 34, 28, 31, "/an/example/mountpoint", F_EDIT, 0, 0},
{18, 02, 10, 10, -1, -1, -1, -1, -1, "wd0g", F_TITLE, 0, 0},
{18, 16, 4, 4, -1, 26, 36, 29, 32, "YES", F_EDIT, 0, 0},
{18, 27, 7, 7, -1, 27, 37, 31, 33, "MSDOS", F_EDIT, 0, 0},
{18, 39, 5, 5, -1, 28, 38, 32, 34, "1000", F_EDIT, 0, 0},
{18, 47, 30, 79, -1, 29, 39, 33, 36, "/an/example/mountpoint", F_EDIT, 0, 0},
{20, 02, 10, 10, -1, -1, -1, -1, -1, "wd0h", F_TITLE, 0, 0},
{20, 16, 4, 4, -1, 31, 48, 34, 37, "YES", F_EDIT, 0, 0},
{20, 27, 7, 7, -1, 32, 48, 36, 38, "MSDOS", F_EDIT, 0, 0},
{20, 39, 5, 5, -1, 33, 49, 37, 39, "1000", F_EDIT, 0, 0},
{20, 47, 30, 79, 1, 34, 49, 38, 48, "/an/example/mountpoint", F_EDIT, 0, 0},
{ 0, 27, 17, 17, -1, -1, -1, -1, -1, "Disk label editor", F_TITLE, 0, 0},
{ 4, 2, 11, 11, -1, -1, -1, -1, -1, "Partition", F_TITLE, 0, 0},
{ 4, 14, 8, 8, -1, -1, -1, -1, -1, "Preserve", F_TITLE, 0, 0},
{ 4, 25, 10, 10, -1, -1, -1, -1, -1, "Filesystem", F_TITLE, 0, 0},
{ 4, 39, 5, 5, -1, -1, -1, -1, -1, "Size", F_TITLE, 0, 0},
{ 4, 47, 10, 10, -1, -1, -1, -1, -1, "Mountpoint", F_TITLE, 0, 0},
{ 2, 02, 11, 11, -1, -1, -1, -1, -1, "Free space:", F_EDIT, 0, 0},
{ 2, 15, 6, 6, -1, -1, -1, -1, -1, "000000", F_TITLE, 0, 0},
{22, 20, 2, 2, -1, 36, 1, 39, 49, "OK", F_BUTTON, 0, 0},
{22, 45, 2, 2, -1, 38, 3, 48, 1, "Cancel", F_BUTTON, 0, 0}
};

View File

@ -226,18 +226,21 @@ get_geom_values(int disk)
int key = 0;
int cur_field = 0;
int next = 0;
int done=0;
struct field field[] = {
{2, 28, 06, 10, 01, 02, 01, -1, 01, "Unset"},
{4, 28, 06, 10, 02, 00, 02, -1, 02, "Unset"},
{6, 28, 06, 10, 00, 01, 00, -1, 00, "Unset"},
{0, 07, 24, 24, -1, -1, -1, -1, -1, "BIOS geometry parameters"},
{2, 02, 20, 20, -1, -1, -1, -1, -1, "Number of cylinders:"},
{4, 02, 25, 25, -1, -1, -1, -1, -1, "Number of tracks (heads):"},
{6, 02, 18, 18, -1, -1, -1, -1, -1, "Number of sectors:"}
{2, 28, 06, 10, 01, 04, 01, 4, 01, "Unset", F_EDIT, 0, 0},
{4, 28, 06, 10, 02, 00, 02, 0, 02, "Unset", F_EDIT, 0, 0},
{6, 28, 06, 10, 03, 01, 03, 1, 03, "Unset", F_EDIT, 0, 0},
{10, 7, 2, 2, 4, 2, 4, 2, 4, "OK", F_BUTTON, 0, 0},
{10, 20, 6, 6, 0, 3, 0, 3, 0, "Cancel", F_BUTTON, 0, 0},
{0, 07, 24, 24, -1, -1, -1, -1, -1, "BIOS geometry parameters", F_TITLE, 0, 0},
{2, 02, 20, 20, -1, -1, -1, -1, -1, "Number of cylinders:", F_TITLE, 0, 0},
{4, 02, 25, 25, -1, -1, -1, -1, -1, "Number of tracks (heads):", F_TITLE, 0, 0},
{6, 02, 18, 18, -1, -1, -1, -1, -1, "Number of sectors:", F_TITLE, 0, 0}
};
if (!(window = newwin(10, 40, 5, 20))) {
if (!(window = newwin(14, 40, 5, 20))) {
sprintf(errmsg, "Failed to open window for geometry editor");
return (-1);
};
@ -245,17 +248,38 @@ get_geom_values(int disk)
keypad(window, TRUE);
dialog_clear_norefresh();
draw_box(window, 0, 0, 9, 40, dialog_attr, border_attr);
draw_box(window, 0, 0, 14, 40, dialog_attr, border_attr);
while (key != ESC) {
done = 0;
while (!done && (key != ESC)) {
sprintf(field[0].field, "%ld", lbl->d_ncylinders);
sprintf(field[1].field, "%ld", lbl->d_ntracks);
sprintf(field[2].field, "%ld", lbl->d_nsectors);
disp_fields(window, field, sizeof(field)/sizeof(struct 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);
switch (field[cur_field].type) {
case F_EDIT:
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);
break;
case F_BUTTON:
key = button_press(window, field[cur_field]);
if (!key && !strcmp(field[cur_field].field, "OK")) {
done = 1;
continue;
}
if (!key && !strcmp(field[cur_field].field, "Cancel")) {
sprintf(errmsg, "\nUser aborted.\n");
dialog_clear_norefresh();
return (-1);
}
case F_TOGGLE:
case F_TITLE:
default:
break;
}
next = change_field(field[cur_field], key);
if (next == -1)
beep();
@ -320,7 +344,7 @@ edit_mbr(int disk)
return(-1);
}
if (!(window = newwin(24, 79, 0, 0))) {
if (!(window = newwin(LINES, COLS, 0, 0))) {
sprintf(errmsg, "Failed to open window for MBR editor\n");
return (-1);
};
@ -331,7 +355,8 @@ edit_mbr(int disk)
draw_box(window, 0, 0, 24, 79, dialog_attr, border_attr);
cur_field = 1;
while (key != ESC) {
ok = 0;
while (!ok && (key != ESC)) {
for (i=0; i < NDOSPART; i++) {
sprintf(mbr_field[(i*12)+1].field, "%s", part_type(mbr->dospart[i].dp_typ));
sprintf(mbr_field[(i*12)+2].field, "%ld", mbr->dospart[i].dp_start);
@ -350,10 +375,12 @@ edit_mbr(int disk)
disp_fields(window, mbr_field, sizeof(mbr_field)/sizeof(struct 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);
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);
@ -365,16 +392,29 @@ edit_mbr(int disk)
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;
break;
case F_BUTTON:
key = button_press(window, mbr_field[cur_field]);
if (!key && !strcmp(mbr_field[cur_field].field, "OK")) {
ok = 1;
continue;
}
if (!key && !strcmp(mbr_field[cur_field].field, "Cancel")) {
sprintf(errmsg, "\nUser aborted.\n");
dialog_clear_norefresh();
return (-1);
}
break;
case F_TOGGLE:
case F_TITLE:
default:
break;
}
next = change_field(mbr_field[cur_field], key);
if (next == -1)
beep();
else
cur_field = next;
}
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");

View File

@ -1,107 +1,109 @@
struct field mbr_field[] = {
{ 0, 25, 31, -1, -1, -1, -1, -1, -1, "Master Boot Record (MBR) editor"},
{ 4, 8, 30, 30, 2, 36, 2, 13, 13, "Uknown"},
{ 5, 31, 7, 10, 3, 1, 3, 14, 14, "0"},
{ 6, 5, 5, 10, 4, 2, 6, 17, 17, "0"},
{ 6, 14, 5, 10, 5, 2, 6, 17, 15, "0"},
{ 6, 24, 5, 10, 6, 2, 6, 17, 15, "0"},
{ 7, 31, 7, 10, 7, 3, 7, 18, 18, "0"},
{ 8, 5, 5, 10, 8, 6, 10, 22, 8, "0"},
{ 8, 14, 5, 10, 9, 6, 10, 22, 9, "0"},
{ 8, 24, 5, 10, 10, 6, 10, 22, 19, "0"},
{ 9, 9, 6, 10, 11, 7, 12, 24, 11, "0"},
{ 9, 27, 5, 10, 12, 7, 12, 24, 22, "0"},
{10, 10, 10, 10, 13, 10, 25, 24, 24, "Not Active"},
{ 4, 47, 30, 30, 14, 2, 2, 2, 1, "Uknown"},
{ 5, 70, 7, 10, 15, 3, 3, 3, 2, "0"},
{ 6, 44, 5, 10, 16, 1, 5, 1, 16, "0"},
{ 6, 54, 5, 10, 17, 1, 6, 2, 17, "0"},
{ 6, 64, 5, 10, 18, 1, 7, 3, 3, "0"},
{ 7, 70, 7, 10, 19, 6, 6, 6, 6, "0"},
{ 8, 44, 5, 10, 20, 2, 2, 2, 20, "0"},
{ 8, 54, 5, 10, 21, 3, 2, 2, 21, "0"},
{ 8, 64, 5, 10, 22, 4, 2, 2, 7, "0"},
{ 9, 48, 6, 10, 23, 2, 2, 2, 23, "0"},
{ 9, 66, 5, 10, 24, 2, 2, 2, 10, "0"},
{10, 49, 10, 10, 25, 2, 2, 2, 12, "Not Active"},
{14, 8, 30, 30, 26, 12, 26, 2, 14, "Uknown"},
{15, 31, 7, 10, 27, 25, 27, 3, 15, "0"},
{16, 5, 5, 10, 28, 26, 30, 1, 16, "0"},
{16, 14, 5, 10, 29, 26, 30, 2, 16, "0"},
{16, 24, 5, 10, 30, 26, 30, 3, 16, "0"},
{17, 31, 7, 10, 31, 27, 31, 6, 17, "0"},
{18, 5, 5, 10, 32, 30, 34, 2, 2, "0"},
{18, 14, 5, 10, 33, 30, 34, 2, 2, "0"},
{18, 24, 5, 10, 34, 30, 34, 2, 3, "0"},
{19, 9, 6, 10, 35, 31, 36, 2, 2, "0"},
{19, 27, 5, 10, 36, 31, 36, 2, 2, "0"},
{20, 10, 10, 10, 37, 34, 01, 2, 2, "Not Active"},
{14, 47, 30, 30, 38, 2, 2, 2, 4, "Uknown"},
{15, 70, 7, 10, 39, 3, 3, 3, 4, "0"},
{16, 44, 5, 10, 40, 1, 5, 1, 4, "0"},
{16, 54, 5, 10, 41, 1, 6, 2, 5, "0"},
{16, 64, 5, 10, 42, 1, 7, 3, 6, "0"},
{17, 70, 7, 10, 43, 6, 6, 6, 7, "0"},
{18, 44, 5, 10, 44, 2, 2, 2, 2, "0"},
{18, 54, 5, 10, 45, 3, 2, 2, 2, "0"},
{18, 64, 5, 10, 46, 4, 2, 2, 3, "0"},
{19, 48, 6, 10, 47, 2, 2, 2, 2, "0"},
{19, 66, 5, 10, 48, 2, 2, 2, 2, "0"},
{20, 49, 10, 10, 01, 2, 2, 2, 2, "Not Active"},
{2, 15, 11, -1, -1, -1, -1, -1, -1, "Partition 1"},
{2, 55, 11, -1, -1, -1, -1, -1, -1, "Partition 2"},
{12, 15, 11, -1, -1, -1, -1, -1, -1, "Partition 3"},
{12, 55, 11, -1, -1, -1, -1, -1, -1, "Partition 4"},
{ 4, 2, 5, -1, -1, -1, -1, -1, -1, "Type:"},
{ 5, 2, 28, -1, -1, -1, -1, -1, -1, "Starting at absolute sector:"},
{ 6, 2, 2, -1, -1, -1, -1, -1, -1, "C:"},
{ 6, 11, 2, -1, -1, -1, -1, -1, -1, "H:"},
{ 6, 21, 2, -1, -1, -1, -1, -1, -1, "S:"},
{ 7, 2, 26, -1, -1, -1, -1, -1, -1, "Ending at absolute sector:"},
{ 8, 2, 2, -1, -1, -1, -1, -1, -1, "C:"},
{ 8, 11, 2, -1, -1, -1, -1, -1, -1, "H:"},
{ 8, 21, 2, -1, -1, -1, -1, -1, -1, "S:"},
{ 9, 02, 7, -1, -1, -1, -1, -1, -1, "Size: ("},
{ 9, 18, 8, -1, -1, -1, -1, -1, -1, "sectors)"},
{ 9, 33, 2, -1, -1, -1, -1, -1, -1, "Mb"},
{10, 2, 7, -1, -1, -1, -1, -1, -1, "Status:"},
{ 4, 41, 5, -1, -1, -1, -1, -1, -1, "Type:"},
{ 5, 41, 28, -1, -1, -1, -1, -1, -1, "Starting at absolute sector:"},
{ 6, 41, 2, -1, -1, -1, -1, -1, -1, "C:"},
{ 6, 51, 2, -1, -1, -1, -1, -1, -1, "H:"},
{ 6, 61, 2, -1, -1, -1, -1, -1, -1, "S:"},
{ 7, 41, 26, -1, -1, -1, -1, -1, -1, "Ending at absolute sector:"},
{ 8, 41, 2, -1, -1, -1, -1, -1, -1, "C:"},
{ 8, 51, 2, -1, -1, -1, -1, -1, -1, "H:"},
{ 8, 61, 2, -1, -1, -1, -1, -1, -1, "S:"},
{ 9, 41, 7, -1, -1, -1, -1, -1, -1, "Size: ("},
{ 9, 57, 8, -1, -1, -1, -1, -1, -1, "sectors)"},
{ 9, 72, 2, -1, -1, -1, -1, -1, -1, "Mb"},
{10, 41, 7, -1, -1, -1, -1, -1, -1, "Status:"},
{14, 02, 5, -1, -1, -1, -1, -1, -1, "Type:"},
{15, 02, 28, -1, -1, -1, -1, -1, -1, "Starting at absolute sector:"},
{16, 2, 2, -1, -1, -1, -1, -1, -1, "C:"},
{16, 11, 2, -1, -1, -1, -1, -1, -1, "H:"},
{16, 21, 2, -1, -1, -1, -1, -1, -1, "S:"},
{17, 02, 26, -1, -1, -1, -1, -1, -1, "Ending at absolute sector:"},
{18, 02, 2, -1, -1, -1, -1, -1, -1, "C:"},
{18, 11, 2, -1, -1, -1, -1, -1, -1, "H:"},
{18, 21, 2, -1, -1, -1, -1, -1, -1, "S:"},
{19, 02, 7, -1, -1, -1, -1, -1, -1, "Size: ("},
{19, 18, 8, -1, -1, -1, -1, -1, -1, "sectors)"},
{19, 33, 2, -1, -1, -1, -1, -1, -1, "Mb"},
{20, 02, 7, -1, -1, -1, -1, -1, -1, "Status:"},
{14, 41, 5, -1, -1, -1, -1, -1, -1, "Type:"},
{15, 41, 28, -1, -1, -1, -1, -1, -1, "Starting at absolute sector:"},
{16, 41, 2, -1, -1, -1, -1, -1, -1, "C:"},
{16, 51, 2, -1, -1, -1, -1, -1, -1, "H:"},
{16, 61, 2, -1, -1, -1, -1, -1, -1, "S:"},
{17, 41, 26, -1, -1, -1, -1, -1, -1, "Ending at absolute sector:"},
{18, 41, 2, -1, -1, -1, -1, -1, -1, "C:"},
{18, 51, 2, -1, -1, -1, -1, -1, -1, "H:"},
{18, 61, 2, -1, -1, -1, -1, -1, -1, "S:"},
{19, 41, 7, -1, -1, -1, -1, -1, -1, "Size: ("},
{19, 57, 8, -1, -1, -1, -1, -1, -1, "sectors)"},
{19, 72, 2, -1, -1, -1, -1, -1, -1, "Mb"},
{20, 41, 7, -1, -1, -1, -1, -1, -1, "Status:"}
{ 0, 25, 31, -1, -1, -1, -1, -1, -1, "Master Boot Record (MBR) editor", F_TITLE, 0, 0},
{ 4, 8, 30, 30, 2, 49, 2, 50, 2, "Uknown", F_EDIT, 0, 0},
{ 5, 31, 7, 10, 3, 1, 3, 1, 3, "0", F_EDIT, 0, 0},
{ 6, 5, 5, 10, 4, 2, 6, 2, 4, "0", F_EDIT, 0, 0},
{ 6, 14, 5, 10, 5, 2, 6, 3, 5, "0", F_EDIT, 0, 0},
{ 6, 24, 5, 10, 6, 2, 6, 4, 6, "0", F_EDIT, 0, 0},
{ 7, 31, 7, 10, 7, 3, 7, 5, 7, "0", F_EDIT, 0, 0},
{ 8, 5, 5, 10, 8, 6, 10, 6, 8, "0", F_EDIT, 0, 0},
{ 8, 14, 5, 10, 9, 6, 10, 7, 9, "0", F_EDIT, 0, 0},
{ 8, 24, 5, 10, 10, 6, 10, 8, 10, "0", F_EDIT, 0, 0},
{ 9, 9, 6, 10, 11, 7, 12, 9, 11, "0", F_EDIT, 0, 0},
{ 9, 27, 5, 10, 12, 7, 12, 10, 12, "0", F_EDIT, 0, 0},
{10, 10, 10, 10, 13, 10, 25, 11, 13, "Not Active", F_EDIT, 0, 0},
{ 4, 47, 30, 30, 14, 50, 14, 12, 14, "Uknown", F_EDIT, 0, 0},
{ 5, 70, 7, 10, 15, 13, 15, 13, 15, "0", F_EDIT, 0, 0},
{ 6, 44, 5, 10, 16, 14, 18, 14, 16, "0", F_EDIT, 0, 0},
{ 6, 54, 5, 10, 17, 14, 18, 15, 17, "0", F_EDIT, 0, 0},
{ 6, 64, 5, 10, 18, 14, 18, 16, 18, "0", F_EDIT, 0, 0},
{ 7, 70, 7, 10, 19, 15, 19, 17, 19, "0", F_EDIT, 0, 0},
{ 8, 44, 5, 10, 20, 18, 22, 18, 20, "0", F_EDIT, 0, 0},
{ 8, 54, 5, 10, 21, 18, 22, 19, 21, "0", F_EDIT, 0, 0},
{ 8, 64, 5, 10, 22, 18, 22, 20, 22, "0", F_EDIT, 0, 0},
{ 9, 48, 6, 10, 23, 19, 24, 21, 23, "0", F_EDIT, 0, 0},
{ 9, 66, 5, 10, 24, 20, 24, 22, 24, "0", F_EDIT, 0, 0},
{10, 49, 10, 10, 25, 22, 37, 23, 25, "Not Active", F_EDIT, 0, 0},
{14, 8, 30, 30, 26, 12, 26, 24, 26, "Uknown", F_EDIT, 0, 0},
{15, 31, 7, 10, 27, 25, 27, 25, 27, "0", F_EDIT, 0, 0},
{16, 5, 5, 10, 28, 26, 30, 26, 28, "0", F_EDIT, 0, 0},
{16, 14, 5, 10, 29, 26, 30, 27, 29, "0", F_EDIT, 0, 0},
{16, 24, 5, 10, 30, 26, 30, 28, 30, "0", F_EDIT, 0, 0},
{17, 31, 7, 10, 31, 27, 31, 29, 31, "0", F_EDIT, 0, 0},
{18, 5, 5, 10, 32, 30, 34, 30, 32, "0", F_EDIT, 0, 0},
{18, 14, 5, 10, 33, 30, 34, 31, 33, "0", F_EDIT, 0, 0},
{18, 24, 5, 10, 34, 30, 34, 32, 34, "0", F_EDIT, 0, 0},
{19, 9, 6, 10, 35, 31, 36, 33, 35, "0", F_EDIT, 0, 0},
{19, 27, 5, 10, 36, 31, 36, 34, 36, "0", F_EDIT, 0, 0},
{20, 10, 10, 10, 37, 34, 49, 35, 37, "Not Active", F_EDIT, 0, 0},
{14, 47, 30, 30, 38, 24, 38, 36, 38, "Uknown", F_EDIT, 0, 0},
{15, 70, 7, 10, 39, 37, 39, 37, 39, "0", F_EDIT, 0, 0},
{16, 44, 5, 10, 40, 38, 42, 38, 40, "0", F_EDIT, 0, 0},
{16, 54, 5, 10, 41, 38, 42, 39, 41, "0", F_EDIT, 0, 0},
{16, 64, 5, 10, 42, 38, 42, 40, 42, "0", F_EDIT, 0, 0},
{17, 70, 7, 10, 43, 39, 43, 41, 43, "0", F_EDIT, 0, 0},
{18, 44, 5, 10, 44, 42, 46, 42, 44, "0", F_EDIT, 0, 0},
{18, 54, 5, 10, 45, 43, 46, 43, 45, "0", F_EDIT, 0, 0},
{18, 64, 5, 10, 46, 43, 46, 44, 46, "0", F_EDIT, 0, 0},
{19, 48, 6, 10, 47, 43, 48, 45, 47, "0", F_EDIT, 0, 0},
{19, 66, 5, 10, 48, 44, 48, 46, 48, "0", F_EDIT, 0, 0},
{20, 49, 10, 10, 49, 46, 50, 47, 49, "Not Active", F_EDIT, 0, 0},
{22, 15, 2, 2, 50, 36, 1, 48, 50, "OK", F_BUTTON, 0, 0},
{22, 50, 6, 6, 1, 48, 13, 49, 1, "Cancel", F_BUTTON, 0, 0},
{2, 15, 11, -1, -1, -1, -1, -1, -1, "Partition 1", F_TITLE, 0, 0},
{2, 55, 11, -1, -1, -1, -1, -1, -1, "Partition 2", F_TITLE, 0, 0},
{12, 15, 11, -1, -1, -1, -1, -1, -1, "Partition 3", F_TITLE, 0, 0},
{12, 55, 11, -1, -1, -1, -1, -1, -1, "Partition 4", F_TITLE, 0, 0},
{ 4, 2, 5, -1, -1, -1, -1, -1, -1, "Type:", F_TITLE, 0, 0},
{ 5, 2, 28, -1, -1, -1, -1, -1, -1, "Starting at absolute sector:", F_TITLE, 0, 0},
{ 6, 2, 2, -1, -1, -1, -1, -1, -1, "C:", F_TITLE, 0, 0},
{ 6, 11, 2, -1, -1, -1, -1, -1, -1, "H:", F_TITLE, 0, 0},
{ 6, 21, 2, -1, -1, -1, -1, -1, -1, "S:", F_TITLE, 0, 0},
{ 7, 2, 26, -1, -1, -1, -1, -1, -1, "Ending at absolute sector:", F_TITLE, 0, 0},
{ 8, 2, 2, -1, -1, -1, -1, -1, -1, "C:", F_TITLE, 0, 0},
{ 8, 11, 2, -1, -1, -1, -1, -1, -1, "H:", F_TITLE, 0, 0},
{ 8, 21, 2, -1, -1, -1, -1, -1, -1, "S:", F_TITLE, 0, 0},
{ 9, 02, 7, -1, -1, -1, -1, -1, -1, "Size: (", F_TITLE, 0, 0},
{ 9, 18, 8, -1, -1, -1, -1, -1, -1, "sectors)", F_TITLE, 0, 0},
{ 9, 33, 2, -1, -1, -1, -1, -1, -1, "Mb", F_TITLE, 0, 0},
{10, 2, 7, -1, -1, -1, -1, -1, -1, "Status:", F_TITLE, 0, 0},
{ 4, 41, 5, -1, -1, -1, -1, -1, -1, "Type:", F_TITLE, 0, 0},
{ 5, 41, 28, -1, -1, -1, -1, -1, -1, "Starting at absolute sector:", F_TITLE, 0, 0},
{ 6, 41, 2, -1, -1, -1, -1, -1, -1, "C:", F_TITLE, 0, 0},
{ 6, 51, 2, -1, -1, -1, -1, -1, -1, "H:", F_TITLE, 0, 0},
{ 6, 61, 2, -1, -1, -1, -1, -1, -1, "S:", F_TITLE, 0, 0},
{ 7, 41, 26, -1, -1, -1, -1, -1, -1, "Ending at absolute sector:", F_TITLE, 0, 0},
{ 8, 41, 2, -1, -1, -1, -1, -1, -1, "C:", F_TITLE, 0, 0},
{ 8, 51, 2, -1, -1, -1, -1, -1, -1, "H:", F_TITLE, 0, 0},
{ 8, 61, 2, -1, -1, -1, -1, -1, -1, "S:", F_TITLE, 0, 0},
{ 9, 41, 7, -1, -1, -1, -1, -1, -1, "Size: (", F_TITLE, 0, 0},
{ 9, 57, 8, -1, -1, -1, -1, -1, -1, "sectors)", F_TITLE, 0, 0},
{ 9, 72, 2, -1, -1, -1, -1, -1, -1, "Mb", F_TITLE, 0, 0},
{10, 41, 7, -1, -1, -1, -1, -1, -1, "Status:", F_TITLE, 0, 0},
{14, 02, 5, -1, -1, -1, -1, -1, -1, "Type:", F_TITLE, 0, 0},
{15, 02, 28, -1, -1, -1, -1, -1, -1, "Starting at absolute sector:", F_TITLE, 0, 0},
{16, 2, 2, -1, -1, -1, -1, -1, -1, "C:", F_TITLE, 0, 0},
{16, 11, 2, -1, -1, -1, -1, -1, -1, "H:", F_TITLE, 0, 0},
{16, 21, 2, -1, -1, -1, -1, -1, -1, "S:", F_TITLE, 0, 0},
{17, 02, 26, -1, -1, -1, -1, -1, -1, "Ending at absolute sector:", F_TITLE, 0, 0},
{18, 02, 2, -1, -1, -1, -1, -1, -1, "C:", F_TITLE, 0, 0},
{18, 11, 2, -1, -1, -1, -1, -1, -1, "H:", F_TITLE, 0, 0},
{18, 21, 2, -1, -1, -1, -1, -1, -1, "S:", F_TITLE, 0, 0},
{19, 02, 7, -1, -1, -1, -1, -1, -1, "Size: (", F_TITLE, 0, 0},
{19, 18, 8, -1, -1, -1, -1, -1, -1, "sectors)", F_TITLE, 0, 0},
{19, 33, 2, -1, -1, -1, -1, -1, -1, "Mb", F_TITLE, 0, 0},
{20, 02, 7, -1, -1, -1, -1, -1, -1, "Status:", F_TITLE, 0, 0},
{14, 41, 5, -1, -1, -1, -1, -1, -1, "Type:", F_TITLE, 0, 0},
{15, 41, 28, -1, -1, -1, -1, -1, -1, "Starting at absolute sector:", F_TITLE, 0, 0},
{16, 41, 2, -1, -1, -1, -1, -1, -1, "C:", F_TITLE, 0, 0},
{16, 51, 2, -1, -1, -1, -1, -1, -1, "H:", F_TITLE, 0, 0},
{16, 61, 2, -1, -1, -1, -1, -1, -1, "S:", F_TITLE, 0, 0},
{17, 41, 26, -1, -1, -1, -1, -1, -1, "Ending at absolute sector:", F_TITLE, 0, 0},
{18, 41, 2, -1, -1, -1, -1, -1, -1, "C:", F_TITLE, 0, 0},
{18, 51, 2, -1, -1, -1, -1, -1, -1, "H:", F_TITLE, 0, 0},
{18, 61, 2, -1, -1, -1, -1, -1, -1, "S:", F_TITLE, 0, 0},
{19, 41, 7, -1, -1, -1, -1, -1, -1, "Size: (", F_TITLE, 0, 0},
{19, 57, 8, -1, -1, -1, -1, -1, -1, "sectors)", F_TITLE, 0, 0},
{19, 72, 2, -1, -1, -1, -1, -1, -1, "Mb", F_TITLE, 0, 0},
{20, 41, 7, -1, -1, -1, -1, -1, -1, "Status:", F_TITLE, 0, 0}
};

View File

@ -12,6 +12,7 @@
* its use.
*/
#define DKTYPENAMES
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
@ -53,9 +54,11 @@ char selection[30];
char *device_names[] = {"wd", "sd", "cd", "mcd", 0};
struct devconf *device_list[MAX_NO_DEVICES];
struct disk disk_list[MAX_NO_DEVICES];
struct fstab *mounts[MAX_NO_MOUNTS];
int no_devices;
int no_disks;
int no_mounts;
int
alloc_memory()
@ -185,18 +188,11 @@ configure_disks()
for (i = 0; i < no_disks; i++) {
sprintf(options[(i*2)], "%d",i+1);
if (disk_list[i].selected)
sprintf(options[(i*2)+1], " ** %s, (%dMb) -> %s%d",
disk_list[i].lbl.d_typename,
disk_size(&disk_list[i].lbl),
sprintf(options[(i*2)+1], "%s%d: %s (%dMb)",
disk_list[i].devconf->dc_name,
disk_list[i].devconf->dc_unit);
else
sprintf(options[(i*2)+1], " %s, (%dMb) -> %s%d",
disk_list[i].devconf->dc_unit,
disk_list[i].lbl.d_typename,
disk_size(&disk_list[i].lbl),
disk_list[i].devconf->dc_name,
disk_list[i].devconf->dc_unit);
disk_size(&disk_list[i].lbl));
}
sprintf(options[no_disks*2], "%d", no_disks+1);
@ -204,30 +200,30 @@ configure_disks()
dialog_clear_norefresh();
if (dialog_menu("FreeBSD Installation", scratch, -1, -1,
min(5, no_disks), no_disks, options, selection)) {
min(5, no_disks+1), no_disks+1, options, selection)) {
dialog_clear_norefresh();
sprintf(scratch,"\nYou selected cancel.\n");
AskAbort(scratch);
valid = 0;
continue;
}
choice = atoi(selection);
choice = atoi(selection) - 1;
if (choice == no_disks)
valid = 1;
else {
if (edit_mbr(choice-1) == -1) {
if (edit_mbr(choice) == -1) {
sprintf(scratch, "\nThe following error occured while\nediting the master boot record.\n%s", errmsg);
AskAbort(scratch);
valid = 0;
continue;
};
if (edit_disklabel(choice-1) == -1) {
if (edit_disklabel(choice) == -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;
disk_list[choice].selected = 1;
}
} while (!valid);
}
@ -235,10 +231,20 @@ configure_disks()
int
stage1()
{
int i;
int ok = 0;
int i, j;
query_devices();
configure_disks();
exit(1);
/* List filesystems */
for (i=0; i < MAX_NO_DEVICES; i++) {
if (!disk_list[i].selected)
continue;
for (j=0; j < MAXPARTITIONS; j++) {
if ((j == OURPART) || (j == RAWPART))
continue;
if (!disk_list[i].lbl.d_partitions[j].p_size)
continue;
mounts[no_mounts++] = &disk_list[i].mounts[j];
}
}
}

View File

@ -19,9 +19,11 @@
#define MAX_NO_DEVICES 10
#define MAX_NO_DISKS 10
#define MAX_NO_MOUNTS 30
#define MAX_NO_FS 30
#define MAXFS MAX_NO_FS
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

View File

@ -264,59 +264,3 @@ PartMb(struct disklabel *lbl,int part)
l = 1024*1024/lbl->d_secsize;
return (lbl->d_partitions[part].p_size + l/2)/l;
}
void
CleanMount(int disk, int part)
{
int i = MP[disk][part];
if (Fmount[i]) {
free(Fmount[i]);
Fmount[i] = 0;
}
if (Fname[i]) {
free(Fname[i]);
Fname[i] = 0;
}
if (Ftype[i]) {
free(Ftype[i]);
Ftype[i] = 0;
}
MP[disk][part] = 0;
}
char *
SetMount(int disk, int part, char *path)
{
int k;
char buf[80];
CleanMount(disk,part);
for (k = 1; k < MAX_NO_FS; k++)
if (!Fmount[k])
break;
if (k >= MAX_NO_FS)
return "Maximum number of filesystems exceeded";
Fmount[k] = StrAlloc(path);
sprintf(buf, "%s%c", Dname[disk], part + 'a');
Fname[k] = StrAlloc(buf);
switch (Dlbl[disk]->d_partitions[part].p_fstype) {
case FS_BSDFFS:
Ftype[k] = StrAlloc("ufs");
break;
case FS_MSDOS:
Ftype[k] = StrAlloc("msdos");
break;
case FS_SWAP:
Ftype[k] = StrAlloc("swap");
break;
default:
CleanMount(disk,part);
return "Unknown filesystem-type";
}
Fsize[k] = (Dlbl[disk]->d_partitions[part].p_size+1024)/2048;
MP[disk][part] = k;
return NULL;
}