1995-04-27 12:50:35 +00:00
/*
* The new sysinstall program .
*
* This is probably the last program in the ` sysinstall ' line - the next
* generation being essentially a complete rewrite .
*
1995-06-11 19:33:05 +00:00
* $ Id : install . c , v 1.70 .2 .41 1995 / 06 / 10 07 : 58 : 37 jkh Exp $
1995-04-27 12:50:35 +00:00
*
* Copyright ( c ) 1995
* Jordan Hubbard . All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
1995-05-30 08:29:07 +00:00
* notice , this list of conditions and the following disclaimer ,
* verbatim and that no modifications are made prior to this
1995-04-27 12:50:35 +00:00
* point in the file .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement :
* This product includes software developed by Jordan Hubbard
* for the FreeBSD Project .
* 4. The name of Jordan Hubbard or the FreeBSD project may not be used to
* endorse or promote products derived from this software without specific
* prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ` ` AS IS ' ' AND
* ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE
* FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES ; LOSS OF USE , DATA , LIFE OR PROFITS ; OR BUSINESS INTERRUPTION )
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
* LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE .
*
*/
# include "sysinstall.h"
1995-05-08 06:06:30 +00:00
# include <sys/disklabel.h>
# include <sys/errno.h>
1995-05-25 18:48:33 +00:00
# include <sys/ioctl.h>
1995-05-08 06:06:30 +00:00
# include <sys/fcntl.h>
1995-05-20 10:33:14 +00:00
# include <sys/wait.h>
1995-05-08 06:06:30 +00:00
# include <unistd.h>
1995-04-27 12:50:35 +00:00
1995-06-11 19:33:05 +00:00
Boolean SystemWasInstalled = FALSE ;
1995-05-04 23:36:23 +00:00
1995-06-11 19:33:05 +00:00
static Boolean make_filesystems ( void ) ;
static Boolean copy_self ( void ) ;
static Boolean root_extract ( void ) ;
1995-05-16 02:53:31 +00:00
1995-05-22 14:10:25 +00:00
static Chunk * rootdev ;
static Boolean
checkLabels ( void )
{
Device * * devs ;
Disk * disk ;
1995-06-11 19:33:05 +00:00
Chunk * c1 , * c2 , * swapdev , * usrdev ;
1995-05-22 14:10:25 +00:00
int i ;
1995-06-11 19:33:05 +00:00
rootdev = swapdev = usrdev = NULL ;
1995-05-22 14:10:25 +00:00
devs = deviceFind ( NULL , DEVICE_TYPE_DISK ) ;
/* First verify that we have a root device */
for ( i = 0 ; devs [ i ] ; i + + ) {
if ( ! devs [ i ] - > enabled )
continue ;
disk = ( Disk * ) devs [ i ] - > private ;
msgDebug ( " Scanning disk %s for root filesystem \n " , disk - > name ) ;
if ( ! disk - > chunks )
msgFatal ( " No chunk list found for %s! " , disk - > name ) ;
for ( c1 = disk - > chunks - > part ; c1 ; c1 = c1 - > next ) {
if ( c1 - > type = = freebsd ) {
for ( c2 = c1 - > part ; c2 ; c2 = c2 - > next ) {
1995-06-11 19:33:05 +00:00
if ( c2 - > type = = part & & c2 - > subtype ! = FS_SWAP & & c2 - > private ) {
if ( c2 - > flags & CHUNK_IS_ROOT ) {
if ( rootdev ) {
msgConfirm ( " WARNING: You have more than one root device set?! \n Using the first one found. " ) ;
continue ;
}
rootdev = c2 ;
}
else if ( ! strcmp ( ( ( PartInfo * ) c2 - > private ) - > mountpoint , " /usr " ) ) {
if ( usrdev ) {
msgConfirm ( " WARNING: You have more than one /usr filesystem. \n Using the first one found. " ) ;
continue ;
}
usrdev = c2 ;
}
1995-05-22 14:10:25 +00:00
}
}
}
}
}
1995-05-23 02:41:18 +00:00
/* Now check for swap devices */
1995-05-22 14:10:25 +00:00
for ( i = 0 ; devs [ i ] ; i + + ) {
disk = ( Disk * ) devs [ i ] - > private ;
msgDebug ( " Scanning disk %s for swap partitions \n " , disk - > name ) ;
if ( ! disk - > chunks )
msgFatal ( " No chunk list found for %s! " , disk - > name ) ;
for ( c1 = disk - > chunks - > part ; c1 ; c1 = c1 - > next ) {
if ( c1 - > type = = freebsd ) {
for ( c2 = c1 - > part ; c2 ; c2 = c2 - > next ) {
if ( c2 - > type = = part & & c2 - > subtype = = FS_SWAP ) {
swapdev = c2 ;
break ;
}
}
}
}
}
if ( ! rootdev ) {
msgConfirm ( " No root device found - you must label a partition as / \n in the label editor. " ) ;
return FALSE ;
}
1995-05-28 23:12:09 +00:00
else if ( rootdev - > name [ strlen ( rootdev - > name ) - 1 ] ! = ' a ' ) {
msgConfirm ( " Invalid placement of root partition. For now, we only support \n mounting root partitions on \" a \" partitions due to limitations \n in the FreeBSD boot block code. Please correct this and \n try again. " ) ;
return FALSE ;
}
1995-05-22 14:10:25 +00:00
if ( ! swapdev ) {
msgConfirm ( " No swap devices found - you must create at least one \n swap partition. " ) ;
return FALSE ;
}
1995-06-11 19:33:05 +00:00
if ( ! usrdev )
msgConfirm ( " WARNING: No /usr filesystem found. This is not technically \n an error if your root filesystem is big enough (or you later \n intend to get your /usr filesystem over NFS), but it may otherwise \n cause you trouble and is not recommended procedure! " ) ;
1995-05-22 14:10:25 +00:00
return TRUE ;
}
1995-05-25 01:22:20 +00:00
static Boolean
1995-05-20 00:13:14 +00:00
installInitial ( void )
1995-05-18 09:02:06 +00:00
{
extern u_char boot1 [ ] , boot2 [ ] ;
extern u_char mbr [ ] , bteasy17 [ ] ;
u_char * mbrContents ;
Device * * devs ;
int i ;
1995-05-20 00:13:14 +00:00
static Boolean alreadyDone = FALSE ;
if ( alreadyDone )
1995-05-25 01:22:20 +00:00
return TRUE ;
1995-05-18 09:02:06 +00:00
1995-05-21 15:40:54 +00:00
if ( ! getenv ( DISK_PARTITIONED ) ) {
msgConfirm ( " You need to partition your disk before you can proceed with \n the installation. " ) ;
1995-05-25 01:22:20 +00:00
return FALSE ;
1995-05-21 15:40:54 +00:00
}
if ( ! getenv ( DISK_LABELLED ) ) {
msgConfirm ( " You need to assign disk labels before you can proceed with \n the installation. " ) ;
1995-05-25 01:22:20 +00:00
return FALSE ;
1995-05-21 15:40:54 +00:00
}
1995-05-22 14:10:25 +00:00
if ( ! checkLabels ( ) )
1995-05-25 01:22:20 +00:00
return FALSE ;
1995-05-21 15:40:54 +00:00
/* Figure out what kind of MBR the user wants */
1995-06-11 19:33:05 +00:00
if ( ! dmenuOpenSimple ( & MenuMBRType ) )
return FALSE ;
switch ( BootMgr ) {
case 0 :
mbrContents = bteasy17 ;
break ;
case 1 :
mbrContents = mbr ;
break ;
case 2 :
default :
mbrContents = NULL ;
1995-05-20 20:30:12 +00:00
}
1995-05-21 15:40:54 +00:00
/* If we refuse to proceed, bail. */
if ( msgYesNo ( " Last Chance! Are you SURE you want continue the installation? \n \n If you're running this on an existing system, we STRONGLY \n encourage you to make proper backups before proceeding. \n We take no responsibility for lost disk contents! " ) )
1995-05-25 01:22:20 +00:00
return FALSE ;
1995-05-16 11:37:27 +00:00
devs = deviceFind ( NULL , DEVICE_TYPE_DISK ) ;
for ( i = 0 ; devs [ i ] ; i + + ) {
1995-05-18 09:02:06 +00:00
Chunk * c1 ;
1995-05-22 14:10:25 +00:00
Disk * d = ( Disk * ) devs [ i ] - > private ;
1995-05-16 11:37:27 +00:00
1995-05-18 18:02:31 +00:00
if ( ! devs [ i ] - > enabled )
continue ;
1995-05-16 02:53:31 +00:00
if ( mbrContents ) {
1995-05-16 11:37:27 +00:00
Set_Boot_Mgr ( d , mbrContents ) ;
1995-05-16 02:53:31 +00:00
mbrContents = NULL ;
}
1995-05-16 11:37:27 +00:00
Set_Boot_Blocks ( d , boot1 , boot2 ) ;
msgNotify ( " Writing partition information to drive %s " , d - > name ) ;
Write_Disk ( d ) ;
1995-05-18 09:02:06 +00:00
/* Now scan for bad blocks, if necessary */
1995-05-18 21:58:33 +00:00
for ( c1 = d - > chunks - > part ; c1 ; c1 = c1 - > next ) {
1995-05-18 09:02:06 +00:00
if ( c1 - > flags & CHUNK_BAD144 ) {
int ret ;
msgNotify ( " Running bad block scan on partition %s " , c1 - > name ) ;
1995-05-18 22:00:01 +00:00
ret = vsystem ( " bad144 -v /dev/r%s 1234 " , c1 - > name ) ;
1995-05-18 10:43:51 +00:00
if ( ret )
1995-05-28 20:28:15 +00:00
msgConfirm ( " Bad144 init on %s returned status of %d! " , c1 - > name , ret ) ;
1995-05-18 22:00:01 +00:00
ret = vsystem ( " bad144 -v -s /dev/r%s " , c1 - > name ) ;
1995-05-18 09:02:06 +00:00
if ( ret )
1995-05-28 20:28:15 +00:00
msgConfirm ( " Bad144 scan on %s returned status of %d! " , c1 - > name , ret ) ;
1995-05-18 09:02:06 +00:00
}
}
1995-05-16 02:53:31 +00:00
}
1995-06-11 19:33:05 +00:00
if ( ! make_filesystems ( ) ) {
msgConfirm ( " Couldn't make filesystems properly. Aborting. " ) ;
return 0 ;
}
if ( ! copy_self ( ) ) {
msgConfirm ( " Couldn't clone the boot floppy onto the root file system. \n Aborting. " ) ;
return 0 ;
}
1995-05-20 15:47:19 +00:00
dialog_clear ( ) ;
1995-05-20 23:33:14 +00:00
chroot ( " /mnt " ) ;
chdir ( " / " ) ;
1995-05-23 18:06:16 +00:00
variable_set2 ( RUNNING_ON_ROOT , " yes " ) ;
1995-05-28 09:31:44 +00:00
/* stick a helpful shell over on the 4th VTY */
1995-06-11 19:33:05 +00:00
if ( OnVTY & & ! fork ( ) ) {
1995-05-25 18:48:33 +00:00
int i , fd ;
1995-05-29 00:50:05 +00:00
extern int login_tty ( int ) ;
1995-05-25 18:48:33 +00:00
1995-06-11 19:33:05 +00:00
msgDebug ( " Starting an emergency holographic shell over on the 4th screen \n " ) ;
1995-05-25 18:48:33 +00:00
for ( i = 0 ; i < 64 ; i + + )
close ( i ) ;
fd = open ( " /dev/ttyv3 " , O_RDWR ) ;
ioctl ( 0 , TIOCSCTTY , & fd ) ;
dup2 ( 0 , 1 ) ;
dup2 ( 0 , 2 ) ;
1995-06-11 19:33:05 +00:00
if ( login_tty ( fd ) = = - 1 ) {
msgNotify ( " Can't set controlling terminal " ) ;
1995-05-29 00:50:05 +00:00
exit ( 1 ) ;
}
1995-06-11 19:33:05 +00:00
printf ( " Warning: This shell is chroot()'d to /mnt \n " ) ;
1995-05-25 18:48:33 +00:00
execlp ( " sh " , " -sh " , 0 ) ;
exit ( 1 ) ;
}
1995-05-20 08:31:43 +00:00
alreadyDone = TRUE ;
1995-05-25 01:22:20 +00:00
return TRUE ;
1995-05-20 08:31:43 +00:00
}
1995-05-21 15:40:54 +00:00
/*
1995-05-28 09:31:44 +00:00
* What happens when we select " Install " . This is broken into a 3 stage installation so that
1995-05-21 15:40:54 +00:00
* the user can do a full installation but come back here again to load more distributions ,
* perhaps from a different media type . This would allow , for example , the user to load the
* majority of the system from CDROM and then use ftp to load just the DES dist .
*/
1995-05-20 00:13:14 +00:00
int
installCommit ( char * str )
{
1995-06-11 19:33:05 +00:00
Device * * devs ;
int i ;
1995-05-28 09:31:44 +00:00
1995-05-21 15:40:54 +00:00
if ( ! Dists ) {
msgConfirm ( " You haven't told me what distributions to load yet! \n Please select a distribution from the Distributions menu. " ) ;
return 0 ;
}
1995-05-20 11:13:58 +00:00
if ( ! mediaVerify ( ) )
return 0 ;
1995-05-21 15:40:54 +00:00
1995-06-11 19:33:05 +00:00
if ( RunningAsInit & & ! SystemWasInstalled ) {
1995-05-28 09:31:44 +00:00
if ( ! installInitial ( ) )
return 0 ;
configFstab ( ) ;
}
1995-06-11 19:33:05 +00:00
if ( ! SystemWasInstalled & & ! root_extract ( ) ) {
msgConfirm ( " Failed to load the ROOT distribution. Please correct \n this problem and try again. " ) ;
return 0 ;
}
/* If we're about to extract the bin dist again, reset the installed state */
if ( Dists & DIST_BIN )
SystemWasInstalled = FALSE ;
1995-05-18 09:02:06 +00:00
distExtractAll ( ) ;
1995-05-28 09:31:44 +00:00
1995-06-11 19:33:05 +00:00
if ( ! SystemWasInstalled & & access ( " /kernel " , R_OK ) ) {
if ( vsystem ( " ln -f /kernel.GENERIC /kernel " ) ) {
msgConfirm ( " Unable to link /kernel into place! " ) ;
return 0 ;
}
1995-05-28 09:31:44 +00:00
}
1995-05-29 11:01:42 +00:00
1995-06-11 19:33:05 +00:00
/* Resurrect /dev after bin distribution screws it up */
if ( ! SystemWasInstalled ) {
msgNotify ( " Remaking all devices.. Please wait! " ) ;
if ( vsystem ( " cd /dev; sh MAKEDEV all " ) )
msgConfirm ( " MAKEDEV returned non-zero status " ) ;
msgNotify ( " Resurrecting /dev entries for slices.. " ) ;
devs = deviceFind ( NULL , DEVICE_TYPE_DISK ) ;
if ( ! devs )
msgFatal ( " Couldn't get a disk device list! " ) ;
/* Resurrect the slices that the former clobbered */
for ( i = 0 ; devs [ i ] ; i + + ) {
Disk * disk = ( Disk * ) devs [ i ] - > private ;
Chunk * c1 ;
if ( ! disk - > chunks )
msgFatal ( " No chunk list found for %s! " , disk - > name ) ;
for ( c1 = disk - > chunks - > part ; c1 ; c1 = c1 - > next ) {
if ( c1 - > type = = freebsd ) {
msgNotify ( " Making slice entries for %s " , c1 - > name ) ;
if ( vsystem ( " cd /dev; sh MAKEDEV %sh " , c1 - > name ) )
msgConfirm ( " Unable to make slice entries for %s! " , c1 - > name ) ;
}
}
}
}
/* XXX Do all the last ugly work-arounds here which we'll try and excise someday right?? XXX */
/* BOGON #1: XFree86 extracting /usr/X11R6 with root-only perms */
if ( file_readable ( " /usr/X11R6 " ) )
( void ) system ( " chmod 755 /usr/X11R6 " ) ;
/* BOGON #2: We leave /etc in a bad state */
( void ) system ( " chmod 755 /etc " ) ;
dialog_clear ( ) ;
if ( Dists )
msgConfirm ( " Installation completed with some errors. You may wish \n to scroll through the debugging messages on ALT-F2 with the scroll-lock \n feature. Press [ENTER] to return to the installation menu. " ) ;
else
msgConfirm ( " Installation completed successfully, now press [ENTER] to return \n to the main menu. If you have any network devices you have not yet \n configured, see the Interface configuration item on the \n Configuration menu. " ) ;
1995-05-28 09:31:44 +00:00
SystemWasInstalled = TRUE ;
1995-05-20 08:31:43 +00:00
return 0 ;
1995-05-01 21:56:32 +00:00
}
1995-05-06 09:34:24 +00:00
/* Go newfs and/or mount all the filesystems we've been asked to */
1995-06-11 19:33:05 +00:00
static Boolean
1995-05-08 10:20:56 +00:00
make_filesystems ( void )
1995-05-06 09:34:24 +00:00
{
int i ;
1995-05-16 02:53:31 +00:00
Disk * disk ;
1995-05-16 11:37:27 +00:00
Chunk * c1 , * c2 ;
Device * * devs ;
1995-05-22 14:10:25 +00:00
char dname [ 40 ] ;
PartInfo * p = ( PartInfo * ) rootdev - > private ;
1995-06-11 19:33:05 +00:00
Boolean RootReadOnly ;
1995-05-06 09:34:24 +00:00
1995-05-08 06:06:30 +00:00
command_clear ( ) ;
1995-05-16 11:37:27 +00:00
devs = deviceFind ( NULL , DEVICE_TYPE_DISK ) ;
1995-05-16 02:53:31 +00:00
1995-05-22 14:10:25 +00:00
/* First, create and mount the root device */
if ( strcmp ( p - > mountpoint , " / " ) )
msgConfirm ( " Warning: %s is marked as a root partition but is mounted on %s " , rootdev - > name , p - > mountpoint ) ;
1995-05-16 11:37:27 +00:00
1995-05-22 14:10:25 +00:00
if ( p - > newfs ) {
int i ;
1995-05-28 20:28:15 +00:00
sprintf ( dname , " /dev/r%sa " , rootdev - > disk - > name ) ;
1995-05-22 14:10:25 +00:00
msgNotify ( " Making a new root filesystem on %s " , dname ) ;
i = vsystem ( " %s %s " , p - > newfs_cmd , dname ) ;
if ( i ) {
msgConfirm ( " Unable to make new root filesystem! Command returned status %d " , i ) ;
1995-06-11 19:33:05 +00:00
return FALSE ;
1995-05-16 11:37:27 +00:00
}
1995-06-11 19:33:05 +00:00
RootReadOnly = FALSE ;
1995-05-16 11:37:27 +00:00
}
1995-05-24 17:49:20 +00:00
else {
1995-06-11 19:33:05 +00:00
RootReadOnly = TRUE ;
1995-05-22 14:10:25 +00:00
msgConfirm ( " Warning: You have selected a Read-Only root device \n and may be unable to find the appropriate device entries on it \n if it is from an older pre-slice version of FreeBSD. " ) ;
1995-05-28 20:28:15 +00:00
sprintf ( dname , " /dev/r%sa " , rootdev - > disk - > name ) ;
1995-05-24 17:49:20 +00:00
msgNotify ( " Checking integrity of existing %s filesystem " , dname ) ;
i = vsystem ( " fsck -y %s " , dname ) ;
if ( i )
msgConfirm ( " Warning: fsck returned status off %d - this partition may be \n unsafe to use. " , i ) ;
}
1995-05-28 20:28:15 +00:00
sprintf ( dname , " /dev/%sa " , rootdev - > disk - > name ) ;
1995-05-22 14:10:25 +00:00
if ( Mount ( " /mnt " , dname ) ) {
msgConfirm ( " Unable to mount the root file system! Giving up. " ) ;
1995-06-11 19:33:05 +00:00
return FALSE ;
1995-05-22 14:10:25 +00:00
}
1995-05-16 11:37:27 +00:00
1995-05-18 09:02:06 +00:00
/* Now buzz through the rest of the partitions and mount them too */
1995-05-16 11:37:27 +00:00
for ( i = 0 ; devs [ i ] ; i + + ) {
1995-05-28 20:28:15 +00:00
if ( ! devs [ i ] - > enabled )
continue ;
1995-05-16 11:37:27 +00:00
disk = ( Disk * ) devs [ i ] - > private ;
1995-06-11 19:33:05 +00:00
if ( ! disk - > chunks ) {
msgConfirm ( " No chunk list found for %s! " , disk - > name ) ;
return FALSE ;
}
1995-05-17 14:40:00 +00:00
1995-05-16 11:37:27 +00:00
/* Make the proper device mount points in /mnt/dev */
1995-06-11 19:33:05 +00:00
if ( ! ( RootReadOnly & & disk = = rootdev - > disk ) ) {
Mkdir ( " /mnt/dev " , NULL ) ;
MakeDevDisk ( disk , " /mnt/dev " ) ;
}
1995-05-16 11:37:27 +00:00
for ( c1 = disk - > chunks - > part ; c1 ; c1 = c1 - > next ) {
if ( c1 - > type = = freebsd ) {
for ( c2 = c1 - > part ; c2 ; c2 = c2 - > next ) {
if ( c2 - > type = = part & & c2 - > subtype ! = FS_SWAP & & c2 - > private ) {
1995-05-08 06:06:30 +00:00
PartInfo * tmp = ( PartInfo * ) c2 - > private ;
1995-05-16 11:37:27 +00:00
if ( ! strcmp ( tmp - > mountpoint , " / " ) )
continue ;
1995-05-08 06:06:30 +00:00
if ( tmp - > newfs )
1995-05-22 14:10:25 +00:00
command_shell_add ( tmp - > mountpoint , " %s /mnt/dev/r%s " , tmp - > newfs_cmd , c2 - > name ) ;
1995-05-24 17:49:20 +00:00
else
command_shell_add ( tmp - > mountpoint , " fsck -y /mnt/dev/r%s " , c2 - > name ) ;
1995-05-16 02:53:31 +00:00
command_func_add ( tmp - > mountpoint , Mount , c2 - > name ) ;
1995-05-08 06:06:30 +00:00
}
1995-05-22 14:10:25 +00:00
else if ( c2 - > type = = part & & c2 - > subtype = = FS_SWAP ) {
char fname [ 80 ] ;
int i ;
sprintf ( fname , " /mnt/dev/%s " , c2 - > name ) ;
i = swapon ( fname ) ;
if ( ! i )
msgNotify ( " Added %s as a swap device " , fname ) ;
else
msgConfirm ( " Unable to add %s as a swap device: %s " , fname , strerror ( errno ) ) ;
}
1995-05-06 09:34:24 +00:00
}
}
1995-06-11 19:33:05 +00:00
else if ( c1 - > type = = fat & & c1 - > private & & ! RootReadOnly ) {
char name [ FILENAME_MAX ] ;
1995-05-24 17:49:20 +00:00
1995-06-11 19:33:05 +00:00
sprintf ( name , " /mnt%s " , ( ( PartInfo * ) c1 - > private ) - > mountpoint ) ;
Mkdir ( name , NULL ) ;
1995-05-24 17:49:20 +00:00
}
1995-05-06 09:34:24 +00:00
}
}
1995-06-11 19:33:05 +00:00
/* Copy the boot floppy's dev files */
if ( vsystem ( " find -x /dev | cpio -pdmV /mnt " ) ) {
msgConfirm ( " Couldn't clone the /dev files! " ) ;
return FALSE ;
}
1995-05-08 06:06:30 +00:00
command_sort ( ) ;
command_execute ( ) ;
1995-06-11 19:33:05 +00:00
return TRUE ;
1995-05-06 09:34:24 +00:00
}
1995-05-19 15:56:02 +00:00
/* Copy the boot floppy contents into /stand */
1995-06-11 19:33:05 +00:00
static Boolean
1995-05-19 15:56:02 +00:00
copy_self ( void )
{
int i ;
1995-05-23 02:41:18 +00:00
msgWeHaveOutput ( " Copying the boot floppy to /stand on root filesystem " ) ;
1995-05-27 23:39:35 +00:00
i = vsystem ( " find -x /stand | cpio -pdmV /mnt " ) ;
1995-06-11 19:33:05 +00:00
if ( i ) {
1995-05-19 15:56:02 +00:00
msgConfirm ( " Copy returned error status of %d! " , i ) ;
1995-06-11 19:33:05 +00:00
return FALSE ;
}
1995-05-28 23:12:09 +00:00
/* Copy the /etc files into their rightful place */
1995-06-11 19:33:05 +00:00
if ( vsystem ( " cd /mnt/stand; find etc | cpio -pdmV /mnt " ) ) {
msgConfirm ( " Couldn't copy up the /etc files! " ) ;
return TRUE ;
}
return TRUE ;
1995-05-19 15:56:02 +00:00
}
1995-06-11 19:33:05 +00:00
static Boolean loop_on_root_floppy ( void ) ;
1995-05-24 17:49:20 +00:00
1995-06-11 19:33:05 +00:00
static Boolean
1995-05-25 18:48:33 +00:00
root_extract ( void )
1995-05-06 09:34:24 +00:00
{
1995-05-27 10:47:44 +00:00
int fd ;
1995-06-11 19:33:05 +00:00
static Boolean alreadyExtracted = FALSE ;
if ( alreadyExtracted )
return TRUE ;
1995-05-24 09:00:58 +00:00
1995-05-26 08:41:52 +00:00
if ( mediaDevice ) {
1995-06-11 19:33:05 +00:00
if ( isDebug ( ) )
msgDebug ( " Attempting to extract root image from %s device \n " , mediaDevice - > description ) ;
1995-05-26 08:41:52 +00:00
switch ( mediaDevice - > type ) {
1995-05-30 05:50:53 +00:00
case DEVICE_TYPE_FLOPPY :
1995-06-11 19:33:05 +00:00
alreadyExtracted = loop_on_root_floppy ( ) ;
1995-05-30 05:50:53 +00:00
break ;
default :
1995-06-11 19:33:05 +00:00
if ( ! ( * mediaDevice - > init ) ( mediaDevice ) )
break ;
fd = ( * mediaDevice - > get ) ( mediaDevice , " floppies/root.flp " , NULL ) ;
if ( fd < 0 ) {
msgConfirm ( " Couldn't get root image from %s! \n Will try to get it from floppy. " , mediaDevice - > name ) ;
( * mediaDevice - > shutdown ) ( mediaDevice ) ;
alreadyExtracted = loop_on_root_floppy ( ) ;
1995-05-29 13:37:43 +00:00
}
else {
1995-06-11 19:33:05 +00:00
msgNotify ( " Loading root image from %s " , mediaDevice - > name ) ;
alreadyExtracted = mediaExtractDist ( " / " , fd ) ;
( * mediaDevice - > close ) ( mediaDevice , fd ) ;
1995-05-20 08:31:43 +00:00
}
1995-05-26 08:41:52 +00:00
break ;
1995-05-20 08:31:43 +00:00
}
}
else
1995-06-11 19:33:05 +00:00
alreadyExtracted = loop_on_root_floppy ( ) ;
return alreadyExtracted ;
1995-05-26 08:41:52 +00:00
}
1995-06-11 19:33:05 +00:00
static Boolean
1995-05-26 08:41:52 +00:00
loop_on_root_floppy ( void )
{
int fd ;
1995-06-11 19:33:05 +00:00
int status = FALSE ;
1995-05-26 08:41:52 +00:00
1995-05-29 11:01:42 +00:00
while ( 1 ) {
fd = getRootFloppy ( ) ;
if ( fd ! = - 1 ) {
1995-06-11 19:33:05 +00:00
msgNotify ( " Extracting root floppy.. " ) ;
status = mediaExtractDist ( " / " , fd ) ;
close ( fd ) ;
1995-05-29 11:01:42 +00:00
break ;
}
}
1995-06-11 19:33:05 +00:00
return status ;
1995-05-06 09:34:24 +00:00
}