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