Home | History | Annotate | Line # | Download | only in sysinst
install.c revision 1.8
      1  1.8  christos /*	$NetBSD: install.c,v 1.8 2019/06/20 00:43:55 christos Exp $	*/
      2  1.1  dholland 
      3  1.1  dholland /*
      4  1.1  dholland  * Copyright 1997 Piermont Information Systems Inc.
      5  1.1  dholland  * All rights reserved.
      6  1.1  dholland  *
      7  1.1  dholland  * Written by Philip A. Nelson for Piermont Information Systems Inc.
      8  1.1  dholland  *
      9  1.1  dholland  * Redistribution and use in source and binary forms, with or without
     10  1.1  dholland  * modification, are permitted provided that the following conditions
     11  1.1  dholland  * are met:
     12  1.1  dholland  * 1. Redistributions of source code must retain the above copyright
     13  1.1  dholland  *    notice, this list of conditions and the following disclaimer.
     14  1.1  dholland  * 2. Redistributions in binary form must reproduce the above copyright
     15  1.1  dholland  *    notice, this list of conditions and the following disclaimer in the
     16  1.1  dholland  *    documentation and/or other materials provided with the distribution.
     17  1.1  dholland  * 3. The name of Piermont Information Systems Inc. may not be used to endorse
     18  1.1  dholland  *    or promote products derived from this software without specific prior
     19  1.1  dholland  *    written permission.
     20  1.1  dholland  *
     21  1.1  dholland  * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
     22  1.1  dholland  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  1.1  dholland  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  1.1  dholland  * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
     25  1.1  dholland  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     26  1.1  dholland  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     27  1.1  dholland  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     28  1.1  dholland  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     29  1.1  dholland  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     30  1.1  dholland  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     31  1.1  dholland  * THE POSSIBILITY OF SUCH DAMAGE.
     32  1.1  dholland  *
     33  1.1  dholland  */
     34  1.1  dholland 
     35  1.1  dholland /* install.c -- system installation. */
     36  1.1  dholland 
     37  1.1  dholland #include <stdio.h>
     38  1.1  dholland #include <curses.h>
     39  1.1  dholland #include "defs.h"
     40  1.1  dholland #include "msg_defs.h"
     41  1.1  dholland #include "menu_defs.h"
     42  1.1  dholland 
     43  1.6    martin /*
     44  1.6    martin  * helper function: call the md pre/post disklabel callback for all involved
     45  1.6    martin  * inner partitions and write them back.
     46  1.6    martin  * return net result
     47  1.6    martin  */
     48  1.6    martin static bool
     49  1.6    martin write_all_parts(struct install_partition_desc *install)
     50  1.6    martin {
     51  1.6    martin 	struct disk_partitions **allparts, *parts;
     52  1.6    martin 	size_t num_parts, i, j;
     53  1.6    martin 	bool found, res;
     54  1.6    martin 
     55  1.6    martin 	/* pessimistic assumption: all partitions on different devices */
     56  1.6    martin 	allparts = calloc(install->num, sizeof(*allparts));
     57  1.6    martin 	if (allparts == NULL)
     58  1.6    martin 		return false;
     59  1.6    martin 
     60  1.6    martin 	/* collect all different partition sets */
     61  1.6    martin 	num_parts = 0;
     62  1.6    martin 	for (i = 0; i < install->num; i++) {
     63  1.6    martin 		parts = install->infos[i].parts;
     64  1.6    martin 		if (parts == NULL)
     65  1.6    martin 			continue;
     66  1.6    martin 		found = false;
     67  1.6    martin 		for (j = 0; j < num_parts; j++) {
     68  1.6    martin 			if (allparts[j] == parts) {
     69  1.6    martin 				found = true;
     70  1.6    martin 				break;
     71  1.6    martin 			}
     72  1.6    martin 		}
     73  1.6    martin 		if (found)
     74  1.6    martin 			continue;
     75  1.6    martin 		allparts[num_parts++] = parts;
     76  1.6    martin 	}
     77  1.6    martin 
     78  1.6    martin 	/* do four phases, abort anytime and go out, returning res */
     79  1.6    martin 
     80  1.6    martin 	res = true;
     81  1.6    martin 
     82  1.6    martin 	/* phase 1: pre disklabel - used to write MBR and similar */
     83  1.6    martin 	for (i = 0; i < num_parts; i++) {
     84  1.6    martin 		if (!md_pre_disklabel(install, allparts[i])) {
     85  1.6    martin 			res = false;
     86  1.6    martin 			goto out;
     87  1.6    martin 		}
     88  1.6    martin 	}
     89  1.6    martin 
     90  1.6    martin 	/* phase 2: write our partitions (used to be: disklabel) */
     91  1.6    martin 	for (i = 0; i < num_parts; i++) {
     92  1.6    martin 		if (!allparts[i]->pscheme->write_to_disk(allparts[i])) {
     93  1.6    martin 			res = false;
     94  1.6    martin 			goto out;
     95  1.6    martin 		}
     96  1.6    martin 	}
     97  1.6    martin 
     98  1.6    martin 	/* phase 3: now we may have a first chance to enable swap space */
     99  1.6    martin 	set_swap_if_low_ram(install);
    100  1.6    martin 
    101  1.6    martin 	/* phase 4: post disklabel (used for updating boot loaders) */
    102  1.6    martin 	for (i = 0; i < num_parts; i++) {
    103  1.6    martin 		if (!md_post_disklabel(install, allparts[i])) {
    104  1.6    martin 			res = false;
    105  1.6    martin 			goto out;
    106  1.6    martin 		}
    107  1.6    martin 	}
    108  1.6    martin 
    109  1.6    martin out:
    110  1.6    martin 	free(allparts);
    111  1.6    martin 
    112  1.6    martin 	return res;
    113  1.6    martin }
    114  1.6    martin 
    115  1.1  dholland /* Do the system install. */
    116  1.1  dholland 
    117  1.1  dholland void
    118  1.1  dholland do_install(void)
    119  1.1  dholland {
    120  1.2    martin 	int find_disks_ret;
    121  1.2    martin 	int retcode = 0;
    122  1.6    martin 	struct install_partition_desc install;
    123  1.6    martin 	struct disk_partitions *parts;
    124  1.6    martin 
    125  1.5       rin #ifndef NO_PARTMAN
    126  1.2    martin 	partman_go = -1;
    127  1.5       rin #else
    128  1.5       rin 	partman_go = 0;
    129  1.5       rin #endif
    130  1.1  dholland 
    131  1.2    martin #ifndef DEBUG
    132  1.1  dholland 	msg_display(MSG_installusure);
    133  1.4    martin 	if (!ask_noyes(NULL))
    134  1.1  dholland 		return;
    135  1.2    martin #endif
    136  1.1  dholland 
    137  1.6    martin 	memset(&install, 0, sizeof install);
    138  1.6    martin 
    139  1.1  dholland 	get_ramsize();
    140  1.1  dholland 
    141  1.2    martin 	/* Create and mount partitions */
    142  1.2    martin 	find_disks_ret = find_disks(msg_string(MSG_install));
    143  1.2    martin 	if (partman_go == 1) {
    144  1.2    martin 		if (partman() < 0) {
    145  1.6    martin 			hit_enter_to_continue(MSG_abort_part, NULL);
    146  1.2    martin 			return;
    147  1.2    martin 		}
    148  1.2    martin 	} else if (find_disks_ret < 0)
    149  1.1  dholland 		return;
    150  1.2    martin 	else {
    151  1.2    martin 	/* Classical partitioning wizard */
    152  1.2    martin 		partman_go = 0;
    153  1.2    martin 		clear();
    154  1.2    martin 		refresh();
    155  1.1  dholland 
    156  1.2    martin 		if (check_swap(pm->diskdev, 0) > 0) {
    157  1.6    martin 			hit_enter_to_continue(MSG_swapactive, NULL);
    158  1.2    martin 			if (check_swap(pm->diskdev, 1) < 0) {
    159  1.6    martin 				hit_enter_to_continue(MSG_swapdelfailed, NULL);
    160  1.2    martin 				if (!debug)
    161  1.2    martin 					return;
    162  1.2    martin 			}
    163  1.1  dholland 		}
    164  1.1  dholland 
    165  1.6    martin 		if (!md_get_info(&install) ||
    166  1.6    martin 		    !md_make_bsd_partitions(&install)) {
    167  1.6    martin 			hit_enter_to_continue(MSG_abort_inst, NULL);
    168  1.2    martin 			return;
    169  1.2    martin 		}
    170  1.1  dholland 
    171  1.2    martin 		/* Last chance ... do you really want to do this? */
    172  1.2    martin 		clear();
    173  1.2    martin 		refresh();
    174  1.8  christos 		msg_fmt_display(MSG_lastchance, "%s", pm->diskdev);
    175  1.4    martin 		if (!ask_noyes(NULL))
    176  1.2    martin 			return;
    177  1.2    martin 
    178  1.6    martin 		/*
    179  1.6    martin 		 * Check if we have a secondary partitioning and
    180  1.6    martin 		 * use that if available. The MD code will typically
    181  1.6    martin 		 * have written the outer partitioning in md_pre_disklabel.
    182  1.6    martin 		 */
    183  1.6    martin 		parts = pm->parts;
    184  1.6    martin 		if (!pm->no_part && parts != NULL) {
    185  1.6    martin 			if (parts->pscheme->secondary_scheme != NULL &&
    186  1.6    martin 			    parts->pscheme->secondary_partitions != NULL) {
    187  1.6    martin 				parts = parts->pscheme->secondary_partitions(
    188  1.7    martin 				    parts, pm->ptstart, false);
    189  1.6    martin 				if (parts == NULL)
    190  1.6    martin 					parts = pm->parts;
    191  1.6    martin 			}
    192  1.6    martin 		}
    193  1.6    martin 		if ((!pm->no_part && !write_all_parts(&install)) ||
    194  1.6    martin 		    make_filesystems(&install) ||
    195  1.6    martin 		    make_fstab(&install) != 0 ||
    196  1.6    martin 		    md_post_newfs(&install) != 0)
    197  1.6    martin 		return;
    198  1.1  dholland 	}
    199  1.1  dholland 
    200  1.2    martin 	/* Unpack the distribution. */
    201  1.2    martin 	process_menu(MENU_distset, &retcode);
    202  1.2    martin 	if (retcode == 0)
    203  1.1  dholland 		return;
    204  1.1  dholland 	if (get_and_unpack_sets(0, MSG_disksetupdone,
    205  1.1  dholland 	    MSG_extractcomplete, MSG_abortinst) != 0)
    206  1.1  dholland 		return;
    207  1.1  dholland 
    208  1.6    martin 	if (md_post_extract(&install) != 0)
    209  1.1  dholland 		return;
    210  1.1  dholland 
    211  1.6    martin 	do_configmenu(&install);
    212  1.1  dholland 
    213  1.1  dholland 	sanity_check();
    214  1.1  dholland 
    215  1.6    martin 	md_cleanup_install(&install);
    216  1.6    martin 
    217  1.6    martin 	free(install.infos);
    218  1.1  dholland 
    219  1.6    martin 	hit_enter_to_continue(MSG_instcomplete, NULL);
    220  1.1  dholland }
    221