1 /* $NetBSD: md.c,v 1.3 2015/01/02 19:43:13 abs Exp $ */ 2 3 /* 4 * Copyright 1997 Piermont Information Systems Inc. 5 * All rights reserved. 6 * 7 * Based on code written by Philip A. Nelson for Piermont Information 8 * Systems Inc. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. The name of Piermont Information Systems Inc. may not be used to endorse 19 * or promote products derived from this software without specific prior 20 * written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS'' 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 32 * THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 /* md.c -- news68k machine specific routines */ 36 37 #include <sys/types.h> 38 #include <sys/disklabel.h> 39 #include <sys/ioctl.h> 40 #include <sys/param.h> 41 #include <stdio.h> 42 #include <curses.h> 43 #include <unistd.h> 44 #include <fcntl.h> 45 #include <util.h> 46 47 #include "defs.h" 48 #include "md.h" 49 #include "msg_defs.h" 50 #include "menu_defs.h" 51 52 void 53 md_init(void) 54 { 55 } 56 57 void 58 md_init_set_status(int flags) 59 { 60 61 (void)flags; 62 } 63 64 int 65 md_get_info(void) 66 { 67 struct disklabel disklabel; 68 int fd; 69 char dev_name[100]; 70 71 snprintf(dev_name, sizeof(dev_name), "/dev/r%sc", pm->diskdev); 72 73 fd = open(dev_name, O_RDONLY, 0); 74 if (fd < 0) { 75 endwin(); 76 fprintf(stderr, "Can't open %s\n", dev_name); 77 exit(1); 78 } 79 if (ioctl(fd, DIOCGDINFO, &disklabel) == -1) { 80 endwin(); 81 fprintf(stderr, "Can't read disklabel on %s.\n", dev_name); 82 close(fd); 83 exit(1); 84 } 85 close(fd); 86 87 pm->dlcyl = disklabel.d_ncylinders; 88 pm->dlhead = disklabel.d_ntracks; 89 pm->dlsec = disklabel.d_nsectors; 90 pm->sectorsize = disklabel.d_secsize; 91 pm->dlcylsize = disklabel.d_secpercyl; 92 93 /* 94 * Compute whole disk size. Take max of (pm->dlcyl*pm->dlhead*pm->dlsec) 95 * and secperunit, just in case the disk is already labelled. 96 * (If our new label's RAW_PART size ends up smaller than the 97 * in-core RAW_PART size value, updating the label will fail.) 98 */ 99 pm->dlsize = pm->dlcyl * pm->dlhead * pm->dlsec; 100 if (disklabel.d_secperunit > pm->dlsize) 101 pm->dlsize = disklabel.d_secperunit; 102 103 return 1; 104 } 105 106 /* 107 * md back-end code for menu-driven BSD disklabel editor. 108 */ 109 int 110 md_make_bsd_partitions(void) 111 { 112 113 return make_bsd_partitions(); 114 } 115 116 /* 117 * any additional partition validation 118 */ 119 int 120 md_check_partitions(void) 121 { 122 123 return 1; 124 } 125 126 /* 127 * hook called before writing new disklabel. 128 */ 129 int 130 md_pre_disklabel(void) 131 { 132 133 return 0; 134 } 135 136 /* 137 * hook called after writing disklabel to new target disk. 138 */ 139 int 140 md_post_disklabel(void) 141 { 142 return 0; 143 } 144 145 /* 146 * hook called after upgrade() or install() has finished setting 147 * up the target disk but immediately before the user is given the 148 * ``disks are now set up'' message. 149 * 150 * On the news68k, we use this opportunity to install the boot blocks. 151 */ 152 int 153 md_post_newfs(void) 154 { 155 const char *bootfile = "/boot"; 156 157 msg_display(MSG_dobootblks, pm->diskdev); 158 cp_to_target("/usr/mdec/boot", bootfile); 159 sync(); 160 run_program(RUN_DISPLAY, "/usr/sbin/installboot /dev/r%sc %s %s", 161 pm->diskdev, "/usr/mdec/bootxx", bootfile); 162 return 0; 163 } 164 165 int 166 md_post_extract(void) 167 { 168 169 return 0; 170 } 171 172 void 173 md_cleanup_install(void) 174 { 175 176 #ifndef DEBUG 177 enable_rc_conf(); 178 #endif 179 } 180 181 int 182 md_pre_update(void) 183 { 184 185 return 1; 186 } 187 188 /* Upgrade support */ 189 int 190 md_update(void) 191 { 192 193 md_post_newfs(); 194 return 1; 195 } 196 197 int 198 md_pre_mount() 199 { 200 return 0; 201 } 202