Public apology:

I have walked all over Paul Richards code again, and severely lobotomized
some of his stuff, in order to cut some corners for the 2.0-Alpha release.
I belive that we can now manipulate fdisk and disklabel-stuff sufficiently
for the release to actually be produced.
It's not that I don't like Paul and his code, I just need something I
can kick out of the door RSN.

Sysinstall is now under absolute code-freeze, only Jordan has my permission
to commit to this code (stage0 & 5).  I would appreciate if everybody
else would finds problems in sysinstall send patches to me, and I will
commit them. THANKYOU.

The fdisk/disklabel editors are made in pure ncurses, and follow a model
"a`la spreadsheet".

There are some important functions which are missing still, and I would
appreciate if somebody would look at them.
The FDISK part needs a "whole-disk" option, and it needs a "rewrite
MBR-boot code" option.
The DISKLABEL part needs to be able to "import DOS-partition".
Both need a "HELP" function, (display a file "/HELP" using dialog is OK).

It seems to me like the wd.c and sd.c should reread the physical record
when a DIOCGDINFO is made, so that they can pick up changes in the
MBR-data.  Otherwise there will be a couple of weird cases where we
cannot avoid replicating code from the kernel.

If you want to play with this, look at src/release/Makefile.  You may need
to step back to version 1.38 of sys/i386/isa/fd.c to make "rootable"
floppies, it is not clear at this time if that indeed is the problem I
have been having.

Sleep well, my friends, and expect the real Alpha in 24H, if the tree is
still solid.
This commit is contained in:
Poul-Henning Kamp 1994-11-01 10:10:43 +00:00
parent 49ccad71de
commit 9c354a29e7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=4045
13 changed files with 954 additions and 458 deletions

View File

@ -6,9 +6,9 @@ NOMAN= yet
SRCS = bootarea.c exec.c dkcksum.c label.c main.c mbr.c \
stage0.c stage1.c stage2.c stage3.c stage4.c stage5.c \
termcap.c utils.c makedevs.c
termcap.c utils.c makedevs.c ourcurses.c
CFLAGS += -Wall
CFLAGS += -Wall -g -static
LDADD = -ldialog -lncurses -lmytinfo
DPADD = ${LIBDIALOG} ${LIBNCURSES} ${LIBMYTINFO}

View File

@ -31,115 +31,100 @@ extern struct mbr *mbr;
extern char boot1[];
extern char boot2[];
int
void
enable_label(int fd)
{
int flag = 1;
if (ioctl(fd, DIOCWLABEL, &flag) < 0) {
return(-1);
}
return(0);
if (ioctl(fd, DIOCWLABEL, &flag) < 0)
Fatal("ioctl(DIOCWLABEL,1) failed: %s",strerror(errno));
}
int
void
disable_label(int fd)
{
int flag = 0;
if (ioctl(fd, DIOCWLABEL, &flag) < 0) {
return(-1);
}
return(0);
if (ioctl(fd, DIOCWLABEL, &flag) < 0)
Fatal("ioctl(DIOCWLABEL,0) failed: %s",strerror(errno));
}
int
write_bootblocks(int fd, off_t offset, int bbsize)
write_bootblocks(int fd, struct disklabel *lbl)
{
if (ioctl(fd, DIOCWDINFO, &avail_disklabels[inst_disk]) < 0) {
Fatal("Failed to write disklabel: %s\n", strerror(errno));
return(-1);
}
off_t of = lbl->d_partitions[OURPART].p_offset;
Debug("Seeking to block %ld ", offset);
Debug("Seeking to byte %ld ", (offset * avail_disklabels[inst_disk].d_secsize));
if (lseek(fd, (offset * avail_disklabels[inst_disk].d_secsize), SEEK_SET) < 0) {
sprintf(errmsg, "Couldn't seek to start of partition\n");
return(-1);
}
Debug("Seeking to byte %ld ", of * lbl->d_secsize);
if (lseek(fd, (of * lbl->d_secsize), SEEK_SET) < 0) {
Fatal("Couldn't seek to start of partition\n");
}
if (enable_label(fd) == -1)
return(-1);
enable_label(fd);
if (write(fd, bootblocks, bbsize) != bbsize) {
sprintf(errmsg, "Failed to write bootblocks (%p,%d) %d %s\n",
bootblocks, bbsize,
errno, strerror(errno)
);
return(-1);
}
if (write(fd, bootblocks, lbl->d_bbsize) != lbl->d_bbsize) {
Fatal("Failed to write bootblocks (%p,%d) %d %s\n",
bootblocks, lbl->d_bbsize,
errno, strerror(errno)
);
}
if (disable_label(fd) == -1)
return(-1);
disable_label(fd);
return(0);
return(0);
}
int
build_bootblocks(struct disklabel *label)
build_bootblocks(int dfd,struct disklabel *label,struct dos_partition *dospart)
{
int fd;
off_t of = label->d_partitions[OURPART].p_offset;
int fd;
Debug("Loading boot code from %s", boot1);
sprintf(scratch, "\nLoading boot code from %s\n", boot1);
dialog_msgbox(TITLE, scratch, 5, 60, 0);
fd = open(boot1, O_RDONLY);
if (fd < 0) {
sprintf(errmsg, "Couldn't open boot file %s\n", boot1);
return(-1);
}
fd = open(boot1, O_RDONLY);
if (fd < 0)
Fatal("Couldn't open boot file %s\n", boot1);
if (read(fd, bootblocks, MBRSIZE) < 0) {
sprintf(errmsg, "Couldn't read from boot file %s\n", boot1);
return(-1);
}
if (read(fd, bootblocks, MBRSIZE) < 0)
Fatal("Couldn't read from boot file %s\n", boot1);
if (close(fd) == -1) {
sprintf(errmsg, "Couldn't close boot file %s\n", boot1);
return(-1);
}
if (close(fd) == -1)
Fatal("Couldn't close boot file %s\n", boot1);
dialog_clear();
sprintf(scratch, "\nLoading boot code from %s\n", boot2);
dialog_msgbox(TITLE, scratch, 5, 60, 0);
Debug("Loading boot code from %s", boot2);
fd = open(boot2, O_RDONLY);
if (fd < 0) {
sprintf(errmsg, "Couldn't open boot file %s\n", boot2);
return(-1);
}
fd = open(boot2, O_RDONLY);
if (fd < 0)
Fatal("Couldn't open boot file %s", boot2);
if (read(fd, &bootblocks[MBRSIZE],
(int)(label->d_bbsize - MBRSIZE)) < 0) {
sprintf(errmsg, "Couldn't read from boot file %s\n", boot2);
return(-1);
}
if (read(fd, &bootblocks[MBRSIZE], (int)(label->d_bbsize - MBRSIZE)) < 0)
Fatal("Couldn't read from boot file %s\n", boot2);
if (close(fd) == -1) {
sprintf(errmsg, "Couldn't close boot file %s\n", boot2);
return(-1);
}
if (close(fd) == -1)
Fatal("Couldn't close boot file %s", boot2);
dialog_clear();
bcopy(dospart, &bootblocks[DOSPARTOFF],
sizeof(struct dos_partition) * NDOSPART);
/* Copy MBR partition area into bootblocks */
label->d_checksum = 0;
label->d_checksum = dkcksum(label);
bcopy(label, &bootblocks[(LABELSECTOR * label->d_secsize) + LABELOFFSET],
sizeof *label);
bcopy(mbr->dospart, &bootblocks[DOSPARTOFF],
sizeof(struct dos_partition) * NDOSPART);
Debug("Seeking to byte %ld ", of * label->d_secsize);
/* Write the disklabel into the bootblocks */
if (lseek(dfd, (of * label->d_secsize), SEEK_SET) < 0) {
Fatal("Couldn't seek to start of partition\n");
}
label->d_checksum = dkcksum(label);
bcopy(label, &bootblocks[(LABELSECTOR * label->d_secsize) + LABELOFFSET],
sizeof *label);
enable_label(dfd);
return(0);
if (write(dfd, bootblocks, label->d_bbsize) != label->d_bbsize) {
Fatal("Failed to write bootblocks (%p,%d) %d %s\n",
bootblocks, label->d_bbsize,
errno, strerror(errno)
);
}
disable_label(dfd);
return(0);
}

View File

@ -19,10 +19,6 @@
#define DEFFSIZE 1024
#define DEFFRAG 8
int enable_label(int);
int disable_label(int);
int write_bootblocks(int, off_t, int);
int build_bootblocks(struct disklabel *);
int Mb_to_cylbdry(int, struct disklabel *);
void default_disklabel(struct disklabel *, int, int);
int disk_size(struct disklabel *);

View File

@ -2,8 +2,8 @@
#define ESC 27
#define TAB 9
#define DKTYPENAMES
#include <sys/param.h>
#include <stdlib.h>
#include <limits.h>
#define DKTYPENAMES
#include <sys/param.h>
#include <ufs/ffs/fs.h>
@ -62,6 +62,7 @@ void
update_label_form(WINDOW *window, struct disklabel *lbl)
{
int i;
long used = 0,ul;
mvwprintw(window, 2, 2, "Partition");
mvwprintw(window, 2, 15, "Filesystem Type");
@ -71,161 +72,23 @@ update_label_form(WINDOW *window, struct disklabel *lbl)
mvwprintw(window, 4+(i*2), 6, "%s", partname[i]);
mvwprintw(window, label_fields[i][0].y, label_fields[i][0].x, "%s",
&label_fields[i][0].field);
mvwprintw(window, label_fields[i][1].y, label_fields[i][1].x, "%s",
if(i < 2 || i > 3) {
ul = strtol(label_fields[i][1].field,0,0);
sprintf(label_fields[i][1].field, "%lu",ul);
used += ul;
}
mvwprintw(window, label_fields[i][1].y, label_fields[i][1].x, "%-5s",
&label_fields[i][1].field);
if (label_fields[i][2].field)
mvwprintw(window, label_fields[i][2].y, label_fields[i][2].x, "%s",
&label_fields[i][2].field);
}
mvwprintw(window, 20, 10, "Allocated %5luMb, Unalloacted %5lu Mb",
used, disk_size(lbl) - used);
wrefresh(window);
}
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':
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);
wrefresh(window);
field[len] = 0;
delwin(window);
refresh();
return (key);
}
int
disk_size(struct disklabel *lbl)
@ -369,25 +232,24 @@ edit_disklabel(struct disklabel *lbl)
y_pos--;
break;
case KEY_DOWN:
if (y_pos != MAXPARTITIONS)
y_pos++;
if (++y_pos == MAXPARTITIONS)
y_pos--;
break;
case '\n':
case TAB:
x_pos++;
if (x_pos == EDITABLES)
if (x_pos == EDITABLES) {
x_pos = 0;
if (++y_pos == MAXPARTITIONS)
y_pos--;
}
break;
case KEY_BTAB:
x_pos--;
if (x_pos < 0)
if (x_pos < 0) {
x_pos = EDITABLES - 1;
break;
case '\n':
++y_pos;
if (y_pos == MAXPARTITIONS) {
y_pos = 0;
if (++x_pos == EDITABLES)
x_pos = 0;
if (--y_pos < 0)
y_pos++;
}
break;
default:
@ -403,7 +265,6 @@ build_disklabel(struct disklabel *lbl)
int i, offset;
int nsects;
int total_sects;
int mounts = 0;
/* Get start of FreeBSD partition from default label */
offset = lbl->d_partitions[2].p_offset;
@ -412,15 +273,11 @@ build_disklabel(struct disklabel *lbl)
if (strlen(label_fields[i][MOUNTPOINTS].field) &&
atoi(label_fields[i][UPARTSIZES].field)) {
sprintf(scratch, "%s%s", avail_disknames[inst_disk], partname[i]);
devicename[mounts] = StrAlloc(scratch);
mountpoint[mounts] = StrAlloc(label_fields[i][MOUNTPOINTS].field);
mounts++;
Fname[Nfs] = StrAlloc(scratch);
Fmount[Nfs] = StrAlloc(label_fields[i][MOUNTPOINTS].field);
Nfs++;
nsects = Mbtosects(atoi(label_fields[i][UPARTSIZES].field),
lbl->d_secsize);
#if 0 /* Rounding the offset is at best wrong */
nsects = rndtocylbdry(nsects, lbl->d_secpercyl);
offset = rndtocylbdry(offset, lbl->d_secpercyl);
#endif
lbl->d_partitions[i].p_size = nsects;
lbl->d_partitions[i].p_offset = offset;
offset += nsects;
@ -521,3 +378,209 @@ display_disklabel(int disk)
delwin(window);
dialog_clear();
}
static int
AskWhichPartition(char *prompt)
{
char buf[10];
int i;
*buf = 0;
i = AskEm(stdscr,prompt,buf,1);
if(i != '\n' && i != '\r') return -1;
if(!strchr("abefghABEFGH",*buf)) return -1;
return tolower(*buf) - 'a';
}
static 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;
}
void
DiskLabel()
{
int i,j,done=0,diskno,flag,k;
char buf[128];
struct disklabel *lbl,olbl;
u_long cyl,hd,sec,tsec;
u_long l1,l2,l3,l4;
*buf = 0;
i = AskEm(stdscr,"Enter number of disk to Disklabel ",buf,1);
printf("%d",i);
if(i != '\n' && i != '\r') return;
diskno = atoi(buf);
if(!(diskno >= 0 && diskno < MAX_NO_DISKS && Dname[diskno])) return;
olbl = *Dlbl[diskno];
lbl = &olbl;
cyl = lbl->d_ncylinders;
hd = lbl->d_ntracks;
sec = lbl->d_nsectors;
tsec = lbl->d_secperunit;
while(!done) {
clear(); standend();
j = 0;
mvprintw(j++,0,"%s -- Diskspace editor -- DISKLABEL",TITLE);
j++;
mvprintw(j++,0,"Part Start End Blocks MB Type Mountpoint");
for(i=0;i<MAXPARTITIONS;i++) {
mvprintw(j++,0,"%c ",'a'+i);
if(i>=lbl->d_npartitions) continue;
printw(" %8u %8u %8u %5u ",
lbl->d_partitions[i].p_offset,
lbl->d_partitions[i].p_offset+
(lbl->d_partitions[i].p_size ?
lbl->d_partitions[i].p_size-1 : 0),
lbl->d_partitions[i].p_size,
(lbl->d_partitions[i].p_size + 1024)/2048);
k = lbl->d_partitions[i].p_fstype;
if(k > FSMAXTYPES)
printw(" %04x ",k);
else
printw("%-10s ",fstypenames[k]);
if(i == OURPART)
printw("<Entire FreeBSD slice>");
else if(i == RAWPART)
printw("<Entire Disk>");
else if(Fmount[MP[diskno][i]])
printw(Fmount[MP[diskno][i]]);
}
mvprintw(21,0,"Commands available:");
mvprintw(22,0,"(S)ize (M)ountpoint (D)elete (R)eread (W)rite (Q)uit");
mvprintw(23,0,"Enter Command> ");
i=getch();
switch(i) {
case 'd': case 'D':
j = AskWhichPartition("Delete which partition ? ");
if(j < 0) break;
CleanMount(diskno,j);
lbl->d_partitions[j].p_fstype = FS_UNUSED;
lbl->d_partitions[j].p_size = 0;
lbl->d_partitions[j].p_offset = 0;
break;
case 's': case 'S':
j = AskWhichPartition("Change size of which partition ? ");
if(j < 0) break;
if(lbl->d_partitions[j].p_fstype != FS_BSDFFS &&
lbl->d_partitions[j].p_fstype != FS_UNUSED &&
lbl->d_partitions[j].p_fstype != FS_SWAP) break;
if(lbl->d_partitions[OURPART].p_size == 0) break;
l1=lbl->d_partitions[OURPART].p_offset;
l2=lbl->d_partitions[OURPART].p_offset +
lbl->d_partitions[OURPART].p_size;
for (i=0;i<MAXPARTITIONS;i++) {
if(i == OURPART) continue;
if(i == RAWPART) continue;
if(i == j) continue;
if(lbl->d_partitions[i].p_size == 0) continue;
if(lbl->d_partitions[i].p_offset >= l2) continue;
if((lbl->d_partitions[i].p_offset+
lbl->d_partitions[i].p_size) <= l1) continue;
l3 = lbl->d_partitions[i].p_offset - l1;
l4 = l2 - (lbl->d_partitions[i].p_offset+
lbl->d_partitions[i].p_size);
if(l3 > 0 && l3 >= l4)
l2 = l1+l3;
else if (l4 > 0 && l4 > l3)
l1 = l2-l4;
else
l2 = l1;
}
if(!(l2-l1)) break;
sprintf(buf,"%lu",(l2-l1+1024L)/2048L);
i = AskEm(stdscr,"Size of slice in MB ",buf,10);
l3=strtol(buf,0,0) * 2048L;
if(!l3) break;
if(l3 > l2-l1)
l3 = l2-l1;
lbl->d_partitions[j].p_size = l3;
lbl->d_partitions[j].p_offset = l1;
if(j == 1)
lbl->d_partitions[j].p_fstype = FS_SWAP;
else
lbl->d_partitions[j].p_fstype = FS_BSDFFS;
break;
case 'r': case 'R':
olbl = *Dlbl[diskno];
/* XXX be more selective here */
for(i=0;i<MAXPARTITIONS;i++)
CleanMount(diskno,i);
break;
case 'm': case 'M':
j = AskWhichPartition("Mountpoint of which partition ? ");
if(j < 0) break;
k = lbl->d_partitions[j].p_fstype;
if(k != FS_BSDFFS && k != FS_MSDOS && k != FS_SWAP) break;
if(!lbl->d_partitions[j].p_size) break;
if(k == FS_SWAP)
strcpy(buf,"swap");
else if(Fmount[MP[diskno][j]])
strcpy(buf,Fmount[MP[diskno][j]]);
else
*buf = 0;
if(k != FS_SWAP) {
i = AskEm(stdscr,"Mount on directory ",buf,28);
if(i != '\n' && i != '\r') break;
}
CleanMount(diskno,j);
for(k=1;k<MAX_NO_FS;k++)
if(!Fmount[k])
break;
if(k >= MAX_NO_FS) break;
Fmount[k] = StrAlloc(buf);
MP[diskno][j] = k;
sprintf(buf,"%s%c",Dname[diskno],j+'a');
Fname[MP[diskno][j]] = StrAlloc(buf);
if(lbl->d_partitions[j].p_fstype == FS_BSDFFS)
Ftype[MP[diskno][j]] = StrAlloc("ufs");
else if(lbl->d_partitions[j].p_fstype == FS_MSDOS)
Ftype[MP[diskno][j]] = StrAlloc("msdos");
else if(lbl->d_partitions[j].p_fstype == FS_SWAP)
Ftype[MP[diskno][j]] = StrAlloc("swap");
Fsize[MP[diskno][j]] = (lbl->d_partitions[j].p_size+1024)/2048;
break;
case 'w': case 'W':
*Dlbl[diskno] = *lbl;
Dlbl[diskno]->d_magic = DISKMAGIC;
Dlbl[diskno]->d_magic2 = DISKMAGIC;
Dlbl[diskno]->d_checksum = 0;
Dlbl[diskno]->d_checksum = dkcksum(Dlbl[diskno]);
*lbl= *Dlbl[diskno];
flag=1;
if (ioctl(Dfd[diskno], DIOCWLABEL, &flag) < 0)
Fatal("Couldn't enable writing of labels");
if(ioctl(Dfd[diskno],DIOCSDINFO,Dlbl[diskno]) == -1)
Fatal("Couldn't set label: %s",strerror(errno));
if(ioctl(Dfd[diskno],DIOCWDINFO,Dlbl[diskno]) == -1)
Fatal("Couldn't write label: %s",strerror(errno));
flag=0;
if (ioctl(Dfd[diskno], DIOCWLABEL, &flag) < 0)
Fatal("Couldn't disable writing of labels");
break;
case 'q': case 'Q':
if(!memcmp(lbl,Dlbl[diskno],sizeof *lbl))
return;
/* XXX be more selective here */
for(i=0;i<MAXPARTITIONS;i++)
CleanMount(diskno,i);
return;
break;
}
}
}

View File

@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $Id: main.c,v 1.8 1994/10/26 02:53:09 phk Exp $
* $Id: main.c,v 1.9 1994/10/29 10:01:34 phk Exp $
*
*/
@ -29,36 +29,10 @@
jmp_buf jmp_restart;
/*
* This is the overall plan: (phk's version)
*
* If (pid == 1)
* reopen stdin, stdout, stderr, and do various other magic.
*
* If (file exists /this_is_boot.flp)
* stage0:
* present /README
* stage1:
* Ask about diskallocation and do the fdisk/disklabel stunt.
* stage2:
* Do newfs, mount and copy over a minimal world.
* make /mnt/etc/fstab. Install ourself as /mnt/sbin/init
* Else
* stage3:
* Read cpio.flp and fiddle around with the bits a bit.
* stage4:
* Read bin-tarballs:
* Using ftp
* Using NFS (?)
* Using floppy
* Using tape
* Using shell-prompt
* stage5:
* Extract bin-tarballs
* stage6:
* Ask various questions and collect answers into system-config
* files.
* stage7:
* execl("/sbin/init");
* XXX: utils: Mkdir must do "-p".
* XXX: stage2: do mkdir for msdos-mounts.
* XXX: label: Import dos-slice.
* XXX: mbr: edit geometry
*/
extern int alloc_memory();
@ -77,8 +51,11 @@ main(int argc, char **argv)
i = 1;
ioctl(0,TIOCSPGRP,&i);
setlogin("root");
debug_fd = open("/dev/ttyv1",O_WRONLY);
} else {
debug_fd = open("sysinstall.debug",
O_WRONLY|O_CREAT|O_TRUNC,0644);
}
debug_fd = open("/dev/ttyv1",O_WRONLY);
if (set_termcap() == -1) {
Fatal("Can't find terminal entry\n");
}

View File

@ -17,6 +17,11 @@
#include <dialog.h>
#include <fcntl.h>
#ifdef __i386__ /* temp measure delete nov 15 1994 */
#define i386 1
#else
#warning FOO
#endif
#include <sys/types.h>
#include <sys/disklabel.h>
#include <sys/uio.h>
@ -43,7 +48,42 @@ part_type(int type)
ptr++;
next_type++;
}
return("Uknown");
return("Unknown");
}
void
read_dospart(int fd, struct dos_partition *dp)
{
u_char buf[512];
if (lseek(fd, 0, SEEK_SET) == -1)
Fatal("Couldn't seek for master boot record read\n");
if (read(fd, buf, 512) != 512) {
Fatal("Failed to read master boot record\n");
}
memcpy(dp,buf+DOSPARTOFF,sizeof(*dp)*NDOSPART);
}
void
write_dospart(int fd, struct dos_partition *dp)
{
u_char buf[512];
int flag;
if (lseek(fd, 0, SEEK_SET) == -1)
Fatal("Couldn't seek for master boot record read\n");
if (read(fd, buf, 512) != 512) {
Fatal("Failed to read master boot record\n");
}
memcpy(buf+DOSPARTOFF,dp,sizeof(*dp)*NDOSPART);
if (lseek(fd, 0, SEEK_SET) == -1)
Fatal("Couldn't seek for master boot record read\n");
flag=1;
if (ioctl(fd, DIOCWLABEL, &flag) < 0)
Fatal("Couldn't enable writing of labels");
if (write(fd, buf, 512) != 512)
Fatal("Failed to write master boot record\n");
flag=0;
if (ioctl(fd, DIOCWLABEL, &flag) < 0)
Fatal("Couldn't disable writing of labels");
}
int
@ -57,11 +97,6 @@ read_mbr(int fd, struct mbr *mbr)
sprintf(errmsg, "Failed to read master boot record\n");
return(-1);
}
/* Validate the master boot record */
if (mbr->magic != MBR_MAGIC) {
sprintf(errmsg, "Master boot record is invalid\n");
return(-1);
}
return(0);
}
@ -73,16 +108,14 @@ write_mbr(int fd, struct mbr *mbr)
return(-1);
}
if (enable_label(fd) == -1)
return(-1);
enable_label(fd);
if (write(fd, mbr->bootcode, MBRSIZE) == -1) {
sprintf(errmsg, "Failed to write master boot record\n");
return(-1);
}
if(disable_label(fd) == -1)
return(-1);
disable_label(fd);
return(0);
}
@ -230,3 +263,200 @@ edit_mbr(struct mbr *mbr, struct disklabel *label)
"This editor is still under construction :-)", 10, 75, 1);
show_mbr(mbr);
}
void
Fdisk()
{
int i,j,done=0,diskno,flag;
char buf[128];
struct dos_partition dp[NDOSPART];
struct disklabel *lbl;
u_long cyl,hd,sec,tsec;
u_long l,l1,l2,l3,l4;
*buf = 0;
i = AskEm(stdscr,"Enter number of disk to Fdisk ",buf,1);
printf("%d",i);
if(i != '\n' && i != '\r') return;
diskno = atoi(buf);
if(!(diskno >= 0 && diskno < MAX_NO_DISKS && Dname[diskno])) return;
lbl = Dlbl[diskno];
lbl->d_bbsize = 8192;
cyl = lbl->d_ncylinders;
hd = lbl->d_ntracks;
sec = lbl->d_nsectors;
tsec = Dlbl[diskno]->d_partitions[RAWPART].p_size;
cyl = tsec/(hd*sec);
read_dospart(Dfd[diskno],dp);
while(!done) {
clear(); standend();
j = 0;
mvprintw(j++,0,"%s -- Diskspace editor -- FDISK",TITLE);
j++;
mvprintw(j++,0,
"Geometry: %lu Cylinders, %lu Heads, %lu Sectors, %luMb",
cyl,hd,sec,(tsec+1024)/2048);
j++;
for(i=0;i<NDOSPART;i++,j+=3) {
mvprintw(j++,0,"%d ",i+1);
#if 0
printw("[%02x %02x %02x %02x %02x %02x %02x %02x %08lx %08lx]\n",
dp[i].dp_flag, dp[i].dp_shd, dp[i].dp_ssect, dp[i].dp_scyl,
dp[i].dp_typ, dp[i].dp_ehd, dp[i].dp_esect, dp[i].dp_ecyl,
dp[i].dp_start, dp[i].dp_size);
#endif
if(!dp[i].dp_size) {
printw("Unused");
continue;
}
printw("Boot?=%s",dp[i].dp_flag == 0x80 ? "Yes" : "No ");
printw(" Type=%s\n", part_type(dp[i].dp_typ));
printw(" Phys=(c%d/h%d/s%d..c%d/h%d/s%d)",
DPCYL(dp[i].dp_scyl,dp[i].dp_ssect),dp[i].dp_shd,
DPSECT(dp[i].dp_ssect),
DPCYL(dp[i].dp_ecyl,dp[i].dp_esect),dp[i].dp_ehd,
DPSECT(dp[i].dp_esect));
printw(" Sector=(%lu..%lu)\n",
dp[i].dp_start, dp[i].dp_size + dp[i].dp_start-1);
printw(" Size=%lu MB, %lu Cylinders",(dp[i].dp_size+1024L)/2048L,
dp[i].dp_size/lbl->d_secpercyl);
l = dp[i].dp_size%lbl->d_secpercyl;
if(l) {
printw(" + %lu Tracks", l/lbl->d_nsectors);
l = l % lbl->d_nsectors;
if(l) {
printw(" + %lu Sectors",l);
}
}
}
mvprintw(21,0,"Commands available:");
mvprintw(22,0,"(D)elete (E)dit (R)eread (W)rite (Q)uit");
mvprintw(23,0,"Enter Command> ");
i=getch();
switch(i) {
case 'r': case 'R':
read_dospart(Dfd[diskno],dp);
break;
case 'e': case 'E':
*buf = 0;
i = AskEm(stdscr,"Edit which Slice ? ",buf,1);
if(i != '\n' && i != '\r') break;
l = strtol(buf,0,0);
if(l < 1 || l > NDOSPART) break;
l1=sec; l2=tsec;
for(i=0;i<NDOSPART;i++) {
if((i+1) == l) continue;
if(!dp[i].dp_size) continue;
if(dp[i].dp_start > l2) continue;
if((dp[i].dp_start + dp[i].dp_size) <= l1) continue;
if(dp[i].dp_start > l1)
l3 = dp[i].dp_start - l1;
else
l3 = 0;
if(l2 > (dp[i].dp_start + dp[i].dp_size))
l4 = l2 - (dp[i].dp_start + dp[i].dp_size);
else
l4 = 0;
if(l3 >= l4)
l2 = dp[i].dp_start;
else
l1 = dp[i].dp_start + dp[i].dp_size;
}
sprintf(buf,"%lu",(l2-l1+1024L)/2048L);
i = AskEm(stdscr,"Size of slice in MB ",buf,10);
l3=strtol(buf,0,0) * 2048L;
if(!l3) break;
if(l3 > l2-l1)
l3 = l2-l1;
if((l1+l3) % lbl->d_secpercyl) { /* Special for cyl==0 */
l3 += lbl->d_secpercyl - ((l1+l3) % lbl->d_secpercyl);
}
if(l3+l1 > tsec)
l3 = tsec - l1;
dp[l-1].dp_start=l1;
dp[l-1].dp_size=l3;
l3 += l1 - 1;
l2 = l1 / (sec*hd);
if(l2>1023) l2 = 1023;
dp[l-1].dp_scyl = (l2 & 0xff);
dp[l-1].dp_ssect = (l2 >> 2) & 0xc0;
l1 -= l2*sec*hd;
l2 = l1 / sec;
dp[l-1].dp_shd = l2;
l1 -= l2*sec;
dp[l-1].dp_ssect |= (l1+1) & 0x3f;
l2 = l3 / (sec*hd);
if(l2>1023) l2 = 1023;
dp[l-1].dp_ecyl = (l2 & 0xff);
dp[l-1].dp_esect = (l2 >> 2) & 0xc0;
l3 -= l2*sec*hd;
l2 = l3 / sec;
dp[l-1].dp_ehd = l2;
l3 -= l2*sec;
dp[l-1].dp_esect |= (l3+1) & 0x3f;
l4 = dp[l-1].dp_typ;
if(!l4) l4 = MBR_PTYPE_FreeBSD;
sprintf(buf,"0x%lx",l4);
i = AskEm(stdscr,"Type of slice (0xa5=FreeBSD) ",buf,5);
l3 = strtol(buf,0,0);
if(l3 == MBR_PTYPE_FreeBSD) {
for(i=0;i<NDOSPART;i++)
if(i != (l-1) && dp[i].dp_typ== MBR_PTYPE_FreeBSD)
memset(&dp[i],0,sizeof dp[i]);
sprintf(buf,"0x80");
} else {
sprintf(buf,"0");
}
dp[l-1].dp_typ=l3;
i = AskEm(stdscr,"Bootflag (0x80 for YES) ",buf,5);
dp[l-1].dp_flag=strtol(buf,0,0);
break;
case 'd': case 'D':
*buf = 0;
i = AskEm(stdscr,"Delete which Slice ? ",buf,1);
if(i != '\n' && i != '\r') break;
l = strtol(buf,0,0);
if(l < 1 || l > NDOSPART) break;
memset(&dp[l-1],0,sizeof dp[l-1]);
break;
case 'w': case 'W':
strcpy(buf,"N");
i = AskEm(stdscr,"Confirm write ",buf,1);
if(*buf != 'y' && *buf != 'Y') break;
write_dospart(Dfd[diskno],dp);
Dlbl[diskno]->d_partitions[OURPART].p_offset = 0;
Dlbl[diskno]->d_partitions[OURPART].p_size = 0;
for(i=0;i<NDOSPART;i++) {
if(dp[i].dp_typ == MBR_PTYPE_FreeBSD) {
Dlbl[diskno]->d_partitions[OURPART].p_offset =
dp[i].dp_start;
Dlbl[diskno]->d_partitions[OURPART].p_size =
dp[i].dp_size;
}
}
Dlbl[diskno]->d_magic = DISKMAGIC;
Dlbl[diskno]->d_magic2 = DISKMAGIC;
Dlbl[diskno]->d_checksum = 0;
Dlbl[diskno]->d_checksum = dkcksum(Dlbl[diskno]);
flag=1;
enable_label(Dfd[diskno]);
if(ioctl(Dfd[diskno],DIOCSDINFO,Dlbl[diskno]) == -1)
Fatal("Couldn't set label: %s",strerror(errno));
if(ioctl(Dfd[diskno],DIOCWDINFO,Dlbl[diskno]) == -1)
Fatal("Couldn't write label: %s",strerror(errno));
flag=0;
disable_label(Dfd[diskno]);
if (Dlbl[diskno]->d_partitions[OURPART].p_size)
build_bootblocks(Dfd[diskno],lbl,dp);
break;
case 'q': case 'Q':
return;
break;
}
}
}

View File

@ -18,7 +18,6 @@
struct mbr
{
unsigned char padding[2]; /* force longs to be long aligned */
unsigned char bootcode[DOSPARTOFF];
struct dos_partition dospart[4];
unsigned short magic;
@ -73,8 +72,6 @@ struct part_type
};
extern char *part_type(int);
extern int enable_label(int);
extern int disable_label(int);
extern int write_mbr(int, struct mbr *);
extern int read_mbr(int, struct mbr *);
extern void show_mbr(struct mbr *);

170
sbin/sysinstall/ourcurses.c Normal file
View File

@ -0,0 +1,170 @@
/* Stopgap, until Paul does the right thing */
#define ESC 27
#define TAB 9
#include <stdlib.h>
#include <limits.h>
#include <sys/types.h>
#include <string.h>
#include <string.h>
#include <dialog.h>
#include "sysinstall.h"
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':
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);
wrefresh(window);
field[len] = 0;
delwin(window);
refresh();
return (key);
}
int
AskEm(WINDOW *w,char *prompt, char *answer, int len)
{
int x,y;
mvwprintw(w,23,0,prompt);
wclrtoeol(w);
getyx(w,y,x);
return edit_line(w,y,x,answer,len,len+1);
}

View File

@ -24,7 +24,7 @@
#include "sysinstall.h"
static unsigned char *welcome[] = {
static char *welcome[] = {
"View 'READ ME FIRST' File.",
"View FreeBSD Copyright Information.",
"Proceed with installation.",
@ -39,7 +39,7 @@ stage0()
if (!access(README_FILE, R_OK)) {
dialog_clear();
dialog_textbox("READ ME FIRST", README_FILE, LINES-1, COLS);
dialog_textbox("READ ME FIRST", README_FILE, 24, 80);
}
return;
@ -54,14 +54,14 @@ stage0()
case 1: /* View readme */
if (!access(README_FILE, R_OK)) {
dialog_clear();
dialog_textbox("READ ME FIRST", README_FILE, LINES-1, COLS);
dialog_textbox("READ ME FIRST", README_FILE, 24, 80);
}
break;
case 2: /* View copyrights */
if (!access(COPYRIGHT_FILE, R_OK)) {
dialog_clear();
dialog_textbox("COPYRIGHT", COPYRIGHT_FILE, LINES-1, COLS);
dialog_textbox("COPYRIGHT", COPYRIGHT_FILE, 24, 80);
}
break;

View File

@ -131,39 +131,48 @@ free_memory()
}
char * device_list[] = {"wd","sd",0};
void
query_disks()
{
int i;
char disk[15];
char diskname[5];
struct stat st;
int fd;
int i,j;
char disk[15];
char diskname[5];
struct stat st;
struct disklabel dl;
int fd;
no_disks = 0;
for (i=0;i<10;i++) {
sprintf(diskname,"wd%d",i);
sprintf(disk,"/dev/r%sd",diskname);
if ((stat(disk, &st) == 0) && (st.st_mode & S_IFCHR))
if ((fd = open(disk, O_RDWR)) != -1) {
avail_fds[no_disks] = fd;
bcopy(diskname, avail_disknames[no_disks], strlen(diskname));
if (ioctl(fd, DIOCGDINFO, &avail_disklabels[no_disks++]) == -1)
no_disks--;
}
for(i=0;i<MAX_NO_DISKS;i++)
if(Dname[i]) {
close(Dfd[i]); Dfd[i] = 0;
free(Dlbl[i]); Dlbl[i] = 0;
free(Dname[i]); Dname[i] = 0;
}
Ndisk = 0;
for (j=0; device_list[j]; j++) {
for (i=0;i<10;i++) {
sprintf(diskname,"sd%d",i);
sprintf(disk,"/dev/r%sd",diskname);
if ((stat(disk, &st) == 0) && (st.st_mode & S_IFCHR))
if ((fd = open(disk, O_RDWR)) != -1) {
avail_fds[no_disks] = fd;
bcopy(diskname, avail_disknames[no_disks], strlen(diskname));
if (ioctl(fd, DIOCGDINFO, &avail_disklabels[no_disks++]) == -1)
no_disks--;
}
sprintf(diskname,"%s%d",device_list[j],i);
sprintf(disk,"/dev/r%sd",diskname);
if (stat(disk, &st) || !(st.st_mode & S_IFCHR))
continue;
if ((fd = open(disk, O_RDWR)) == -1)
continue;
if (ioctl(fd, DIOCGDINFO, &dl) == -1) {
close(fd);
continue;
}
Dlbl[Ndisk] = Malloc(sizeof dl);
memcpy(Dlbl[Ndisk], &dl, sizeof dl);
Dname[Ndisk]=StrAlloc(diskname);
Dfd[Ndisk] = fd;
Ndisk++;
if(Ndisk == MAX_NO_DISKS)
return;
}
}
}
int
@ -239,12 +248,61 @@ select_partition(int disk)
void
stage1()
{
int i;
int i,j;
int ok = 0;
int ready = 0;
query_disks();
while (!ready) {
clear(); standend();
j = 0;
mvprintw(j++,0,"%s -- Diskspace editor",TITLE);
j++;
mvprintw(j++,0,"Disks Total FreeBSD ");
j++;
for(i=0;i<MAX_NO_DISKS;i++) {
if(!Dname[i])
continue;
mvprintw(j++,0,"%2d: %-6s %5lu MB %5lu MB",
i,
Dname[i],
PartMb(Dlbl[i],RAWPART),
PartMb(Dlbl[i],OURPART) );
}
j++;
mvprintw(j++,0,"Filesystems Type Size Mountpoint");
j++;
for(i=0;i<MAX_NO_FS;i++) {
if(!Fname[i])
continue;
mvprintw(j++,0,"%2d: %-5s %-5s %5lu MB %-s",
i,Fname[i],Ftype[i],Fsize[i],Fmount[i]);
}
mvprintw(21,0,"Commands available:");
mvprintw(22,0,"(F)disk (D)isklabel (Q)uit");
mvprintw(23,0,"Enter Command> ");
i = getch();
switch(i) {
case 'q': case 'Q':
return;
case 'f': case 'F':
Fdisk();
query_disks();
break;
case 'd': case 'D':
DiskLabel();
break;
default:
beep();
}
}
for (i=0; Dname[i]; i++)
close(Dfd[i]);
return;
}
#if 0
while (!ready) {
ready = 1;
@ -321,7 +379,9 @@ stage1()
dialog_clear();
}
}
if(getenv("STAGE0")) {
Fatal("We stop here");
}
/* Write master boot record and bootblocks */
if (write_mbr(avail_fds[inst_disk], mbr) == -1)
Fatal(errmsg);
@ -338,3 +398,4 @@ stage1()
Fatal(errmsg);
}
}
#endif

View File

@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $Id: stage2.c,v 1.7 1994/10/26 05:41:00 phk Exp $
* $Id: stage2.c,v 1.8 1994/10/26 10:33:36 jkh Exp $
*
*/
@ -30,91 +30,104 @@
void
stage2()
{
char **p,**q;
char pbuf[90];
char dbuf[90];
FILE *f1;
int i;
char *p,*q;
char pbuf[90];
char dbuf[90];
FILE *f1;
int i,j;
for(q=mountpoint,p = devicename; *p; p++,q++) {
if(!strcmp(*q,"swap"))
continue;
TellEm("newfs /dev/r%s",*p);
strcpy(pbuf, "/dev/r");
strcat(pbuf, *p);
i = exec(0, "/stand/newfs", "/stand/newfs", pbuf, 0);
if (i)
Fatal("Exec(/stand/newfs) failed, code=%d.",i);
/* Sort in mountpoint order */
memset(Fsize,0,sizeof Fsize);
for(i=1; Fname[i]; i++)
Fsize[i] = i;
for(j=1;j;)
for(j=0,i=1;Fsize[i+1];i++) {
if(strcmp(Fmount[Fsize[i]],Fmount[Fsize[i+1]]) > 0) {
j = Fsize[i];
Fsize[i] = Fsize[i+1];
Fsize[i+1] = j;
}
}
for(q=mountpoint,p = devicename; *p; p++,q++) {
if(!strcmp(*q,"swap"))
continue;
strcpy(dbuf,"/mnt");
if(strcmp(*q,"/"))
strcat(dbuf,*q);
MountUfs(*p, dbuf, 1, 0);
}
for(j=1;Fsize[j];j++) {
if(strcmp(Ftype[Fsize[j]],"ufs"))
continue;
p = Fname[Fsize[j]];
TellEm("newfs /dev/r%s",p);
strcpy(pbuf, "/dev/r");
strcat(pbuf, p);
i = exec(0, "/stand/newfs", "/stand/newfs", "-n", "1", pbuf, 0);
if (i)
Fatal("Exec(/stand/newfs) failed, code=%d.",i);
}
Mkdir("/mnt/etc");
Mkdir("/mnt/dev");
Mkdir("/mnt/mnt");
Mkdir("/mnt/stand");
for(j=1;Fsize[j];j++) {
if(strcmp(Ftype[Fsize[j]],"ufs"))
continue;
strcpy(dbuf,"/mnt");
p = Fname[Fsize[j]];
q = Fmount[Fsize[j]];
if(strcmp(q,"/"))
strcat(dbuf,q);
MountUfs(p, dbuf, 1, 0);
}
CopyFile("/stand/sysinstall","/mnt/stand/sysinstall");
link("/mnt/stand/sysinstall","/mnt/stand/cpio");
link("/mnt/stand/sysinstall","/mnt/stand/gunzip");
link("/mnt/stand/sysinstall","/mnt/stand/gzip");
link("/mnt/stand/sysinstall","/mnt/stand/zcat");
link("/mnt/stand/sysinstall","/mnt/stand/newfs");
link("/mnt/stand/sysinstall","/mnt/stand/fsck");
link("/mnt/stand/sysinstall","/mnt/stand/dialog");
CopyFile("/kernel","/mnt/kernel");
TellEm("make /dev entries");
chdir("/mnt/dev");
makedevs();
chdir("/");
Mkdir("/mnt/etc");
Mkdir("/mnt/dev");
Mkdir("/mnt/mnt");
Mkdir("/mnt/stand");
TellEm("Making /mnt/etc/fstab");
f1 = fopen("/mnt/etc/fstab","w");
if(!f1)
Fatal("Couldn't open /mnt/etc/fstab for writing.");
CopyFile("/stand/sysinstall","/mnt/stand/sysinstall");
link("/mnt/stand/sysinstall","/mnt/stand/cpio");
link("/mnt/stand/sysinstall","/mnt/stand/gunzip");
link("/mnt/stand/sysinstall","/mnt/stand/gzip");
link("/mnt/stand/sysinstall","/mnt/stand/zcat");
link("/mnt/stand/sysinstall","/mnt/stand/newfs");
link("/mnt/stand/sysinstall","/mnt/stand/fsck");
link("/mnt/stand/sysinstall","/mnt/stand/dialog");
CopyFile("/kernel","/mnt/kernel");
TellEm("make /dev entries");
chdir("/mnt/dev");
makedevs();
chdir("/");
TellEm("Writing filesystems");
for(q=mountpoint,p = devicename; *p; p++,q++) {
if(!strcmp(*q,"swap"))
continue;
fprintf(f1,"/dev/%s\t\t%s\tufs rw 1 1\n",*p,*q);
}
TellEm("Writing swap-devs");
for(q=mountpoint,p = devicename; *p; p++,q++) {
if(strcmp(*q,"swap"))
continue;
fprintf(f1,"/dev/%s\t\tnone\tswap sw 0 0\n",*p);
}
TellEm("Writing procfs");
fprintf(f1,"proc\t\t/proc\tprocfs rw 0 0\n");
fclose(f1);
TellEm("Making /mnt/etc/fstab");
f1 = fopen("/mnt/etc/fstab","w");
if(!f1)
Fatal("Couldn't open /mnt/etc/fstab for writing.");
sync();
TellEm("Make marker-file");
i = open("/mnt/stand/need_cpio_floppy",O_CREAT|O_WRONLY|O_TRUNC);
close(i);
TellEm("Writing filesystems");
for(j=1;Fsize[j];j++) {
if(!strcmp(Ftype[Fsize[j]],"swap"))
fprintf(f1,"/dev/%s\t\tnone\tswap sw 0 0\n",Fname[Fsize[j]]);
else
fprintf(f1,"/dev/%s\t\t%s\t%s rw 1 1\n",
Fname[Fsize[j]], Fmount[Fsize[j]], Ftype[Fsize[j]]);
}
TellEm("Writing procfs");
fprintf(f1,"proc\t\t/proc\tprocfs rw 0 0\n");
fclose(f1);
sync();
TellEm("Make marker-file");
i = open("/mnt/stand/need_cpio_floppy",O_CREAT|O_WRONLY|O_TRUNC);
close(i);
TellEm("Unmount disks");
for(j=1;Fsize[j];j++)
continue;
/* we have to unmount in reverse order */
for(p = mountpoint; *p; p++)
continue;
TellEm("Unmount disks");
for(p--;p >= mountpoint;p--) {
if(!strcmp(*p,"swap"))
continue;
strcpy(dbuf,"/mnt");
if(strcmp(*p,"/"))
strcat(dbuf,*p);
TellEm("unmount %s",dbuf);
/* Don't do error-check, we reboot anyway... */
unmount(dbuf, 0);
}
dialog_msgbox(TITLE,"Remove the floppy from the drive, and hit return to reboot from the hard disk",6, 75, 1);
for(j--;j > 0;j--) {
if(!strcmp(Ftype[Fsize[j]],"swap"))
continue;
strcpy(dbuf,"/mnt");
if(strcmp(Fmount[Fsize[j]],"/"))
strcat(dbuf,Fmount[Fsize[j]]);
TellEm("unmount %s",dbuf);
/* Don't do error-check, we reboot anyway... */
unmount(dbuf, 0);
}
dialog_msgbox(TITLE,"Remove the floppy from the drive, and hit return to reboot from the hard disk",6, 75, 1);
}

View File

@ -17,9 +17,24 @@
#define BOOT1 "/stand/sdboot"
#define BOOT2 "/stand/bootsd"
#define MAXFS 25
#define MAX_NO_DISKS 10
#define MAX_NO_FS 30
#define MAXFS MAX_NO_FS
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ncurses.h>
#include <string.h>
#include <errno.h>
#include <dialog.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/dkbad.h>
#include <sys/disklabel.h>
#define MAX_NO_DISKS 10
#define SCRATCHSIZE 1024
#define ERRMSGSIZE 256
#define DEFROOTSIZE 16
@ -38,12 +53,26 @@
# define EXTERN extern
#endif
EXTERN char *devicename[MAXFS+1];
EXTERN char *mountpoint[MAXFS+1];
/* All this "disk" stuff */
EXTERN int Ndisk;
EXTERN struct disklabel *Dlbl[MAX_NO_DISKS];
EXTERN char *Dname[MAX_NO_DISKS];
EXTERN int Dfd[MAX_NO_DISKS];
EXTERN int MP[MAX_NO_DISKS][MAXPARTITIONS];
/* All this "filesystem" stuff */
EXTERN int Nfs;
EXTERN char *Fname[MAX_NO_FS+1];
EXTERN char *Fmount[MAX_NO_FS+1];
EXTERN char *Ftype[MAX_NO_FS+1];
EXTERN u_long Fsize[MAX_NO_FS+1];
EXTERN int dialog_active;
EXTERN char selection[];
EXTERN int debug_fd;
extern unsigned char **avail_disknames;
extern int no_disks;
extern int inst_disk;
@ -67,6 +96,7 @@ void AskAbort __P((char *fmt, ...));
void MountUfs __P((char *device, char *mountpoint, int do_mkdir,int flags));
void Mkdir __P((char *path));
void CopyFile __P((char *p1, char *p2));
u_long PartMb(struct disklabel *lbl,int part);
/* exec.c */
int exec __P((int magic, char *cmd, char *args, ...));
@ -95,3 +125,13 @@ int set_termcap __P((void));
/* makedevs.c */
int makedevs __P((void));
/* outcurses.c */
int edit_line __P((WINDOW *window, int y, int x, char *field, int width, int maxlen));
int AskEm __P((WINDOW *w,char *prompt, char *answer, int len));
/* bootarea.c */
void enable_label __P((int fd));
void disable_label __P((int fd));
int write_bootblocks __P((int fd, struct disklabel *lbl));
int build_bootblocks __P((int dfd,struct disklabel *label,struct dos_partition *dospart));

View File

@ -25,45 +25,11 @@
#include <sys/param.h>
#include <sys/mount.h>
#include <sys/reboot.h>
#include <sys/dkbad.h>
#include <sys/disklabel.h>
#include "sysinstall.h"
void
strip_trailing_newlines(char *p)
{
int len = strlen(p);
while (len > 0 && p[len-1] == '\n')
p[--len] = '\0';
}
int strwidth(char *p)
{
int i = 0, len;
char *start, *s;
for (start = s = p; (s = strchr(s, '\n')) != NULL; start = ++s) {
*s = '\0';
len = strlen(start);
*s = '\n';
if (len > i)
i = len;
}
len = strlen(start);
if (len > i)
i = len;
return i;
}
int strheight(char *p)
{
int i = 1;
char *s;
for (s = p; (s = strchr(s, '\n')) != NULL; s++)
i++;
return i;
}
void
Debug(char *fmt, ...)
{
@ -84,19 +50,14 @@ TellEm(char *fmt, ...)
{
char *p;
va_list ap;
int width, height;
p = Malloc(2048);
va_start(ap,fmt);
vsnprintf(p, 2048, fmt, ap);
va_end(ap);
strip_trailing_newlines(p);
write(debug_fd,"Progress <",10);
write(debug_fd,p,strlen(p));
write(debug_fd,">\n\r",3);
width = strwidth(p);
height = strheight(p);
dialog_msgbox("Progress", p, height+2, width+4, 0);
dialog_msgbox("Progress", p, 3, 75, 0);
free(p);
}
@ -105,19 +66,14 @@ Fatal(char *fmt, ...)
{
char *p;
va_list ap;
int width, height;
p = Malloc(2048);
va_start(ap,fmt);
vsnprintf(p, 2048, fmt, ap);
va_end(ap);
strip_trailing_newlines(p);
width = strwidth(p);
height = strheight(p);
if (dialog_active)
dialog_msgbox("Fatal", p, height+4, width+4, 1);
dialog_msgbox("Fatal", p, 12, 75, 1);
else
fprintf(stderr, "Fatal -- %s\n", p);
fprintf(stderr, "Fatal -- %s", p);
free(p);
ExitSysinstall();
}
@ -259,3 +215,11 @@ CopyFile(char *p1, char *p2)
close(fd1);
close(fd2);
}
u_long
PartMb(struct disklabel *lbl,int part)
{
u_long l;
l = 1024*1024/lbl->d_secsize;
return (lbl->d_partitions[part].p_size + l/2)/l;
}