1 1.21 tsutsui /* $NetBSD: upgrade.c,v 1.21 2022/06/24 22:05:24 tsutsui 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 /* upgrade.c -- upgrade an installation. */ 36 1.1 dholland 37 1.1 dholland #include <sys/param.h> 38 1.1 dholland #include <stdio.h> 39 1.1 dholland #include <curses.h> 40 1.1 dholland #include <errno.h> 41 1.1 dholland #include "defs.h" 42 1.1 dholland #include "msg_defs.h" 43 1.1 dholland #include "menu_defs.h" 44 1.1 dholland 45 1.1 dholland /* 46 1.1 dholland * local prototypes 47 1.1 dholland */ 48 1.1 dholland static int save_X(const char *); 49 1.1 dholland static int merge_X(const char *); 50 1.1 dholland 51 1.1 dholland /* 52 1.1 dholland * Do the system upgrade. 53 1.1 dholland */ 54 1.1 dholland void 55 1.1 dholland do_upgrade(void) 56 1.1 dholland { 57 1.12 martin struct install_partition_desc install = {}; 58 1.2 martin int retcode = 0; 59 1.2 martin partman_go = 0; 60 1.1 dholland 61 1.1 dholland msg_display(MSG_upgradeusure); 62 1.4 martin if (!ask_noyes(NULL)) 63 1.1 dholland return; 64 1.1 dholland 65 1.13 martin if (find_disks(msg_string(MSG_upgrade), !root_is_read_only()) < 0) 66 1.1 dholland return; 67 1.1 dholland 68 1.15 martin if (pm->parts == NULL && !pm->cur_system && !pm->no_part) { 69 1.10 martin hit_enter_to_continue(MSG_noroot, NULL); 70 1.10 martin return; 71 1.10 martin } 72 1.10 martin 73 1.15 martin if (!pm->cur_system && pm->parts != NULL) { 74 1.12 martin if (pm->parts->pscheme->pre_update_verify) { 75 1.12 martin if (pm->parts->pscheme->pre_update_verify(pm->parts)) 76 1.12 martin pm->parts->pscheme->write_to_disk(pm->parts); 77 1.12 martin } 78 1.12 martin 79 1.12 martin install_desc_from_parts(&install, pm->parts); 80 1.15 martin } else if (pm->cur_system) { 81 1.12 martin install.cur_system = true; 82 1.7 martin } 83 1.7 martin 84 1.18 martin set_swap_if_low_ram(&install); 85 1.9 martin 86 1.7 martin if (md_pre_update(&install) < 0) 87 1.7 martin goto free_install; 88 1.1 dholland 89 1.7 martin if (mount_disks(&install) != 0) 90 1.7 martin goto free_install; 91 1.1 dholland 92 1.1 dholland 93 1.1 dholland /* 94 1.1 dholland * Save X symlink, ... 95 1.1 dholland */ 96 1.1 dholland if (save_X("/usr/X11R6")) 97 1.7 martin goto free_install; 98 1.1 dholland if (save_X("/usr/X11R7")) 99 1.7 martin goto free_install; 100 1.1 dholland 101 1.1 dholland #ifdef AOUT2ELF 102 1.1 dholland move_aout_libs(); 103 1.1 dholland #endif 104 1.1 dholland /* Do any md updating of the file systems ... e.g. bootblocks, 105 1.1 dholland copy file systems ... */ 106 1.7 martin if (!md_update(&install)) 107 1.7 martin goto free_install; 108 1.1 dholland 109 1.1 dholland wrefresh(curscr); 110 1.1 dholland wmove(stdscr, 0, 0); 111 1.1 dholland wclear(stdscr); 112 1.1 dholland wrefresh(stdscr); 113 1.1 dholland 114 1.1 dholland /* Done with disks. Ready to get and unpack tarballs. */ 115 1.2 martin process_menu(MENU_distset, &retcode); 116 1.2 martin if (retcode == 0) 117 1.7 martin goto free_install; 118 1.1 dholland if (get_and_unpack_sets(1, MSG_disksetupdoneupdate, 119 1.1 dholland MSG_upgrcomplete, MSG_abortupgr) != 0) 120 1.7 martin goto free_install; 121 1.1 dholland 122 1.19 martin if (md_post_extract(&install, true)) 123 1.7 martin goto free_install; 124 1.1 dholland 125 1.1 dholland merge_X("/usr/X11R6"); 126 1.1 dholland merge_X("/usr/X11R7"); 127 1.1 dholland 128 1.20 martin #if CHECK_ENTROPY 129 1.20 martin do_add_entropy(); 130 1.20 martin #endif 131 1.20 martin 132 1.1 dholland sanity_check(); 133 1.7 martin 134 1.7 martin free_install: 135 1.7 martin free_install_desc(&install); 136 1.1 dholland } 137 1.1 dholland 138 1.1 dholland /* 139 1.1 dholland * Save X symlink to X.old so it can be recovered later 140 1.1 dholland */ 141 1.1 dholland static int 142 1.1 dholland save_X(const char *xroot) 143 1.1 dholland { 144 1.1 dholland char newx[MAXPATHLEN], oldx[MAXPATHLEN]; 145 1.1 dholland 146 1.1 dholland strlcpy(newx, xroot, sizeof(newx)); 147 1.1 dholland strlcat(newx, "/bin/X", sizeof(newx)); 148 1.1 dholland strlcpy(oldx, newx, sizeof(oldx)); 149 1.1 dholland strlcat(oldx, ".old", sizeof(oldx)); 150 1.1 dholland 151 1.1 dholland /* Only care for X if it's a symlink */ 152 1.1 dholland if (target_symlink_exists_p(newx)) { 153 1.1 dholland if (target_symlink_exists_p(oldx)) { 154 1.8 christos msg_fmt_display(MSG_X_oldexists, 155 1.8 christos "%s%s%s%s%s%s%s%s%s%s%s", 156 1.1 dholland xroot, xroot, xroot, xroot, xroot, xroot, xroot, 157 1.8 christos xroot, xroot, xroot, xroot); 158 1.7 martin hit_enter_to_continue(NULL, NULL); 159 1.1 dholland return EEXIST; 160 1.1 dholland } 161 1.1 dholland 162 1.1 dholland #ifdef DEBUG 163 1.1 dholland printf("saving %s as %s ...", newx, oldx); 164 1.1 dholland #endif 165 1.1 dholland 166 1.1 dholland /* Move target .../X to .../X.old. Abort on error. */ 167 1.1 dholland mv_within_target_or_die(newx, oldx); 168 1.1 dholland } 169 1.1 dholland 170 1.1 dholland return 0; 171 1.1 dholland } 172 1.1 dholland 173 1.1 dholland /* 174 1.1 dholland * Merge back saved target X files after unpacking the new 175 1.1 dholland * sets has completed. 176 1.1 dholland */ 177 1.1 dholland static int 178 1.1 dholland merge_X(const char *xroot) 179 1.1 dholland { 180 1.1 dholland char newx[MAXPATHLEN], oldx[MAXPATHLEN]; 181 1.1 dholland 182 1.1 dholland strlcpy(newx, xroot, sizeof(newx)); 183 1.1 dholland strlcat(newx, "/bin/X", sizeof(newx)); 184 1.1 dholland strlcpy(oldx, newx, sizeof(oldx)); 185 1.1 dholland strlcat(oldx, ".old", sizeof(oldx)); 186 1.1 dholland 187 1.1 dholland if (target_symlink_exists_p(oldx)) { 188 1.1 dholland /* Only move back X if it's a symlink - we don't want 189 1.1 dholland * to restore old binaries */ 190 1.1 dholland mv_within_target_or_die(oldx, newx); 191 1.1 dholland } 192 1.1 dholland 193 1.1 dholland return 0; 194 1.1 dholland } 195 1.1 dholland 196 1.1 dholland /* 197 1.1 dholland * Unpacks sets, clobbering existing contents. 198 1.1 dholland */ 199 1.1 dholland void 200 1.21 tsutsui do_reinstall_sets(void) 201 1.1 dholland { 202 1.12 martin struct install_partition_desc install = {}; 203 1.2 martin int retcode = 0; 204 1.11 martin partman_go = 0; 205 1.1 dholland 206 1.1 dholland unwind_mounts(); 207 1.1 dholland msg_display(MSG_reinstallusure); 208 1.4 martin if (!ask_noyes(NULL)) 209 1.1 dholland return; 210 1.1 dholland 211 1.13 martin if (find_disks(msg_string(MSG_reinstall), !root_is_read_only()) < 0) 212 1.1 dholland return; 213 1.1 dholland 214 1.16 martin if (!pm->cur_system && pm->parts != NULL) { 215 1.12 martin install_desc_from_parts(&install, pm->parts); 216 1.16 martin } else if (pm->cur_system) { 217 1.12 martin install.cur_system = true; 218 1.11 martin } 219 1.11 martin 220 1.11 martin if (mount_disks(&install) != 0) 221 1.11 martin goto free_install; 222 1.1 dholland 223 1.1 dholland /* Unpack the distribution. */ 224 1.2 martin process_menu(MENU_distset, &retcode); 225 1.2 martin if (retcode == 0) 226 1.11 martin goto free_install; 227 1.1 dholland if (get_and_unpack_sets(0, NULL, MSG_unpackcomplete, MSG_abortunpack) != 0) 228 1.11 martin goto free_install; 229 1.1 dholland 230 1.20 martin #if CHECK_ENTROPY 231 1.20 martin do_add_entropy(); 232 1.20 martin #endif 233 1.20 martin 234 1.1 dholland sanity_check(); 235 1.11 martin 236 1.11 martin free_install: 237 1.11 martin free_install_desc(&install); 238 1.1 dholland } 239