diff options
author | jkh <jkh@FreeBSD.org> | 1994-12-27 23:26:59 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1994-12-27 23:26:59 +0000 |
commit | 8b2cef6b70b4605908c2560ceeee5c4f4e277ad5 (patch) | |
tree | e08f30cbdf2653127108aeda590d2864607338e0 | |
parent | 1bba21e3a1a4a27d8fcf4fd5fcf8eeb133c64f0e (diff) | |
download | FreeBSD-src-8b2cef6b70b4605908c2560ceeee5c4f4e277ad5.zip FreeBSD-src-8b2cef6b70b4605908c2560ceeee5c4f4e277ad5.tar.gz |
Bring the 2.0 RELEASE version back into -current. Now I just need
to resurrect my changes for the last snapshot, which were unfortunately
lost in a forest fire on time.
-rw-r--r-- | sbin/sysinstall/Makefile | 5 | ||||
-rw-r--r-- | sbin/sysinstall/bootarea.c | 215 | ||||
-rw-r--r-- | sbin/sysinstall/exec.c | 5 | ||||
-rw-r--r-- | sbin/sysinstall/label.c | 740 | ||||
-rw-r--r-- | sbin/sysinstall/main.c | 7 | ||||
-rw-r--r-- | sbin/sysinstall/mbr.c | 815 | ||||
-rw-r--r-- | sbin/sysinstall/mbr.h | 187 | ||||
-rw-r--r-- | sbin/sysinstall/ourcurses.c | 1 | ||||
-rw-r--r-- | sbin/sysinstall/stage0.c | 46 | ||||
-rw-r--r-- | sbin/sysinstall/stage1.c | 390 | ||||
-rw-r--r-- | sbin/sysinstall/stage2.c | 128 | ||||
-rw-r--r-- | sbin/sysinstall/stage3.c | 4 | ||||
-rw-r--r-- | sbin/sysinstall/stage5.c | 11 | ||||
-rw-r--r-- | sbin/sysinstall/sysinstall.h | 34 | ||||
-rw-r--r-- | sbin/sysinstall/utils.c | 90 |
15 files changed, 1368 insertions, 1310 deletions
diff --git a/sbin/sysinstall/Makefile b/sbin/sysinstall/Makefile index d2b34da..f42dfda 100644 --- a/sbin/sysinstall/Makefile +++ b/sbin/sysinstall/Makefile @@ -4,12 +4,11 @@ NOMAN= yet .PATH: /usr/src/sbin/disklabel -SRCS = bootarea.c editor.c exec.c dkcksum.c label.c main.c mbr.c \ +SRCS = 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 ourcurses.c -CFLAGS += -Wall -g -static -I${.CURDIR}/../../sys/ -CLEANFILES += makedevs.c +CFLAGS += -Wall -g -static LDADD = -ldialog -lncurses -lmytinfo DPADD = ${LIBDIALOG} ${LIBNCURSES} ${LIBMYTINFO} diff --git a/sbin/sysinstall/bootarea.c b/sbin/sysinstall/bootarea.c index 44aca12..73e5f2c 100644 --- a/sbin/sysinstall/bootarea.c +++ b/sbin/sysinstall/bootarea.c @@ -12,152 +12,103 @@ * its use. */ -#include <fstab.h> -#include <unistd.h> -#include <stdio.h> -#include <string.h> -#include <dialog.h> - -#include <sys/param.h> #include <sys/types.h> #include <sys/errno.h> #include <sys/disklabel.h> #include <sys/ioctl.h> #include <sys/fcntl.h> #include <sys/uio.h> -#include <ufs/ffs/fs.h> +#include <unistd.h> +#include <stdio.h> +#include <string.h> +#include <dialog.h> -#include "disk.h" +#include "mbr.h" #include "sysinstall.h" -char boot1[] = BOOT1; -char boot2[] = BOOT2; +extern char *bootblocks; +extern struct mbr *mbr; +extern char boot1[]; +extern char boot2[]; int -enable_label(int fd) -{ - int flag = 1; - if (ioctl(fd, DIOCWLABEL, &flag) < 0) - return (-1); - return (0); -} +write_bootblocks(int fd, struct disklabel *lbl) +{ + off_t of = lbl->d_partitions[OURPART].p_offset; -int -disable_label(int fd) -{ - int flag = 0; - if (ioctl(fd, DIOCWLABEL, &flag) < 0) - return (-1); - return (0); + 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"); + } + + enable_label(fd); + + 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) + ); + } + + disable_label(fd); + + return(0); } int -write_bootblocks(int disk) +build_bootblocks(int dfd,struct disklabel *label,struct dos_partition *dospart) { - int fd; - off_t offset; - int part = disk_list[disk].inst_part; - struct disklabel *lbl = &disk_list[disk].lbl; - unsigned char bootblocks[BBSIZE]; - - /* Load MBR boot code */ - - if ((fd = open(boot1, O_RDONLY)) == -1) { - sprintf(errmsg, "Couldn't open boot file %s for bootblocks\n%s\n", - boot1, strerror(errno)); - return (-1); - } - - if (read(fd, bootblocks, MBRSIZE) < 0) { - sprintf(errmsg, "Couldn't load boot file %s into bootblocks\n%s\n", - boot1, strerror(errno)); - return (-1); - } - - if (close(fd) == -1) { - sprintf(errmsg, "Couldn't close boot file %s\n%s\n", boot1, - strerror(errno)); - return (-1); - } - - /* Load second level boot code */ - - if ((fd = open(boot2, O_RDONLY)) == -1) { - sprintf(errmsg, "Couldn't open boot file %s for bootblocks\n%s\n", - boot2, strerror(errno)); - return (-1); - } - - if (read(fd, &bootblocks[MBRSIZE], (int)(lbl->d_bbsize - MBRSIZE)) < 0) { - sprintf(errmsg, "Couldn't load boot file %s into bootblocks\n%s\n", - boot2, strerror(errno)); - return (-1); - } - - if (close(fd) == -1) { - sprintf(errmsg, "Couldn't close boot file %s\n%s\n", boot2, - strerror(errno)); - return (-1); - } - - - /* Copy the current MBR table into the boot blocks */ - - bcopy(&disk_list[disk].mbr.dospart, &bootblocks[DOSPARTOFF], - sizeof(struct dos_partition) * NDOSPART); - - /* Set checksum */ - lbl->d_checksum = 0; - lbl->d_checksum = dkcksum(lbl); - - /* Copy disklabel into bootblocks */ - - bcopy(lbl, &bootblocks[(LABELSECTOR * lbl->d_secsize) + LABELOFFSET], - sizeof *lbl); - - /* Calculate offset to start of MBR partition we're installing to */ - - offset = disk_list[disk].mbr.dospart[part].dp_start; - offset *= lbl->d_secsize; - - /* Write the boot blocks out to the raw disk */ - - if ((fd = open(diskname(disk), O_RDWR)) == -1) { - sprintf(errmsg, "Couldn't open %s to write bootblocks\n%s\n", - scratch,strerror(errno)); - return (-1); - } - - if (lseek(fd, offset, SEEK_SET) < 0) { - sprintf(errmsg, "Couldn't seek to bootblocks area %s\n%s\n", - scratch, strerror(errno)); - 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); - - if (write(fd, bootblocks, lbl->d_bbsize) != lbl->d_bbsize) { - sprintf(errmsg, "Failed to write out bootblocks to %s\n%s\n", - scratch, strerror(errno)); - return (-1); - } - - if (disable_label(fd) == -1) - return (-1); - - if (close(fd) == -1) { - sprintf(errmsg, "Couldn't close device %s\n\n%s", - scratch, strerror(errno)); - return (-1); - } - return(0); + int fd; + off_t of = label->d_partitions[OURPART].p_offset; + + Debug("Loading boot code from %s", boot1); + + fd = open(boot1, O_RDONLY); + if (fd < 0) + Fatal("Couldn't open boot file %s\n", boot1); + + if (read(fd, bootblocks, MBRSIZE) < 0) + Fatal("Couldn't read from boot file %s\n", boot1); + + if (close(fd) == -1) + Fatal("Couldn't close boot file %s\n", boot1); + + Debug("Loading boot code from %s", boot2); + + 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) + Fatal("Couldn't read from boot file %s\n", boot2); + + if (close(fd) == -1) + Fatal("Couldn't close boot file %s", boot2); + + bcopy(dospart, &bootblocks[DOSPARTOFF], + sizeof(struct dos_partition) * NDOSPART); + + label->d_checksum = 0; + label->d_checksum = dkcksum(label); + bcopy(label, &bootblocks[(LABELSECTOR * label->d_secsize) + LABELOFFSET], + sizeof *label); + + Debug("Seeking to byte %ld ", of * label->d_secsize); + + if (lseek(dfd, (of * label->d_secsize), SEEK_SET) < 0) { + Fatal("Couldn't seek to start of partition\n"); + } + + enable_label(dfd); + + 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); } diff --git a/sbin/sysinstall/exec.c b/sbin/sysinstall/exec.c index 0c07991..379f41d 100644 --- a/sbin/sysinstall/exec.c +++ b/sbin/sysinstall/exec.c @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $Id: exec.c,v 1.7 1994/11/08 18:44:13 jkh Exp $ + * $Id: exec.c,v 1.8.2.1 1994/11/21 03:11:59 phk Exp $ * */ @@ -38,8 +38,7 @@ exec(int magic, char *cmd, char *args, ...) struct stat dummy; if (stat(cmd, &dummy) == -1) { - sprintf(errmsg, "Executable %s does not exist\n", cmd); - return(-1); + Fatal("Executable %s does not exist", cmd); } va_start(ap, args); diff --git a/sbin/sysinstall/label.c b/sbin/sysinstall/label.c index 570835e..2b0d5f4 100644 --- a/sbin/sysinstall/label.c +++ b/sbin/sysinstall/label.c @@ -1,401 +1,383 @@ +/* + * $Id: label.c,v 1.23.2.2 1994/11/21 03:53:45 phk Exp $ + */ + +#include <stdlib.h> +#include <limits.h> #define DKTYPENAMES #include <sys/param.h> +#include <ufs/ffs/fs.h> #include <sys/types.h> +#include <string.h> #include <sys/disklabel.h> -#include <sys/devconf.h> #include <ufs/ffs/fs.h> -#include <fstab.h> -#include <stdlib.h> -#include <limits.h> -#include <fcntl.h> -#include <string.h> #include <string.h> #include <dialog.h> - -#include "disk.h" #include "sysinstall.h" -#include "editor.h" -#include "label.h" - -/* Forward decls */ -int disk_size(struct disklabel *); -int getfstype(char *); -int sectstoMb(int, int); - -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) -{ - int size; - - size = lbl->d_secsize * lbl->d_nsectors * - lbl->d_ntracks * lbl->d_ncylinders; - return (size / 1024 / 1024); -} - -int -sectstoMb(int nsects, int secsize) +static int +AskWhichPartition(char *prompt) { - int size; - - size = nsects * secsize; - if (size) - size /= 1024 * 1024; - return (size); + char buf[10]; + int i; + *buf = 0; + i = AskEm(stdscr, prompt, buf, 2); + if (i != '\n' && i != '\r') return -1; + if (!strchr("abefghABEFGH",*buf)) return -1; + return tolower(*buf) - 'a'; } -int -Mbtosects(int Mb, int secsize) +void +DiskLabel() { - int nsects; + int i, j, done = 0, diskno, k; + char buf[128],*p; + struct disklabel *lbl, olbl; + struct dos_partition dp[NDOSPART]; - 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); -} - -char * -diskname(int disk) -{ - sprintf(scratch, "/dev/r%s%dd", disk_list[disk].devconf->dc_name, - disk_list[disk].devconf->dc_unit); - 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) -{ - int fd; - - if ((fd = open(diskname(disk), O_RDONLY)) == -1) { - sprintf(errmsg, "Couldn't open %s to read disklabel\n%s\n", - scratch,strerror(errno)); - return (-1); + u_long cyl, hd, sec, tsec; + u_long l1, l2, l3, l4; + char *yip = NULL; + u_long allocated_space, ourpart_size, ourpart_offset; + + *buf = 0; + i = AskEm(stdscr, "Enter number of disk to Disklabel> ", buf, 3); + Debug("%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; + for (i = lbl->d_npartitions; i < MAXPARTITIONS; i++) { + lbl->d_partitions[i].p_offset = 0; + lbl->d_partitions[i].p_size = 0; + lbl->d_partitions[i].p_fstype = 0; + } + lbl->d_npartitions = MAXPARTITIONS; + + if(Dname[diskno][0] == 's' && Dname[diskno][1] == 'd') + lbl->d_type = DTYPE_SCSI; + else + lbl->d_type = DTYPE_ST506; + + while(!done) { + clear(); standend(); + if (yip) { + standout(); + mvprintw(24, 0, yip); + standend(); + beep(); + yip = NULL; } - - if (ioctl(fd, DIOCGDINFO, &disk_list[disk].lbl) == -1) { - sprintf(errmsg, "Couldn't get disklabel from %s\n%s\n", - scratch, strerror(errno)); - return (-1); + j = 0; + mvprintw(j++, 0, "%s -- Diskspace editor -- DISKLABEL", TITLE); + j++; + + allocated_space = 0; + ourpart_size = lbl->d_partitions[OURPART].p_size; + ourpart_offset = lbl->d_partitions[OURPART].p_offset; + + mvprintw(j++, 0, "Part Start End Blocks MB Type Action Mountpoint"); + for (i = 0; i < MAXPARTITIONS; i++) { + refresh(); + mvprintw(j++, 0, "%c ", 'a'+i); + 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("%-7.7s ", fstypenames[k]); + + if(!MP[diskno][i]) + printw(" "); + else if(!strcmp(Ftype[MP[diskno][i]],"swap")) + printw("swap "); + else if(Faction[MP[diskno][i]]) + printw("newfs "); + else + printw("mount "); + 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]]); + if ((lbl->d_partitions[i].p_offset >= ourpart_offset) && + ((lbl->d_partitions[i].p_offset + + lbl->d_partitions[i].p_size) <= + (ourpart_offset + ourpart_size))) + allocated_space += lbl->d_partitions[i].p_size; + } } - - if (close(fd) == -1) { - sprintf(errmsg, "Couldn't close %s after reading disklabel\n%s\n", - scratch, strerror(errno)); - return (-1); + mvprintw(17, 0, "Total size: %8lu blocks %5luMb", + ourpart_size, (ourpart_size + 1024)/2048); + mvprintw(18, 0, "Space allocated: %8lu blocks %5luMb", + allocated_space, (allocated_space + 1024)/2048); + mvprintw(20, 0, "Commands available: "); + if (memcmp(lbl, Dlbl[diskno], sizeof *lbl)) { + standout(); + printw("Use (W)rite to save changes to disk"); + standend(); } - return (0); -} - -int -edit_disklabel(int disk) -{ - WINDOW *window; - int key = 0; - int done; - int next; - int cur_field; - int cur_part; - int i; - struct disklabel *lbl = &disk_list[disk].lbl; - int offset, slop; - int nsects, hog; - int avail_sects, free; - - lbl->d_magic = DISKMAGIC; - bcopy("INSTALLATION", lbl->d_typename, strlen("INSTALLATION")); - lbl->d_rpm = 3600; - lbl->d_interleave = 1; - lbl->d_trackskew = 0; - lbl->d_cylskew = 0; - lbl->d_magic2 = DISKMAGIC; - lbl->d_checksum = 0; - lbl->d_bbsize = BBSIZE; - lbl->d_sbsize = SBSIZE; - lbl->d_npartitions = 8; - - /* Initialise the entries */ - - for (i=0; i < MAXPARTITIONS; i++) { - - disk_list[disk].mounts[i].fs_spec = - (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, - disk_list[disk].devconf->dc_unit, - partname[i]); - - disk_list[disk].mounts[i].fs_file = - (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); + mvprintw(21, 0, "(H)elp (T)utorial (E)dit (A)ssign (D)elete (R)eread (W)rite (Q)uit"); + mvprintw(22, 0, "(P)reserve (S)lice"); + mvprintw(23, 0, "Enter Command> "); + i=getch(); + switch(i) { + case 'h': case 'H': case '?': + clear(); + mvprintw(0, 0, +"%s -- Diskspace editor -- DISKLABEL -- Command Help + +Basic commands: + +(H)elp - This screen +(T)utorial - More detailed information on MBRs, disklabels, etc. +(E)dit - Edit an existing disklabel entry +(A)ssign - Assign a filesystem (or swap) to a partition +(D)elete - Delete an existing disklabel entry +(R)eread - Re-read disklabel from disk, discarding any changes +(W)rite - Write updated disklabel information to disk +(P)reserve - Don't newfs the filesystem (preserve old contents) +(S)lice - Import foreign slice from MBR (for example, DOS) +(Q)uit - Exit from the disklabel editor + +Press any key to return to Disklabel editor... +", TITLE); + getch(); + break; + case 't': case 'T': + ShowFile(HELPME_FILE,"Help file for disklayout"); + break; + case 'd': case 'D': + j = AskWhichPartition("Delete which partition> "); + if (j < 0) { + yip = "Invalid partition"; + 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 'p': case 'P': + j = AskWhichPartition("Preserve which partition> "); + if (j < 0) { + yip = "Invalid partition"; + break; + } + if (!MP[diskno][j]) { + yip = "Unmounted partitions are preserved by default"; + break; + } + if (lbl->d_partitions[j].p_fstype == FS_SWAP) { + yip = "swap partitions cannot be preserved."; + break; + } + if (lbl->d_partitions[j].p_fstype != FS_BSDFFS) { + yip = "All non-ufs partitions are preserved by default."; + break; + } + if (!fixit && !strcmp(Fmount[MP[diskno][j]],"/")) { + yip = "/ cannot be preserved."; + break; + } + if (!fixit && !strcmp(Fmount[MP[diskno][j]],"/usr")) { + yip = "/usr cannot be preserved."; + break; + } + if (!fixit && !strcmp(Fmount[MP[diskno][j]],"/var")) { + yip = "/var cannot be preserved."; + break; + } + Faction[MP[diskno][j]] = 1 - Faction[MP[diskno][j]]; + break; + + case 's': case 'S': + read_dospart(Dfd[diskno],&dp[0]); + *buf = 0; + j = AskEm(stdscr,"Import which fdisk slice> ",buf,4); + if(j != '\n' && j != '\r') + break; + i = strtoul(buf,0,0); + if (i < 1 || i > 4) { + yip = "Invalid slice, must be '1' to '4'"; + break; + } + if (!dp[i-1].dp_size) { + yip = "empty slice cannot be imported"; + break; + } + j = AskWhichPartition("Import on which partition> "); + if (j < 0) { + yip = "Invalid partition"; + break; + } + CleanMount(diskno, j); + lbl->d_partitions[j].p_offset = dp[i-1].dp_start; + lbl->d_partitions[j].p_size = dp[i-1].dp_size; + switch (dp[i-1].dp_typ) { + case 0x01: + case 0x04: + case 0x06: + lbl->d_partitions[j].p_fstype=FS_MSDOS; + break; + default: + lbl->d_partitions[j].p_fstype=FS_OTHER; + break; + } + break; + + case 'e': case 'E': + j = AskWhichPartition("Change size of which partition> "); + if (j < 0) { + yip = "Invalid partition"; + 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) { + yip = "Invalid partition type"; + break; + } + if (lbl->d_partitions[OURPART].p_size == 0) { + yip = "No FreeBSD partition defined?"; + 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)) { + yip = "Sizes unchanged - couldn't find room"; + break; + } + sprintf(buf, "%lu", (l2-l1+1024L)/2048L); + i = AskEm(stdscr, "Size of partition in MB> ", buf, 10); + l3= strtol(buf, 0, 0) * 2048L; + if (!l3) { + yip = "Invalid size given"; + 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 'a': case 'A': + if (memcmp(lbl, Dlbl[diskno], sizeof *lbl)) { + yip = "Please (W)rite changed partition information first"; + break; + } + j = AskWhichPartition("Assign which partition> "); + if (j < 0) { + yip = "Invalid partition"; + break; + } + k = lbl->d_partitions[j].p_fstype; + if (k != FS_BSDFFS && k != FS_MSDOS && k != FS_SWAP) { + yip = "Invalid partition type"; + break; + } + if (!lbl->d_partitions[j].p_size) { + yip = "Zero partition 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, "Directory mountpoint> ", buf, 28); + if (i != '\n' && i != '\r') + break; + p = buf + strlen(buf) - 1; + + while (isspace(*p) && p >= buf) + *p-- = '\0'; + if (*buf && *buf != '/') { + yip = "Mountpoint must start with a '/'"; + break; } - 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)); - } - - /* - * 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); + } + CleanMount(diskno, j); + if (!*buf) + break; + p = SetMount(diskno,j,buf); + yip = p; + 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]; + 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)); + disable_label(Dfd[diskno]); + yip = "Label written successfully."; + 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; } - - keypad(window, TRUE); - - draw_box(window, 0, 0, LINES, COLS, 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; - done = 0; - while (!done && (key != ESC)) { - - /* 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; - if (i == RAWPART) - continue; - 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; - offset += nsects; - if (nsects == 0) - lbl->d_partitions[i].p_offset = 0; - lbl->d_partitions[i].p_size = nsects; - 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", - 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", - 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)); - - 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; - } - next = change_field(label_field[cur_field], key); - if (next == -1) { - beep(); - } else - cur_field = next; - } - - if (write_bootblocks(disk) == -1) - return(-1); - - delwin(window); - dialog_clear(); - return(0); -} - -void -display_disklabel(int disk) -{ - int i, key=0; - WINDOW *window; - struct disklabel *lbl = &disk_list[disk].lbl; - - if (use_shadow) - draw_shadow(stdscr, 1, 1, LINES-2, COLS-2); - window = newwin(LINES-2, COLS-2, 1, 1); - keypad(window, TRUE); - - draw_box(window, 1, 1, LINES - 2, COLS - 2, dialog_attr, border_attr); - wattrset(window, dialog_attr); - - mvwprintw(window, 2, 2, "Dumping label for disk %d, %s\n", disk, lbl->d_typename); - mvwprintw(window, 3, 2, "magic = %lu",lbl->d_magic); - mvwprintw(window, 3, 22, "type = %x",lbl->d_type); - mvwprintw(window, 3, 32, "subtype = %x\n",lbl->d_subtype); - mvwprintw(window, 4, 2, "Typename = %s",lbl->d_typename); - mvwprintw(window, 4, 38, "Packname = %s",lbl->d_packname); - mvwprintw(window, 5, 74, "boot0 = %s",lbl->d_boot0); - mvwprintw(window, 5, 50, "boot1 = %s\n",lbl->d_boot1); - mvwprintw(window, 5, 2, "secsize = %ld",lbl->d_secsize); - mvwprintw(window, 5, 20, "nsectors = %ld",lbl->d_nsectors); - mvwprintw(window, 5, 30, "ntracks = %ld",lbl->d_ntracks); - mvwprintw(window, 5, 50, "ncylinders = %ld\n",lbl->d_ncylinders); - mvwprintw(window, 6, 2, "secpercyl = %ld",lbl->d_secpercyl); - mvwprintw(window, 6, 40, "secperunit = %ld\n",lbl->d_secperunit); - mvwprintw(window, 7, 2, "sparespertrack = %d",lbl->d_sparespertrack); - mvwprintw(window, 7, 20, "sparespercyl = %d",lbl->d_sparespercyl); - mvwprintw(window, 7, 40, "acylinders = %ld\n",lbl->d_acylinders); - mvwprintw(window, 8, 2, "rpm = %d",lbl->d_rpm); - mvwprintw(window, 8, 20, "interleave = %d",lbl->d_interleave); - mvwprintw(window, 8, 40, "trackskew = %d",lbl->d_trackskew); - mvwprintw(window, 8, 60, "cylskew = %d\n",lbl->d_cylskew); - mvwprintw(window, 9, 2, "headswitch = %ld",lbl->d_headswitch); - mvwprintw(window, 9, 30, "trkseek = %ld",lbl->d_trkseek); - mvwprintw(window, 9, 55, "flags = %ld\n",lbl->d_flags); - mvwprintw(window, 10, 2, "Drivedata"); - for (i=0; i< NDDATA; i++) { - mvwprintw(window, 10, 11 + (i*10), " : %d = %ld",i,lbl->d_drivedata[i]); - } - mvwprintw(window, 11, 2, "Spare"); - for (i=0; i< NSPARE; i++) { - mvwprintw(window, 11, 7 + (i*10), " : %d = %ld",i,lbl->d_spare[i]); - } - mvwprintw(window, 12, 2, "magic2 = %lu",lbl->d_magic2); - mvwprintw(window, 12, 40, "checksum = %d\n",lbl->d_checksum); - mvwprintw(window, 13, 2, "npartitions = %d",lbl->d_npartitions); - mvwprintw(window, 13, 25, "bbsize = %lu",lbl->d_bbsize); - mvwprintw(window, 13, 50, "sbsize = %lu\n",lbl->d_sbsize); - for (i=0; i< MAXPARTITIONS; i++) { - mvwprintw(window, 14+i, 2, "%d: size: %ld",i,lbl->d_partitions[i].p_size); - mvwprintw(window, 14+i, 20, "offset: %ld",lbl->d_partitions[i].p_offset); - mvwprintw(window, 14+i, 36, "fsize: %ld",lbl->d_partitions[i].p_fsize); - mvwprintw(window, 14+i, 49, "fstype: %d",lbl->d_partitions[i].p_fstype); - mvwprintw(window, 14+i, 60, "frag: %d",lbl->d_partitions[i].p_frag); - mvwprintw(window, 14+i, 70, "cpg: %d",lbl->d_partitions[i].p_cpg); } - - dialog_update(); - - while (key != '\n' && key != ' ' && key != '\033') - key = wgetch(window); - delwin(window); - dialog_clear(); } diff --git a/sbin/sysinstall/main.c b/sbin/sysinstall/main.c index 91532d7..733a7ee 100644 --- a/sbin/sysinstall/main.c +++ b/sbin/sysinstall/main.c @@ -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.16 1994/11/17 19:44:49 ache Exp $ + * $Id: main.c,v 1.17.2.1 1994/11/21 03:12:06 phk Exp $ * */ @@ -36,8 +36,6 @@ jmp_buf jmp_restart; * XXX: mbr: edit geometry */ -extern int alloc_memory(); - void handle_intr(int sig) { @@ -79,9 +77,6 @@ main(int argc, char **argv) signal(SIGINT, handle_intr); - if (alloc_memory() < 0) - Fatal("No memory\n"); - if (getpid() != 1) { stage0(); stage1(); diff --git a/sbin/sysinstall/mbr.c b/sbin/sysinstall/mbr.c index d1e201b..750b731 100644 --- a/sbin/sysinstall/mbr.c +++ b/sbin/sysinstall/mbr.c @@ -16,7 +16,6 @@ #include <unistd.h> #include <dialog.h> #include <fcntl.h> -#include <fstab.h> #ifdef __i386__ /* temp measure delete nov 15 1994 */ #define i386 1 @@ -24,26 +23,47 @@ #warning FOO #endif #include <sys/types.h> -#include <sys/devconf.h> #include <sys/disklabel.h> #include <sys/uio.h> -#include "sysinstall.h" -#include "disk.h" -#include "editor.h" #include "mbr.h" +#include "sysinstall.h" + +extern struct mbr *mbr; +extern int inst_part; +extern int whole_disk; -char *part_type(int); -int write_mbr(char *, struct mbr *); -int read_mbr(char *, struct mbr *); -void show_mbr(struct mbr *); -int clear_mbr(struct mbr *, char *); -int build_mbr(struct mbr *, char *, struct disklabel *); -extern char boot1[]; -extern struct disk disk_list[]; +/* + * Guess what ? This is bteasy-1.4... didn't used to look this way, did it ? + * Written by Serge Vakulenko, <vak@kiae.su> + */ +static unsigned char bootcode[] = { +51,192,142,192,142,216,250,142,208,188,0,124,251,252,139,244,191,0,6,185,0, +1,242,165,234,99,6,0,0,139,213,88,162,72,7,60,53,116,29,180,16,246,228,5, +174,4,139,240, 246,68,4,255,116,55,198,4,128,232,215,0,138,116,1,139,76, +2,235,8,232,204,0,185,1,0,50,209,187,0,124,184,1,2,205,19,114,23,129,191, +254,1,85,170,117,15,234,0,124,0,0,139,234,66,128,242,179,136,22,58,7,191, +190,7,185,4,0,198,6,45,7,49,50,246,136,45,138,69,4,60,0,116,37,60,5,116, +33,254,198,190,42,7,232,117,0,190,72,7,70,70,139,28,10,255,116,7,58,125,4, +117,243,50,255,141,183,116,7,232,92,0,131,199,16,254,6,45,7,226,201,128,62, +117,4,2,116,11,190,59,7,10,246,117,10,205,24,235,170,190,42,7,232,59,0,232, +56,0,50,228,205,26,139,218,131,195,96,180,1,205,22,117,13,50,228,205,26,59, +211,114,242,160,72,7,235,12,50,228,205,22,138,196,60,28,116,241,4,246,60, +49,114,212,60,53,119,208,80,190,40,7,187,29,6,83,252,172,80,36,127,180,14, +205,16,88,168,128,116,242,195,86,184,1,3,187,0,6,185,1,0,50,246,205,19,94, +198,6,72,7,63,195,13,138,13,10,70,48,32,46,32,46,32,46,160,100,105,115,107, +32,49,13,10,10,68,101,102,97,117,108,116,58,32,70,63,160,0,1,0,4,0,6,3,7,7, +8,10,9,13,10,16,99,20,100,20,101,26,128,26,129,31,130,36,147,42,165,49,159, +53,117,57,82,57,219,60,242,66,0,100,111,243,104,112,102,243,102,115,32,97, +105,248,111,115,178,117,110,105,248,110,111,118,101,108,236,109,105,110, +105,248,108,105,110,117,248,97,109,111,101,98,225,70,114,101,101,66,83,196, +98,115,100,233,112,99,105,248,99,112,237,100,111,115,115,101,227,63,191,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,85,170 +}; + struct part_type part_types[] = PARTITION_TYPES -struct field *last_field; char * part_type(int type) @@ -61,396 +81,443 @@ part_type(int type) return("Unknown"); } -int -read_mbr(char *device, struct mbr *mbr) +void +read_dospart(int fd, struct dos_partition *dp) { - int fd; + u_char buf[512]; + if (lseek(fd, 0, SEEK_SET) == -1) + AskAbort("Couldn't seek for master boot record read\n"); + if (read(fd, buf, 512) != 512) { + AskAbort("Failed to read master boot record\n"); + } + memcpy(dp, buf+DOSPARTOFF, sizeof(*dp)*NDOSPART); +} - if ((fd = open(device, O_RDONLY)) == -1) { - sprintf(errmsg, - "Couldn't open device %s to read master boot record\n", - device); - return(-1); - } +void +write_dospart(int fd, struct dos_partition *dp) +{ + u_char buf[512]; - if (lseek(fd, 0, SEEK_SET) == -1) { - sprintf(errmsg, - "Couldn't seek to track 0 of device %s to read master boot record\n", - device); - return(-1); - } + if (lseek(fd, 0, SEEK_SET) == -1) + AskAbort("Couldn't seek for master boot record read\n"); + if (read(fd, buf, 512) != 512) { + AskAbort("Failed to read master boot record\n"); + } + memcpy(buf+DOSPARTOFF, dp, sizeof(*dp)*NDOSPART); + buf[510] = 0x55; + buf[511] = 0xaa; + if (lseek(fd, 0, SEEK_SET) == -1) + AskAbort("Couldn't seek for master boot record write\n"); + enable_label(fd); + if (write(fd, buf, 512) != 512) + AskAbort("Failed to write master boot record\n"); + disable_label(fd); +} - if (read(fd, &(mbr->bootcode), MBRSIZE) == -1) { - sprintf(errmsg, "Failed to read master boot record from device %s\n", - device); - return(-1); - } +void +write_bootcode(int fd) +{ + u_char buf[512]; - if (close(fd) == -1) { - sprintf(errmsg, - "Couldn't close device %s after reading master boot record\n", - device); - return(-1); - } - return(0); + if (lseek(fd, 0, SEEK_SET) == -1) + AskAbort("Couldn't seek for master boot record read\n"); + if (read(fd, buf, 512) != 512) { + AskAbort("Failed to read master boot record\n"); + } + memcpy(buf, bootcode, DOSPARTOFF); + buf[510] = 0x55; + buf[511] = 0xaa; + if (lseek(fd, 0, SEEK_SET) == -1) + AskAbort("Couldn't seek for master boot record write\n"); + enable_label(fd); + if (write(fd, buf, 512) != 512) + AskAbort("Failed to write master boot record\n"); + disable_label(fd); } int -write_mbr(char *device, struct mbr *mbr) +WriteBootblock(int dfd,struct disklabel *label,struct dos_partition *dospart) { - int fd; + int fd; + off_t of = label->d_partitions[OURPART].p_offset; + u_char bootblocks[BBSIZE]; - if ((fd = open(device, O_WRONLY)) == -1) { - sprintf(errmsg, - "Couldn't open device %s to write master boot record\n", - device); - return(-1); - } + Debug("Loading boot code from %s", BOOT1); - if (lseek(fd, 0, SEEK_SET) == -1) { - sprintf(errmsg, - "Couldn't seek to track 0 of device %s to write master boot record\n", - device); - return(-1); - } - - if (enable_label(fd) == -1) { - sprintf(errmsg, - "Couldn't write enable MBR area of device %s\n", - device); - return(-1); - } + fd = open(BOOT1, O_RDONLY); + if (fd < 0) + Fatal("Couldn't open boot file %s\n", BOOT1); - if (write(fd, mbr->bootcode, MBRSIZE) == -1) { - sprintf(errmsg, "Failed to write master boot record to device %s\n", - device); - return(-1); - } + if (read(fd, bootblocks, MBRSIZE) < 0) + Fatal("Couldn't read from boot file %s\n", BOOT1); - if (disable_label(fd) == -1) { - sprintf(errmsg, - "Couldn't write disable MBR area of device %s\n", - device); - return(-1); - } + if (close(fd) == -1) + Fatal("Couldn't close boot file %s\n", BOOT1); - if (close(fd) == -1) { - sprintf(errmsg, - "Couldn't close device %s after reading master boot record\n", - device); - return(-1); - } + Debug("Loading boot code from %s", BOOT2); - return(0); -} + fd = open(BOOT2, O_RDONLY); + if (fd < 0) + Fatal("Couldn't open boot file %s", BOOT2); -int -clear_mbr(struct mbr *mbr, char *bootcode) -{ - int i; - int fd; - - /* - * 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); - } - - if (close(fd) == -1) { - sprintf(errmsg, "Couldn't close boot file %s\n", bootcode); - return(-1); - } - - /* 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; - } + if (read(fd, &bootblocks[MBRSIZE], (int)(label->d_bbsize - MBRSIZE)) < 0) + Fatal("Couldn't read from boot file %s\n", BOOT2); - mbr->magic = MBR_MAGIC; - - dialog_clear(); - return(0); -} + if (close(fd) == -1) + Fatal("Couldn't close boot file %s", BOOT2); -int -dedicated_mbr(struct mbr *mbr, char *bootcode, struct disklabel *lbl) -{ - struct dos_partition *dp = &mbr->dospart[0]; - - if (clear_mbr(mbr, bootcode) == -1) - return(-1); - dp->dp_scyl = 0; - dp->dp_shd = 1; - dp->dp_ssect = 1; - dp->dp_ecyl = lbl->d_ncylinders - 1; - dp->dp_ehd = lbl->d_ntracks - 1; - dp->dp_esect = lbl->d_nsectors; - dp->dp_start = (dp->dp_scyl * lbl->d_ntracks * lbl->d_nsectors) + - (dp->dp_shd * lbl->d_nsectors) + - dp->dp_ssect - 1; - dp->dp_size = - (lbl->d_nsectors * lbl->d_ntracks * lbl->d_ncylinders) - dp->dp_start; - - dp->dp_typ = MBR_PTYPE_FreeBSD; - dp->dp_flag = ACTIVE; + bcopy(dospart, &bootblocks[DOSPARTOFF], + sizeof(struct dos_partition) * NDOSPART); - return(0); -} + label->d_checksum = 0; + label->d_checksum = dkcksum(label); + bcopy(label, &bootblocks[(LABELSECTOR * label->d_secsize) + LABELOFFSET], + sizeof *label); -int -get_geom_values(int disk) -{ - WINDOW *window; - struct disklabel *lbl = &disk_list[disk].lbl; - int key = 0; - int cur_field = 0; - int next = 0; - int done=0; - - struct field field[] = { -{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(14, 40, 5, 20))) { - sprintf(errmsg, "Failed to open window for geometry editor"); - return (-1); - }; - - keypad(window, TRUE); - - dialog_clear_norefresh(); - draw_box(window, 0, 0, 14, 40, dialog_attr, border_attr); - - 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)); - 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; - } + Debug("Seeking to byte %ld ", of * label->d_secsize); - next = change_field(field[cur_field], key); - if (next == -1) - beep(); - else - cur_field = next; + if (lseek(dfd, (of * label->d_secsize), SEEK_SET) < 0) { + Fatal("Couldn't seek to start of partition\n"); + } - lbl->d_ncylinders = atoi(field[0].field); - lbl->d_ntracks = atoi(field[1].field); - lbl->d_nsectors = atoi(field[2].field); - } + enable_label(dfd); - delwin(window); - refresh(); - 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); } -int -edit_mbr(int disk) +static int +FillIn(struct dos_partition *dp, int sec, int hd) { - WINDOW *window; - int cur_field; - int i; - int ok; - int next; - int key = 0; - struct mbr *mbr = &disk_list[disk].mbr; - - /* Confirm disk parameters */ -#ifdef 0 - 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) + u_long l2,l3=0,sect,c,s,h; + + sect = dp->dp_start; + l2 = sect / (sec*hd); + sect -= l2*sec*hd; + if(l2>1023) l2 = 1023; + c = (l2 & 0xff); + s = (l2 >> 2) & 0xc0; + l2 = sect / sec; + h = l2; + sect -= l2*sec; + s |= (sect+1) & 0x3f; +#define NIC(a,b) if (a != b) {a = b; l3++;} + NIC(dp->dp_ssect, s); + NIC(dp->dp_scyl, c); + NIC(dp->dp_shd, h); + + sect = dp->dp_start + dp->dp_size-1; + l2 = sect / (sec*hd); + sect -= l2*sec*hd; + if(l2>1023) l2 = 1023; + c = (l2 & 0xff); + s = (l2 >> 2) & 0xc0; + l2 = sect / sec; + h = l2; + sect -= l2*sec; + s |= (sect+1) & 0x3f; + NIC(dp->dp_esect, s); + NIC(dp->dp_ecyl, c); + NIC(dp->dp_ehd, h); +#undef NIC + return l2; +} + +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; + int changed = 0; + char *grumble = NULL; + + *buf = 0; + i = AskEm(stdscr, "Enter number of disk to Fdisk> ", buf, 2); + 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; + 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, + "Disk: %s Geometry: %lu Cyl * %lu Hd * %lu Sect", + Dname[diskno], cyl, hd, sec); + printw(" = %luMb = %lu Sect", (tsec+1024)/2048, tsec); + j++; + for(i=0;i<NDOSPART;i++, j+=4) { + 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 (get_geom_values(disk) == -1) - return(-1); - - /* Read MBR from disk */ - - sprintf(scratch, "/dev/r%s%dd", disk_list[disk].devconf->dc_name, - disk_list[disk].devconf->dc_unit); - if (read_mbr(scratch, &disk_list[disk].mbr) == -1) { - sprintf(scratch, "The following error occured while trying\nto read the master boot record:\n\n%s\nIn order to install FreeBSD a new master boot record\nwill have to be written which will mean all current\ndata on the hard disk will be lost.", errmsg); - ok = 0; - while (!ok) { - AskAbort(scratch); - if (!dialog_yesno(TITLE, - "\nAre you sure you wish to proceed ?\n", - -1, -1)) { - dialog_clear(); - if (dedicated_mbr(mbr, boot1, &disk_list[disk].lbl) == -1) { - sprintf(scratch, "\nCouldn't create new master boot record.\n\n%s", errmsg); - return(-1); - } - ok = 1; - } + 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); } + } } - - 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, "\nCouldn't dedicate disk to FreeBSD.\n\n %s", errmsg); - return(-1); - } - - if (!(window = newwin(LINES, COLS, 0, 0))) { - sprintf(errmsg, "Failed to open window for MBR editor\n"); - return (-1); - }; - - keypad(window, TRUE); - - dialog_clear_norefresh(); - draw_box(window, 0, 0, LINES, COLS, dialog_attr, border_attr); - - cur_field = 1; - ok = 0; - while (!ok && (key != ESC)) { - for (i=0; i < NDOSPART; i++) { - sprintf(mbr_field[(i*12)+1].field, "%d", mbr->dospart[i].dp_typ); - sprintf(mbr_field[(i*12)+2].field, "%ld", mbr->dospart[i].dp_start); - sprintf(mbr_field[(i*12)+3].field, "%d", mbr->dospart[i].dp_scyl); - sprintf(mbr_field[(i*12)+4].field, "%d", mbr->dospart[i].dp_shd); - sprintf(mbr_field[(i*12)+5].field, "%d", mbr->dospart[i].dp_ssect); - sprintf(mbr_field[(i*12)+6].field, "%d", 0); - sprintf(mbr_field[(i*12)+7].field, "%d", mbr->dospart[i].dp_ecyl); - sprintf(mbr_field[(i*12)+8].field, "%d", mbr->dospart[i].dp_ehd); - sprintf(mbr_field[(i*12)+9].field, "%d", mbr->dospart[i].dp_esect); - sprintf(mbr_field[(i*12)+10].field, "%ld", mbr->dospart[i].dp_size); - sprintf(mbr_field[(i*12)+11].field, "%d", sectstoMb(mbr->dospart[i].dp_size, 512)); - sprintf(mbr_field[(i*12)+12].field, "%d", mbr->dospart[i].dp_flag); - } - - disp_fields(window, mbr_field, sizeof(mbr_field)/sizeof(struct field)); - switch (mbr_field[cur_field].type) { - case F_EDIT: - 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_typ = atoi(mbr_field[(i*12)+1].field); - 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); - } - 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(); + mvprintw(20, 0, "Commands available: "); + mvprintw(21, 0, "(H)elp (T)utorial (D)elete (E)dit (R)eread (W)rite MBR (Q)uit"); + mvprintw(22, 0, "(U)se entire disk for FreeBSD (G)eometry Write MBR (B)ootcode"); + if (grumble) { + standout(); + mvprintw(24, 0, grumble); + standend(); + grumble = NULL; + } else if (changed) { + standout(); + mvprintw(24, 0, "Use (W)rite to save changes to disk"); + standend(); + } + mvprintw(23, 0, "Enter Command> "); + i=getch(); + switch(i) { + + case 'h': case 'H': + clear(); + mvprintw(0, 0, +"%s -- Diskspace editor -- FDISK -- Command Help + +Basic commands: + +(H)elp - This screen +(T)utorial - A more detailed discussion of MBR's, disklabels, etc. +(D)elete - Delete an existing partition +(E)dit - Edit an existing partition +(R)eread - Read fdisk information from disk again, abandoning changes +(W)rite MBR - Write modified fdisk information to disk +(Q)uit - Exit the FDISK editor + +Advanced commands: + +(U)se entire disk for FreeBSD - Assign ALL disk space on current drive +(G)eometry - Edit the default disk geometry settings +Write MBR (B)ootcode - Install multi-OS bootmanager. + + +Press any key to return to FDISK editor... +", TITLE); + getch(); + break; + case 't': case 'T': + ShowFile(HELPME_FILE,"Help file for disklayout"); + break; + + case 'r': case 'R': + read_dospart(Dfd[diskno], dp); + changed=0; + break; + + case 'b': case 'B': + write_bootcode(Dfd[diskno]); + grumble = "Wrote boot manager"; + break; + + case 'e': case 'E': + *buf = 0; + i = AskEm(stdscr, "Edit which Slice> ", buf, 2); + 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 - cur_field = next; - } - - /* Clear active flags */ - for (i=0; i < NDOSPART; i++) - mbr->dospart[i].dp_flag = 0; - - /* Find first FreeBSD partition and make it active */ - - 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; - mbr->dospart[i].dp_flag = ACTIVE; - break; - } - - 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, "\nThe following error occured while trying to write the new MBR.\n\n%s", errmsg); - return(-1); + 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; + changed=1; + dp[l-1].dp_start=l1; + dp[l-1].dp_size=l3; + FillIn(&dp[l-1],sec,hd); + + 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); + if(dp[l-1].dp_flag) + for(i=0;i<NDOSPART;i++) + if(i != (l-1)) + dp[i].dp_flag = 0; + break; + + case 'u': case 'U': + memset(&dp[0], 0, sizeof dp); + changed=1; + + dp[0].dp_start = 0; + dp[0].dp_size = tsec; + FillIn(&dp[0],sec,hd); + + dp[0].dp_typ = MBR_PTYPE_FreeBSD; + dp[0].dp_flag = 0x80; + break; + + case 'g': case 'G': + sprintf(buf,"%lu",sec); + i = AskEm(stdscr, "Number of Sectors> ",buf,7); + l2 = strtoul(buf,0,0); + if(l2 != sec) + changed++; + sec=l2; + sprintf(buf,"%lu",hd); + i = AskEm(stdscr, "Number of Heads> ",buf,7); + l2 = strtoul(buf,0,0); + if(l2 != hd) + changed++; + hd=l2; + cyl = tsec/(hd*sec); + sprintf(buf,"%lu",cyl); + i = AskEm(stdscr, "Number of Cylinders> ",buf,7); + l2 = strtoul(buf,0,0); + if(l2 != cyl) + changed++; + cyl=l2; + + for (l=0;l<NDOSPART;l++) { + if (!dp[l].dp_typ || !dp[l].dp_size) + continue; + changed += FillIn(&dp[l], sec, hd); + } + + break; + + case 'd': case 'D': + *buf = 0; + i = AskEm(stdscr, "Delete which Slice> ", buf, 2); + 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]); + changed=1; + break; + + case 'w': case 'W': + strcpy(buf, "N"); + i = AskEm(stdscr, "Confirm write> ", buf, 2); + 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_ntracks = hd; + Dlbl[diskno]->d_nsectors = sec; + Dlbl[diskno]->d_ncylinders = cyl; + Dlbl[diskno]->d_secpercyl = hd*sec; + 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) + AskAbort("Couldn't set label: %s", strerror(errno)); + if(ioctl(Dfd[diskno], DIOCWDINFO, Dlbl[diskno]) == -1) + AskAbort("Couldn't write label: %s", strerror(errno)); + flag=0; + disable_label(Dfd[diskno]); + changed=0; + + if (Dlbl[diskno]->d_partitions[OURPART].p_size) { + WriteBootblock(Dfd[diskno], lbl, dp); + grumble = "Wrote MBR and disklabel to disk"; + } else { + grumble = "Wrote MBR to disk"; + } + + break; + + case 'q': case 'Q': + return; + break; + default: + beep(); + 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/mbr.h b/sbin/sysinstall/mbr.h index be08380..db9edc7 100644 --- a/sbin/sysinstall/mbr.h +++ b/sbin/sysinstall/mbr.h @@ -1,109 +1,80 @@ -struct field mbr_field[] = { - { 0, 25, 31, -1, -1, -1, -1, -1, -1, "Master Boot Record (MBR) editor", F_TITLE, 0, 0}, - { 4, 8, 5, 5, 2, 49, 2, 50, 2, "000", 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, 7, 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, 5, 5, 14, 50, 14, 12, 14, "000", 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, 7, 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, 5, 5, 26, 12, 26, 24, 26, "000", 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, 7, 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, 5, 5, 38, 24, 38, 36, 38, "000", 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, 7, 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} +/* + * Copyright (c) 1994, Paul Richards. + * + * All rights reserved. + * + * This software may be used, modified, copied, distributed, and + * sold, in both source and binary form provided that the above + * copyright and these terms are retained, verbatim, as the first + * lines of this file. Under no circumstances is the author + * responsible for the proper functioning of this software, nor does + * the author assume any responsibility for damages incurred with + * its use. + */ + +#define MBRSIZE 512 +#define MBR_MAGIC 0xAA55 +#define ACTIVE 0x80 + +struct mbr +{ + unsigned char bootcode[DOSPARTOFF]; + struct dos_partition dospart[4]; + unsigned short magic; }; + +struct part_type +{ + unsigned char type; + char *name; +}; + +#define PARTITION_TYPES \ +{ \ + {0x00, "Unused"} \ + ,{0x01, "Primary DOS with 12 bit FAT"} \ + ,{0x02, "XENIX / filesystem"} \ + ,{0x03, "XENIX /usr filesystem"} \ + ,{0x04, "Primary DOS with 16 bit FAT"} \ + ,{0x05, "Extended DOS"} \ + ,{0x06, "Primary 'big' DOS (> 32MB)"} \ + ,{0x07, "OS/2 HPFS, QNX or Advanced UNIX"} \ + ,{0x08, "AIX filesystem"} \ + ,{0x09, "AIX boot partition or Coherent"} \ + ,{0x0A, "OS/2 Boot Manager or OPUS"} \ + ,{0x10, "OPUS"} \ + ,{0x40, "VENIX 286"} \ + ,{0x50, "DM"} \ + ,{0x51, "DM"} \ + ,{0x52, "CP/M or Microport SysV/AT"} \ + ,{0x56, "GB"} \ + ,{0x61, "Speed"} \ + ,{0x63, "ISC UNIX, other System V/386, GNU HURD or Mach"} \ + ,{0x64, "Novell Netware 2.xx"} \ + ,{0x65, "Novell Netware 3.xx"} \ + ,{0x75, "PCIX"} \ + ,{0x80, "Minix 1.1 ... 1.4a"} \ + ,{0x81, "Minix 1.4b ... 1.5.10"} \ + ,{0x82, "Linux"} \ + ,{0x93, "Amoeba filesystem"} \ + ,{0x94, "Amoeba bad block table"} \ + ,{0xA5, "FreeBSD/NetBSD/386BSD"} \ + ,{0xB7, "BSDI BSD/386 filesystem"} \ + ,{0xB8, "BSDI BSD/386 swap"} \ + ,{0xDB, "Concurrent CPM or C.DOS or CTOS"} \ + ,{0xE1, "Speed"} \ + ,{0xE3, "Speed"} \ + ,{0xE4, "Speed"} \ + ,{0xF1, "Speed"} \ + ,{0xF2, "DOS 3.3+ Secondary"} \ + ,{0xF4, "Speed"} \ + ,{0xFF, "BBT (Bad Blocks Table)"} \ +}; + +extern char *part_type(int); +extern int write_mbr(int, struct mbr *); +extern int read_mbr(int, struct mbr *); +extern void show_mbr(struct mbr *); +extern int clear_mbr(struct mbr *, char *); +extern void edit_mbr(struct mbr *, struct disklabel *); +extern int build_mbr(struct mbr *, char *, struct disklabel *); diff --git a/sbin/sysinstall/ourcurses.c b/sbin/sysinstall/ourcurses.c index f8f73b8..4ee3dec 100644 --- a/sbin/sysinstall/ourcurses.c +++ b/sbin/sysinstall/ourcurses.c @@ -17,6 +17,7 @@ AskEm(WINDOW *w,char *prompt, char *answer, int len) int x,y; mvwprintw(w,23,0,prompt); getyx(w,y,x); + wclrtoeol(w); return line_edit(w,y,x,len,len+1,item_selected_attr,1,answer); } diff --git a/sbin/sysinstall/stage0.c b/sbin/sysinstall/stage0.c index b973501..b38a8c3 100644 --- a/sbin/sysinstall/stage0.c +++ b/sbin/sysinstall/stage0.c @@ -28,16 +28,18 @@ static unsigned char *welcome[] = { "1. README", "READ THIS FIRST.", "2. Release Notes", - "Read the 2.0 Release Notes (recommended).", + "Read the 2.0 Release Notes (recommended).", "3. Troubleshooting", "Read this in case of trouble.", - "4. COPYRIGHT", + "4. Partitions and MBRs", + "Verbose description of how these work.", + "5. COPYRIGHT", "Read FreeBSD Copyright Information.", - "5. Install", + "6. Install", "Proceed with full installation.", - "6. Fixit", + "7. Fixit", "Repair existing installation (`fixit' mode).", - "7. Quit", + "8. Quit", "Don't do anything, just reboot.", }; @@ -46,7 +48,7 @@ stage0() { evil_goto: if (dialog_menu("Welcome to FreeBSD!", - "Use ALT-F2 and ALT-F1 to toggle between debugging\ninformation screen (ALT-F2) or this dialog screen (ALT-F1)\n\nPlease select one of the following options:", -1, -1, 7, 7, welcome, selection)) + "Use ALT-F2 and ALT-F1 to toggle between debugging\ninformation screen (ALT-F2) or this dialog screen (ALT-F1)\n\nPlease select one of the following options:", -1, -1, 8, 8, welcome, selection)) ExitSysinstall(); switch (atoi(selection)) { @@ -65,21 +67,39 @@ evil_goto: goto evil_goto; break; - case 4: /* View copyrights */ - ShowFile(COPYRIGHT_FILE, "COPYRIGHT"); + case 4: /* View DISK FAQ */ + ShowFile(HELPME_FILE, "DISK FAQ"); goto evil_goto; break; - case 5: /* Proceed (do nothing special, really) */ + case 5: /* View copyrights */ + ShowFile(COPYRIGHT_FILE, "COPYRIGHT"); + goto evil_goto; break; - case 6: - dialog_msgbox("Sorry!", "This feature is not currently implemented.", - -1, -1, 1); - goto evil_goto; + case 6: /* Proceed (do nothing special, really) */ + fixit = 0; break; case 7: + dialog_clear(); + dialog_update(); + dialog_msgbox("WARNING!", +"The usual install procedure will be invoked, but with most of the +sanity checks disabled. The suggested course of action is to: + 1. Go to (F)disk and do a (W)rite, and possibly a (B)oot too + if your MBR has been wiped. + 2. Go into (D)isklabel and identify your root (/) and swap + partitions. + 3. Select (P)roceed to reboot and load the cpio floppy. + 4. You will now be in the stand-alone shell, where you may + conduct further repairs with the tools you'll find in + /stand. + 5. Good luck... You'll probably need it.", -1, -1, 1); + fixit = 1; + break; + + case 8: /* Be neat.. */ ExitSysinstall(); break; /* hope not! :) */ diff --git a/sbin/sysinstall/stage1.c b/sbin/sysinstall/stage1.c index b094827..f778fca 100644 --- a/sbin/sysinstall/stage1.c +++ b/sbin/sysinstall/stage1.c @@ -1,4 +1,5 @@ /* +#define DEBUG * Copyright (c) 1994, Paul Richards. * * All rights reserved. @@ -12,14 +13,13 @@ * its use. */ -#define DKTYPENAMES +#include <dialog.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdarg.h> -#include <fstab.h> #include <sys/types.h> #include <sys/errno.h> @@ -27,223 +27,203 @@ #include <sys/ioctl.h> #include <sys/param.h> #include <sys/stat.h> -#include <sys/sysctl.h> -#include <sys/devconf.h> -#include <ufs/ffs/fs.h> -#include <machine/console.h> - -#include <dialog.h> -#include "disk.h" #include "sysinstall.h" -unsigned char **options; -unsigned char *scratch; -unsigned char *errmsg; -unsigned char *bootblocks; - -int dialog_active = 0; - -/* Forward decls */ -void exit_sysinstall(void); -void exit_prompt(void); -extern char *part_type(int); - -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]; - -int no_devices; -int no_disks; - -int -alloc_memory() -{ - int i; - - scratch = (char *) calloc(SCRATCHSIZE, sizeof(char)); - if (!scratch) - return(-1); - - errmsg = (char *) calloc(ERRMSGSIZE, sizeof(char)); - if (!errmsg) - return(-1); - - options = (unsigned char **)calloc(MAX_NO_DISKS, sizeof(char *)); - if (!options) - return(-1); - for (i = 0; i < MAX_NO_DISKS; i++) { - options[i] = (char *)calloc(100, sizeof(char)); - if (!options[i]) - return(-1); - } - - return(0); -} +char * device_list[] = {"wd","sd",0}; void -free_memory() +query_disks() { - int i; - - free(scratch); - free(errmsg); + int i,j; + char disk[15]; + char diskname[5]; + struct stat st; + struct disklabel dl; + int fd; + + 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; + } - for (i = 0; i < MAX_NO_DEVICES; i++) - free(device_list[i]); + Ndisk = 0; + + for (j = 0; device_list[j]; j++) { + for (i = 0; i < 10; i++) { + 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 -query_devices() +stage1() { - int i, j; - int size, osize; - int ndevs; - int mib[8]; - struct devconf *dev; - - mib[0] = CTL_HW; - mib[1] = HW_DEVCONF; - mib[2] = DEVCONF_NUMBER; - - size = sizeof ndevs; - if (sysctl(mib, 3, &ndevs, &size, 0, 0) < 0) { - sprintf(errmsg, "Couldn't get device info from kernel\n"); - return(-1); + int i,j; + int ret=1; + int ready = 0; + int foundroot=0,foundusr=0,foundswap=0; + char *complaint=0; + + query_disks(); + + while (!ready) { + clear(); standend(); + j = 2; + if (fixit) { + mvprintw(j++, 50, "|Suggested course of action:"); + mvprintw(j++, 50, "|"); + mvprintw(j++, 50, "|(F)disk, (W)rite"); + mvprintw(j++, 50, "|possibly (F)disk, (B)oot"); + mvprintw(j++, 50, "|(D)isklabel, (A)ssign <root>"); + mvprintw(j++, 50, "|(A)ssign swap"); + mvprintw(j++, 50, "|(P)roceed"); + mvprintw(j++, 50, "|Reboot"); + mvprintw(j++, 50, "|Load cpio floppy"); + mvprintw(j++, 50, "|Choose stand-alone shell"); + mvprintw(j++, 50, "|"); + mvprintw(j++, 50, "|Your old kernel, /etc/fstab"); + mvprintw(j++, 50, "|and /sbin/init files are"); + mvprintw(j++, 50, "|renamed since they will be"); + mvprintw(j++, 50, "|replaced from this floppy."); + } else { + mvprintw(j++, 50, "|You should now assign some"); + mvprintw(j++, 50, "|space to root, swap, and"); + mvprintw(j++, 50, "|(optionally) /usr partitions"); + mvprintw(j++, 50, "|Root (/) should be a minimum"); + mvprintw(j++, 50, "|of 18MB with a 30MB /usr"); + mvprintw(j++, 50, "|or 50MB without a /usr."); + mvprintw(j++, 50, "|Swap space should be a"); + mvprintw(j++, 50, "|minimum of 12MB or RAM * 2"); + mvprintw(j++, 50, "|Be sure to also (A)ssign a"); + mvprintw(j++, 50, "|mount point to each one or"); + mvprintw(j++, 50, "|it will NOT be enabled."); + mvprintw(j++, 50, "|"); + mvprintw(j++, 50, "|We suggest that you invoke"); + mvprintw(j++, 50, "|(F)disk, (W)rite the bootcode"); + mvprintw(j++, 50, "|then (D)isklabel your disk."); + mvprintw(j++, 50, "|If installing on a drive"); + mvprintw(j++, 50, "|other than 0, also read the"); + mvprintw(j++, 50, "|TROUBLESHOOTING doc first"); } - dev = 0; osize = 0; - - for (i=0; i <= ndevs; i++) { - mib[2] = i; - if (sysctl(mib, 3, 0, &size, 0, 0) < 0) - /* Probably deleted device */ - continue; - if (size > osize) { - dev = realloc(dev, size); - if (!dev) { - sprintf(errmsg, - "Couldn't allocate memory for device information\n"); - return(-1); - } - } - - osize = size; - - if (sysctl(mib, 3, dev, &size, 0, 0) < 0) { - sprintf(errmsg, "Error getting information on device %d\n", i); - return(-1); - } - - for (j=0; device_names[j]; j++) - if (!strcmp(device_names[j], dev->dc_name)) { - device_list[no_devices++] = dev; - dev = 0; osize = 0; - break; - } + j = 0; + mvprintw(j++, 0, "%s -- Diskspace editor", TITLE); + j++; + mvprintw(j++, 0, "Disks Total FreeBSD "); + j++; + for(i = 0; i < MAX_NO_DISKS && Dname[i]; i++) { + 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 Action Mountpoint"); + j++; + for(i = 0; i < MAX_NO_FS; i++) { + if(!Fname[i]) + continue; + if(!strcmp(Ftype[i],"swap")) { + mvprintw(j++, 0, "%2d: %-5s %-5s %5lu MB %-6s %-s", + i, Fname[i], Ftype[i], Fsize[i], "swap", Fmount[i]); + } else { + mvprintw(j++, 0, "%2d: %-5s %-5s %5lu MB %-6s %-s", + i, Fname[i], Ftype[i], Fsize[i], + Faction[i] ? "newfs" : "mount", Fmount[i]); + } } - return (0); -} - -int -configure_disks() -{ - char *disk_names[] = {"wd", "sd", 0}; - char diskname[20]; - int i, j; - int fd; - int valid=0; - int choice; - - /* Search for possible installation targets */ - no_disks = 0; - for (i=0; i < no_devices; i++) - for (j=0; disk_names[j]; j++) - if (!strcmp(disk_names[j], device_list[i]->dc_name)) { - /* Try getting drive info */ - sprintf(diskname, "/dev/r%s%dd", - device_list[i]->dc_name, - device_list[i]->dc_unit); - if ((fd = open(diskname, O_RDONLY)) == -1) - continue; - if (ioctl(fd, DIOCGDINFO, &disk_list[no_disks].lbl) == -1) { - close(fd); - continue; - } - disk_list[no_disks++].devconf = device_list[i]; - close(fd); - } - - do { - if (no_disks == 1) - sprintf(scratch,"There is %d disk available for installation: ", - no_disks); - else - sprintf(scratch,"There are %d disks available for installation: ", - no_disks); - - for (i = 0; i < no_disks; i++) { - sprintf(options[(i*2)], "%d",i+1); - sprintf(options[(i*2)+1], "%s%d: %s (%dMb)", - disk_list[i].devconf->dc_name, - disk_list[i].devconf->dc_unit, - disk_list[i].lbl.d_typename, - disk_size(&disk_list[i].lbl)); - } - - sprintf(options[no_disks*2], "%d", no_disks+1); - 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)) { - dialog_clear_norefresh(); - sprintf(scratch,"\nYou selected cancel.\n"); - AskAbort(scratch); - valid = 0; - continue; - } - choice = atoi(selection) - 1; - if (choice == no_disks) - valid = 1; - else { - 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) { - sprintf(scratch, "\nThe following error occured while\nediting the disklabel.\n%s", errmsg); - AskAbort(scratch); - valid = 0; - continue; - } - disk_list[choice].selected = 1; - } - } while (!valid); -} -int -stage1() -{ - int i, j; - - query_devices(); - configure_disks(); - /* 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]; - } + mvprintw(20, 0, "Commands available:"); + mvprintw(21, 0, "(H)elp (T)utorial (F)disk (D)isklabel (P)roceed (Q)uit"); + if(complaint) { + standout(); + mvprintw(22, 0, complaint); + standend(); + complaint = 0; } - return 0; + mvprintw(23, 0, "Enter Command> "); + i = getch(); + switch(i) { + case 'h': case 'H': + clear(); + mvprintw(0, 0, +"%s -- Diskspace editor -- Command Help + +(T)utorial - Read a more detailed tutorial on how disklabels, MBRs, + etc. work. +(P)roceed - Proceed with system installation. +(Q)uit - Don't install anything. +(F)disk - Enter the FDISK (MBR) editor. +(D)isklabel - Enter the disklabel editor. + +Press any key to return to Diskspace editor...", TITLE); + getch(); + break; + case 't': case 'T': + ShowFile(HELPME_FILE,"Help file for disklayout"); + break; + case 'p': case 'P': + foundroot=0,foundusr=0,foundswap=0; + for (i = 1; Fmount[i]; i++) { + if(!strcmp(Fmount[i],"/")) foundroot=i; + if(!strcmp(Fmount[i],"swap")) foundswap=i; + if(!strcmp(Fmount[i],"/usr")) foundusr=i; + } + if (!foundroot) { + complaint = "Please assign mountpoint for '/'"; + break; + } + if (!foundswap) { + complaint = "Please assign mountpoint for swap"; + break; + } + if (!fixit && !foundusr && Fsize[foundroot] < 60) { + complaint = "Please assign mountpoint for /usr"; + break; + } + if (dialog_yesno("Last Chance!", + "Are you sure you want to proceed with the installation?\nLast chance before wiping your hard disk!", -1, -1)) + break; + ret = 0; + goto leave; + case 'q': case 'Q': + ret = 1; + goto leave; + case 'f': case 'F': + Fdisk(); + query_disks(); + break; + case 'd': case 'D': + DiskLabel(); + break; + default: + beep(); + } + } +leave: + clear(); + for (i = 0; Dname[i]; i++) + close(Dfd[i]); + return ret; } + diff --git a/sbin/sysinstall/stage2.c b/sbin/sysinstall/stage2.c index 69c10f4..b58d402 100644 --- a/sbin/sysinstall/stage2.c +++ b/sbin/sysinstall/stage2.c @@ -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.17 1994/11/19 00:17:55 ache Exp $ + * $Id: stage2.c,v 1.16.2.1 1994/11/21 03:12:16 phk Exp $ * */ @@ -16,7 +16,7 @@ #include <stdarg.h> #include <string.h> #include <unistd.h> -#include <fstab.h> + #include <fcntl.h> #include <dialog.h> #include <errno.h> @@ -35,59 +35,50 @@ stage2() char dbuf[90]; FILE *f1; int i, j; - int fidx[MAX_NO_MOUNTS]; - struct fstab *fp; - if (dialog_yesno("Last Chance!", "Are you sure you want to proceed with the installation?\nLast chance before wiping your hard disk!", -1, -1)) - exit(0); + memset(Fsize, 0, sizeof Fsize); + /* Sort in mountpoint order */ - memset(fidx, 0, sizeof fidx); - - for (i = 0; i < no_mounts; i++) { - Debug("%d %s %s %s %s",i, - mounts[i]->fs_spec, - mounts[i]->fs_file, - mounts[i]->fs_vfstype, - mounts[i]->fs_mntops); - } + for (i = 1; Fname[i]; i++) + Fsize[i] = i; + Fsize[i] = 0; + for (j = 1; j;) - for (j = 0, i = 0; i < (no_mounts-1); i++) { - if (strcmp(mounts[i]->fs_file, mounts[i+1]->fs_file) > 0) { - fp = mounts[i]; - mounts[i] = mounts[i+1]; - mounts[i+1] = fp; - 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; } } - Debug("sorted by mountpoint"); - for (j = 0; j < no_mounts; j++) { - if (strcmp(mounts[j]->fs_vfstype, "ufs")) - continue; - if (!strcmp(mounts[j]->fs_mntops, "YES")) + + for (j = 1; Fsize[j]; j++) { + if (strcmp(Ftype[Fsize[j]], "ufs")) continue; - p = mounts[j]->fs_spec; - TellEm("newfs /dev/r%s",p); + p = Fname[Fsize[j]]; 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); + if (!Faction[Fsize[j]]) { + TellEm("fsck -y /dev/r%s",p); + i = exec(0, "/stand/fsck", "/stand/fsck", "-y", pbuf, 0); + if (i) + Fatal("Exec(/stand/fsck) failed, code=%d.",i); + } else { + TellEm("newfs /dev/r%s",p); + i = exec(0, "/stand/newfs", "/stand/newfs", "-n", "1", pbuf, 0); + if (i) + Fatal("Exec(/stand/newfs) failed, code=%d.",i); } + } - for (j = 0; j < no_mounts; j++) { - if (!strcmp(mounts[j]->fs_vfstype, "swap")) - break; - p = mounts[j]->fs_spec; - q = mounts[j]->fs_file; + for (j = 1; Fsize[j]; j++) { + if (strcmp(Ftype[Fsize[j]], "ufs")) + continue; strcpy(dbuf, "/mnt"); - if (strcmp(q, "/")) { - if (*q != '/') - strcat(dbuf, "/"); + p = Fname[Fsize[j]]; + q = Fmount[Fsize[j]]; + if (strcmp(q, "/")) strcat(dbuf, q); - } - Mkdir(dbuf); - if (strcmp(mounts[j]->fs_vfstype, "ufs")) - continue; MountUfs(p, dbuf, 1, 0); } @@ -98,6 +89,9 @@ stage2() TellEm("unzipping /stand/sysinstall onto hard disk"); exec(4, "/stand/gzip", "zcat", 0 ); +/* + CopyFile("/stand/sysinstall","/mnt/stand/sysinstall"); +*/ Link("/mnt/stand/sysinstall","/mnt/stand/cpio"); Link("/mnt/stand/sysinstall","/mnt/stand/bad144"); Link("/mnt/stand/sysinstall","/mnt/stand/gunzip"); @@ -107,6 +101,30 @@ stage2() Link("/mnt/stand/sysinstall","/mnt/stand/fsck"); Link("/mnt/stand/sysinstall","/mnt/stand/dialog"); + if (fixit) { + for (i=0;i<100;i++) { + sprintf(pbuf,"/mnt/etc/fstab.before.fixit.%d",i); + if (access(pbuf,R_OK)) { + rename("/mnt/etc/fstab",pbuf); + break; + } + } + for (i=0;i<100;i++) { + sprintf(pbuf,"/mnt/kernel.before.fixit.%d",i); + if (access(pbuf,R_OK)) { + rename("/mnt/kernel",pbuf); + break; + } + } + for (i=0;i<100;i++) { + sprintf(pbuf,"/mnt/sbin/init.before.fixit.%d",i); + if (access(pbuf,R_OK)) { + rename("/mnt/sbin/init",pbuf); + break; + } + } + } + CopyFile("/kernel","/mnt/kernel"); TellEm("make /dev entries"); chdir("/mnt/dev"); @@ -119,15 +137,12 @@ stage2() Fatal("Couldn't open /mnt/etc/fstab for writing."); TellEm("Writing filesystems"); - for (j = 0; j < no_mounts; j++) { - if (!strcmp(mounts[j]->fs_vfstype,"swap")) - fprintf(f1, "/dev/%s\t\tnone\tswap sw 0 0\n", - mounts[j]->fs_spec); + 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", - mounts[j]->fs_spec, - mounts[j]->fs_file, - mounts[j]->fs_vfstype); + Fname[Fsize[j]], Fmount[Fsize[j]], Ftype[Fsize[j]]); } TellEm("Writing procfs"); fprintf(f1,"proc\t\t/proc\tprocfs rw 0 0\n"); @@ -139,16 +154,19 @@ stage2() close(i); TellEm("Unmount disks"); - for (j = no_mounts-1; j >= 0; j--) { - if (strcmp(mounts[j]->fs_vfstype,"ufs")) + for (j = 1; Fsize[j]; j++) + continue; + + for (j--; j > 0; j--) { + if (!strcmp(Ftype[Fsize[j]],"swap")) continue; strcpy(dbuf,"/mnt"); - if (strcmp(mounts[j]->fs_file,"/")) - strcat(dbuf, mounts[j]->fs_file); + 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\nand hit return to reboot from the hard disk", -1, -1, 1); + dialog_msgbox(TITLE,"Remove the floppy from the drive\n and hit return to reboot from the hard disk", -1, -1, 1); dialog_clear(); } diff --git a/sbin/sysinstall/stage3.c b/sbin/sysinstall/stage3.c index 2121f3a..c08cccb 100644 --- a/sbin/sysinstall/stage3.c +++ b/sbin/sysinstall/stage3.c @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $Id: stage3.c,v 1.8 1994/11/08 13:40:01 phk Exp $ + * $Id: stage3.c,v 1.9.2.1 1994/11/21 03:12:18 phk Exp $ * */ @@ -65,7 +65,7 @@ stage3() TellEm("fsck -y %s",pbuf); if (exec(0, "/stand/fsck", "/stand/fsck", "-y", pbuf, 0) == -1) - Fatal(errmsg); + Fatal("exec(fsck) failed"); MountUfs(p, fs->fs_file, 0, mountflags); mountflags = 0; diff --git a/sbin/sysinstall/stage5.c b/sbin/sysinstall/stage5.c index 4f7efb8..520f299 100644 --- a/sbin/sysinstall/stage5.c +++ b/sbin/sysinstall/stage5.c @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $Id: stage5.c,v 1.15 1994/11/11 07:58:09 jkh Exp $ + * $Id: stage5.c,v 1.16.2.1 1994/11/21 03:12:20 phk Exp $ * */ @@ -36,15 +36,16 @@ stage5() { int exec_sh = 1; - if (!dialog_yesno("End of initial installation", msg, -1, -1)) - exec_sh = 0; - end_dialog(); - dialog_active=0; setenv("PATH","/stand",1); for(;;) { + exec_sh = dialog_yesno("End of initial installation", + msg, -1, -1); + end_dialog(); + dialog_active=0; if (exec_sh) exec (2,"/stand/sh","/stand/-sh", 0); else exec (3,"/stand/bininst","/stand/-bininst", 0); + dialog_active=1; } } diff --git a/sbin/sysinstall/sysinstall.h b/sbin/sysinstall/sysinstall.h index a14991a..54a5ff8 100644 --- a/sbin/sysinstall/sysinstall.h +++ b/sbin/sysinstall/sysinstall.h @@ -12,18 +12,16 @@ * its use. */ -#define TITLE "FreeBSD 2.0-BETA Installation" +#define TITLE "FreeBSD 2.0-RELEASE Installation" #define BOOT1 "/stand/sdboot" #define BOOT2 "/stand/bootsd" -#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 - +#define BBSIZE 8192 /* Actually in ufs/ffs/fs.h I think */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -38,9 +36,6 @@ #include <sys/dkbad.h> #include <sys/disklabel.h> -#define min(a,b) ((a) < (b) ? (a) : (b)) -#define max(a,b) ((a) > (b) ? (a) : (b)) - #define SCRATCHSIZE 1024 #define ERRMSGSIZE 256 #define DEFROOTSIZE 18 @@ -75,23 +70,22 @@ 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 int Faction[MAX_NO_FS+1]; EXTERN u_long Fsize[MAX_NO_FS+1]; EXTERN int dialog_active; EXTERN char selection[]; EXTERN int debug_fd; +EXTERN int dialog_active; +EXTERN int fixit; -EXTERN int no_mounts; -EXTERN struct fstab *mounts[MAX_NO_MOUNTS]; - +extern int no_disks; +extern int inst_disk; extern unsigned char *scratch; extern unsigned char *errmsg; - extern u_short dkcksum(struct disklabel *); /* utils.c */ -int strheight __P((const char *p)); -int strwidth __P((const char *p)); void Abort __P((void)); void ExitSysinstall __P((void)); void TellEm __P((char *fmt, ...)); @@ -108,6 +102,8 @@ void CopyFile __P((char *p1, char *p2)); u_long PartMb(struct disklabel *lbl,int part); char * SetMount __P((int disk, int part, char *path)); void CleanMount __P((int disk, int part)); +void enable_label __P((int fd)); +void disable_label __P((int fd)); /* exec.c */ int exec __P((int magic, char *cmd, char *args, ...)); @@ -141,11 +137,9 @@ int makedevs __P((void)); int AskEm __P((WINDOW *w,char *prompt, char *answer, int len)); void ShowFile __P((char *filename, char *header)); -/* label.c */ -int sectstoMb(int, int); -int Mb_to_cylbdry(int, struct disklabel *); -void default_disklabel(struct disklabel *, int, int); -int disk_size(struct disklabel *); - /* mbr.c */ -int edit_mbr(int); +int build_bootblocks __P((int dfd,struct disklabel *label,struct dos_partition *dospart)); +void Fdisk __P((void)); + +/* label.c */ +void DiskLabel __P((void)); diff --git a/sbin/sysinstall/utils.c b/sbin/sysinstall/utils.c index 1e87031..1b84950 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.31 1994/11/19 00:09:00 ache Exp $ + * $Id: utils.c,v 1.30.2.1 1994/11/21 03:12:24 phk Exp $ * */ @@ -99,19 +99,19 @@ AskAbort(char *fmt, ...) va_start(ap,fmt); vsnprintf(p, 2048, fmt, ap); va_end(ap); - strcat(p, "\nDo you wish to abort the installation?\n"); + strcat(p, "\n\nDo you wish to abort the installation?"); if (!dialog_yesno("Abort", p, -1, -1)) { dialog_clear_norefresh(); Abort(); - } else - dialog_clear(); + } + dialog_clear(); free(p); } void Abort() { - if (dialog_yesno("Exit sysinstall","\nAre you sure you want to quit?\n", + if (dialog_yesno("Exit sysinstall","\n\nAre you sure you want to quit?", -1, -1)) { dialog_clear(); return; @@ -223,6 +223,8 @@ void Link(char *from, char *to) { TellEm("ln %s %s", from, to); + if(fixit) + unlink(to); if (link(from, to) == -1) Fatal("Couldn't create link: %s -> %s\n", from, to); } @@ -264,3 +266,81 @@ 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]; + Faction[i] = 0; + 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"); + if(!fixit) + Faction[k] = 1; + break; + case FS_MSDOS: + Ftype[k] = StrAlloc("msdos"); + Faction[k] = 0; + break; + case FS_SWAP: + Ftype[k] = StrAlloc("swap"); + Faction[k] = 1; + 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; +} + +void +enable_label(int fd) +{ + int flag = 1; + if (ioctl(fd, DIOCWLABEL, &flag) < 0) + Fatal("ioctl(DIOCWLABEL,1) failed: %s",strerror(errno)); +} + +void +disable_label(int fd) +{ + int flag = 0; + if (ioctl(fd, DIOCWLABEL, &flag) < 0) + Fatal("ioctl(DIOCWLABEL,0) failed: %s",strerror(errno)); +} + |